From c05444ad1e38e40a01d35b20a8c4005d23965659 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Mon, 23 Jan 2012 05:03:52 +0000 Subject: [PATCH] - GUI RPC: switching to the new XML parser (which won't parse a double as an int) revealed a type mismatch in FILE_TRANSFER::next_request_time between client and server. svn path=/trunk/boinc/; revision=25125 --- checkin_notes | 20 +++++++++++ client/net_stats.cpp | 3 ++ db/boinc_db.cpp | 67 +++++++++++++++++++++++++++++++++++ db/boinc_db.h | 35 ++++++++++++++++++ db/schema_vda.sql | 27 ++++++++++++++ lib/gui_rpc_client.h | 4 +-- lib/gui_rpc_client_ops.cpp | 4 +-- ssim/makefile | 15 ++++---- ssim/{vda.cpp => vda_lib.cpp} | 0 ssim/{vda.h => vda_lib.h} | 0 ssim/vda_transitioner.cpp | 51 ++++++++++++++++++++++++++ 11 files changed, 216 insertions(+), 10 deletions(-) create mode 100644 db/schema_vda.sql rename ssim/{vda.cpp => vda_lib.cpp} (100%) rename ssim/{vda.h => vda_lib.h} (100%) create mode 100644 ssim/vda_transitioner.cpp diff --git a/checkin_notes b/checkin_notes index 66216f41d8..35aa2fe3fb 100644 --- a/checkin_notes +++ b/checkin_notes @@ -863,3 +863,23 @@ Rom 21 Jan 2012 sched/ sched_customize.cpp + +David 22 Jan 2012 + - GUI RPC: switching to the new XML parser + (which won't parse a double as an int) + revealed a type mismatch in FILE_TRANSFER::next_request_time + between client and server. + + db/ + boinc_db.cpp,h + schema_vda.sql (new) + lib/ + gui_rpc_client_ops.cpp + gui_rpc_client.h + ssim/ + vda.cpp + vda_lib.cpp,h + vda_transitioner.cpp + makefile + client/ + net_stats.cpp diff --git a/client/net_stats.cpp b/client/net_stats.cpp index 6498450474..e42e4f2801 100644 --- a/client/net_stats.cpp +++ b/client/net_stats.cpp @@ -420,6 +420,9 @@ void DAILY_XFER_HISTORY::totals(int ndays, double& up, double& down) { } } +// tell the scheduler how much we've used in the quota period +// (currently not used by scheduler) +// void DAILY_XFER_HISTORY::write_scheduler_request(MIOFILE& mf, int ndays) { double up, down; totals(ndays, up, down); diff --git a/db/boinc_db.cpp b/db/boinc_db.cpp index 0caaa1be72..a3e8c357d0 100644 --- a/db/boinc_db.cpp +++ b/db/boinc_db.cpp @@ -86,6 +86,8 @@ void SCHED_TRIGGER_ITEM::clear() { working_set_removal = false; } void FILESET_SCHED_TRIGGER_ITEM::clear() {memset(this, 0, sizeof(*this));} +void VDA_FILE::clear() {memset(this, 0, sizeof(*this));} +void VDA_CHUNK_HOST::clear() {memset(this, 0, sizeof(*this));} DB_PLATFORM::DB_PLATFORM(DB_CONN* dc) : DB_BASE("platform", dc?dc:&boinc_db){} @@ -147,6 +149,10 @@ DB_FILESET_SCHED_TRIGGER_ITEM::DB_FILESET_SCHED_TRIGGER_ITEM(DB_CONN* dc) : DB_BASE_SPECIAL(dc?dc:&boinc_db){} DB_FILESET_SCHED_TRIGGER_ITEM_SET::DB_FILESET_SCHED_TRIGGER_ITEM_SET(DB_CONN* dc) : DB_BASE_SPECIAL(dc?dc:&boinc_db){} +DB_VDA_FILE::DB_VDA_FILE(DB_CONN* dc) : + DB_BASE("vda_file", dc?dc:&boinc_db){} +DB_VDA_CHUNK_HOST::DB_VDA_CHUNK_HOST(DB_CONN* dc) : + DB_BASE("vda_chunk_host", dc?dc:&boinc_db){} int DB_PLATFORM::get_id() {return id;} int DB_APP::get_id() {return id;} @@ -163,6 +169,7 @@ int DB_STATE_COUNTS::get_id() {return appid;} int DB_FILE::get_id() {return id;} int DB_FILESET::get_id() {return id;} int DB_SCHED_TRIGGER::get_id() {return id;} +int DB_VDA_FILE::get_id() {return id;} void DB_PLATFORM::db_print(char* buf){ sprintf(buf, @@ -2320,4 +2327,64 @@ int DB_FILESET_SCHED_TRIGGER_ITEM_SET::contains_trigger(const char* fileset_name return 0; } +void DB_VDA_FILE::db_print(char* buf){ + sprintf(buf, + "dir='%s', " + "name='%s', " + "size=%f, " + "chunk_size=%f, " + "created=%f, " + "need_update=%d", + dir, + name, + size, + chunk_size, + created, + need_update?1:0 + ); +} + +void DB_VDA_FILE::db_parse(MYSQL_ROW &r) { + int i=0; + clear(); + id = atoi(r[i++]); + strcpy(dir, r[i++]); + strcpy(name, r[i++]); + size = atof(r[i++]); + chunk_size = atof(r[i++]); + created = atof(r[i++]); + need_update = (atoi(r[i++]) != 0); +} + +void DB_VDA_CHUNK_HOST::db_print(char* buf) { + sprintf(buf, + "vda_file_id=%d, " + "host_id=%d, " + "name='%s', " + "present_on_host=%d, " + "transfer_in_progress=%d, " + "transfer_wait=%d, " + "transition_time=%f ", + vda_file_id, + host_id, + name, + present_on_host, + transfer_in_progress, + transfer_wait, + transition_time + ); +} + +void DB_VDA_CHUNK_HOST::db_parse(MYSQL_ROW &r) { + int i=0; + clear(); + vda_file_id = atoi(r[i++]); + host_id = atoi(r[i++]); + strcpy(name, r[i++]); + present_on_host = (atoi(r[i++]) != 0); + transfer_in_progress = (atoi(r[i++]) != 0); + transfer_wait = (atoi(r[i++]) != 0); + transition_time = atof(r[i++]); +} + const char *BOINC_RCSID_ac374386c8 = "$Id$"; diff --git a/db/boinc_db.h b/db/boinc_db.h index b77841ec0f..5d3c65ed9c 100644 --- a/db/boinc_db.h +++ b/db/boinc_db.h @@ -1117,4 +1117,39 @@ public: std::vector items; }; +struct VDA_FILE { + int id; + char dir[256]; + char name[256]; + double size; + double chunk_size; + double created; + bool need_update; + void clear(); +}; + +struct VDA_CHUNK_HOST { + int vda_file_id; + int host_id; // zero if we're waiting for a host + char name[256]; + bool present_on_host; + bool transfer_in_progress; + bool transfer_wait; + double transition_time; + void clear(); +}; + +struct DB_VDA_FILE : public DB_BASE, public VDA_FILE { + DB_VDA_FILE(DB_CONN* p=0); + int get_id(); + void db_print(char*); + void db_parse(MYSQL_ROW &row); +}; + +struct DB_VDA_CHUNK_HOST : public DB_BASE, public VDA_CHUNK_HOST { + DB_VDA_CHUNK_HOST(DB_CONN* p=0); + void db_print(char*); + void db_parse(MYSQL_ROW &row); +}; + #endif diff --git a/db/schema_vda.sql b/db/schema_vda.sql new file mode 100644 index 0000000000..5a1257794b --- /dev/null +++ b/db/schema_vda.sql @@ -0,0 +1,27 @@ +create table vda_file ( + id integer not null auto_increment, + dir varchar(254) not null, + name varchar(254) not null, + size double not null default 0, + chunk_size double not null default 0, + created double not null default 0, + need_update tinyint not null default 0, + primary key(id) +) engine = InnoDB; + +alter table vda_file add unique(name); + +create table vda_chunk_host ( + vda_file_id integer not null default 0, + name varchar[256] not null, + host_id integer not null default 0, + present_on_host tinyint not null default 0, + transfer_in_progress tinyint not null default 0, + transfer_wait tinyint not null default 0, + transition_time double not null default 0 +) engine = InnoDB; + +alter table vda_chunk_host + add index vch_file (vda_file_id), + add index vch_host (host_id), + add index vch_tt (transition_time); diff --git a/lib/gui_rpc_client.h b/lib/gui_rpc_client.h index 0d45f90e05..9fc0bad281 100644 --- a/lib/gui_rpc_client.h +++ b/lib/gui_rpc_client.h @@ -308,8 +308,8 @@ public: bool pers_xfer_active; bool xfer_active; int num_retries; - int first_request_time; - int next_request_time; + double first_request_time; + double next_request_time; int status; double time_so_far; double bytes_xferred; diff --git a/lib/gui_rpc_client_ops.cpp b/lib/gui_rpc_client_ops.cpp index 9df7e42bc1..e0afcfc238 100644 --- a/lib/gui_rpc_client_ops.cpp +++ b/lib/gui_rpc_client_ops.cpp @@ -624,8 +624,8 @@ int FILE_TRANSFER::parse(XML_PARSER& xp) { is_upload = generated_locally; } if (xp.parse_int("num_retries", num_retries)) continue; - if (xp.parse_int("first_request_time", first_request_time)) continue; - if (xp.parse_int("next_request_time", next_request_time)) continue; + if (xp.parse_double("first_request_time", first_request_time)) continue; + if (xp.parse_double("next_request_time", next_request_time)) continue; if (xp.parse_int("status", status)) continue; if (xp.parse_double("time_so_far", time_so_far)) continue; if (xp.parse_double("last_bytes_xferred", bytes_xferred)) continue; diff --git a/ssim/makefile b/ssim/makefile index 49ae2669a8..58b131de6e 100644 --- a/ssim/makefile +++ b/ssim/makefile @@ -1,7 +1,10 @@ -all: ssim - -vda.o: vda.cpp vda.h - g++ -c vda.cpp -ssim: ssim.cpp des.h vda.o - g++ -g -Wall -o ssim ssim.cpp vda.o +all: ssim vda vda_transitioner +vda_lib.o: vda_lib.cpp vda_lib.h + g++ -c vda_lib.cpp +ssim: ssim.cpp des.h vda_lib.o + g++ -g -Wall -o ssim ssim.cpp vda_lib.o +vda_transitioner: vda_transitioner.cpp vda_lib.o + g++ -g -Wall -o vda_transitioner vda_transitioner.cpp vda_lib.o +vda: vda.cpp vda_lib.o + g++ -g -Wall -o vda vda.cpp vda_lib.o diff --git a/ssim/vda.cpp b/ssim/vda_lib.cpp similarity index 100% rename from ssim/vda.cpp rename to ssim/vda_lib.cpp diff --git a/ssim/vda.h b/ssim/vda_lib.h similarity index 100% rename from ssim/vda.h rename to ssim/vda_lib.h diff --git a/ssim/vda_transitioner.cpp b/ssim/vda_transitioner.cpp new file mode 100644 index 0000000000..52338de228 --- /dev/null +++ b/ssim/vda_transitioner.cpp @@ -0,0 +1,51 @@ +// This file is part of BOINC. +// http://boinc.berkeley.edu +// Copyright (C) 2012 University of California +// +// BOINC is free software; you can redistribute it and/or modify it +// under the terms of the GNU Lesser General Public License +// as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// BOINC is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License +// along with BOINC. If not, see . + +#include "boinc_db.h" + +void handle_file(VDA_FILE& vf) { +} + +bool scan_files() { + DB_VDA_FILE vf; + bool found = false; + + while (vda_file.enum("need_update<>0")) { + found = true; + handle_file(vf); + } + return found; +} + +void handle_chunk(VDA_CHUNK_HOST* ch) { +} + +void scan_chunks() { + DB_VDA_CHUNK_HOST ch; + + double now = dtime(); + while (ch.enum("transition_time < %f")) { + } +} + +int main(int argc, char** argv) { + while(1) { + bool action = scan_files(); + action != scan_chunks(); + if (!action) boinc_sleep(5.); + } +}