diff --git a/checkin_notes b/checkin_notes index 8e1675ced5..551d6c57de 100755 --- a/checkin_notes +++ b/checkin_notes @@ -8845,3 +8845,30 @@ Charlie 4 July 2005 BOINCGUIApp.cpp doc/ mac_advanced.php + +David 5 July 2005 + - Always show the reason for a scheduler RPC: either + - requested by user + - results due for reporting + - fetching work + + Implementation: add "reason" argument to init_op_project(). + Store in SCHEDULER_OP. + This eliminates the need for must_get_work. + Remove init_return_results(). + - handle RPC init errors (by backing off) in init_op_project(), + NOT in the functions that call it (e.g. init_get_work()). + We were backing off twice for the same error. + - network_query GUI RPC: return false if network suspended by user + - Manager: remove wxASSERT(fBuffer) + from CViewReousrces::FormatDiskSpace(). + This causes crash if a project has zero disk usage. + ?? Why is the amount of disk called "fBuffer"? + ?? why is a PROJECT* called "resource"? + + client/ + client_state.C + cs_scheduler.C + scheduler_op.C,h + clientgui/ + ViewResources.cpp diff --git a/client/client_state.C b/client/client_state.C index 39c30ca8fb..4da852559e 100644 --- a/client/client_state.C +++ b/client/client_state.C @@ -1315,6 +1315,7 @@ int CLIENT_STATE::version() { bool CLIENT_STATE::want_network() { if (http_ops->nops()) return true; + if (network_suspended) return false; if (want_network_flag) return true; return false; } diff --git a/client/cs_scheduler.C b/client/cs_scheduler.C index 9ffad874b9..ea1f2ff5ca 100644 --- a/client/cs_scheduler.C +++ b/client/cs_scheduler.C @@ -609,7 +609,7 @@ bool CLIENT_STATE::scheduler_rpc_poll() { // p = next_project_sched_rpc_pending(); if (p) { - scheduler_op->init_return_results(p); + scheduler_op->init_op_project(p, REASON_USER_REQ); action = true; break; } @@ -619,7 +619,7 @@ bool CLIENT_STATE::scheduler_rpc_poll() { // p = find_project_with_overdue_results(); if (p) { - scheduler_op->init_return_results(p); + scheduler_op->init_op_project(p, REASON_RESULTS_DUE); action = true; break; } diff --git a/client/scheduler_op.C b/client/scheduler_op.C index 11352a4b84..ce7b1b2254 100644 --- a/client/scheduler_op.C +++ b/client/scheduler_op.C @@ -81,39 +81,29 @@ bool SCHEDULER_OP::check_master_fetch_start() { // int SCHEDULER_OP::init_get_work() { int retval; - char err_msg[256]; - must_get_work = true; PROJECT* p = gstate.next_project_need_work(); if (p) { - retval = init_op_project(p); + retval = init_op_project(p, REASON_NEED_WORK); if (retval) { - sprintf(err_msg, "init_op_project failed, error %d\n", retval); - backoff(p, err_msg); return retval; } } return 0; } -// report results for a particular project. -// PRECONDITION: compute_work_requests() has been called -// to fill in PROJECT::work_request -// -int SCHEDULER_OP::init_return_results(PROJECT* p) { - must_get_work = false; - return init_op_project(p); -} // try to initiate an RPC to the given project. -// If there are multiple schedulers, start with a random one +// If there are multiple schedulers, start with a random one. +// User messages and backoff() is done at this level. // -int SCHEDULER_OP::init_op_project(PROJECT* p) { +int SCHEDULER_OP::init_op_project(PROJECT* p, SCHEDULER_OP_REASON r) { int retval; char err_msg[256]; SCOPE_MSG_LOG scope_messages(log_messages, CLIENT_MSG_LOG::DEBUG_SCHED_OP); + reason = r; scope_messages.printf( "SCHEDULER_OP::init_op_project(): starting op for %s\n", p->master_url @@ -232,6 +222,14 @@ int SCHEDULER_OP::start_rpc(PROJECT* p) { p, MSG_INFO, "Sending scheduler request to %s\n", scheduler_url ); + char* why; + switch (reason) { + case REASON_USER_REQ: why = "Requested by user"; break; + case REASON_NEED_WORK: why = "To fetch work"; break; + case REASON_RESULTS_DUE: why = "To report results"; break; + default: why = "Unknown"; + } + msg_printf(p, MSG_INFO, "Reason: %s", why); msg_printf( p, MSG_INFO, "Requesting %.0f seconds of work, returning %d results\n", @@ -489,7 +487,7 @@ bool SCHEDULER_OP::poll() { // if we asked for work and didn't get any, // back off this project // - if (must_get_work && nresults==0) { + if (reason==REASON_NEED_WORK && nresults==0) { backoff(cur_proj, "No work from project\n"); } else { cur_proj->nrpc_failures = 0; diff --git a/client/scheduler_op.h b/client/scheduler_op.h index 12ff90bf8b..f570e9045f 100644 --- a/client/scheduler_op.h +++ b/client/scheduler_op.h @@ -20,22 +20,29 @@ #ifndef _SCHEDULER_OP_ #define _SCHEDULER_OP_ -// SCHEDULER_OP encapsulates the policy and mechanism -// for communicating with scheduling servers. -// It is implemented as a finite-state machine. -// It is active in one of two modes: -// get_work: the client wants to get work, and possibly to -// return results as a side-effect -// return_results: the client wants to return results, and possibly -// to get work as a side-effect -// - #include #include "client_types.h" #include "http.h" #include "prefs.h" +// SCHEDULER_OP encapsulates the mechanism +// for fetching master files and communicating with scheduling servers. +// Only one such operation can be in progress at once: +// +#define SCHEDULER_OP_STATE_IDLE 0 + // invariant: in this state, our HTTP_OP is not in the HTTP_OP_SET +#define SCHEDULER_OP_STATE_GET_MASTER 1 +#define SCHEDULER_OP_STATE_RPC 2 + +// reasons for making a scheduler RPC: +// +typedef enum { + REASON_USER_REQ, + REASON_RESULTS_DUE, + REASON_NEED_WORK +} SCHEDULER_OP_REASON ; + // default constants related to scheduler RPC policy #define MASTER_FETCH_PERIOD 10 @@ -56,10 +63,6 @@ #define SCHED_RETRY_DELAY_MIN 60 // 1 minute #define SCHED_RETRY_DELAY_MAX (60*60*4) // 4 hours -#define SCHEDULER_OP_STATE_IDLE 0 - // invariant: in this state, our HTTP_OP is not in the HTTP_OP_SET -#define SCHEDULER_OP_STATE_GET_MASTER 1 -#define SCHEDULER_OP_STATE_RPC 2 class SCHEDULER_OP { private: @@ -68,24 +71,25 @@ private: HTTP_OP_SET* http_ops; PROJECT* cur_proj; // project we're currently contacting char scheduler_url[256]; - bool must_get_work; // true iff in get_work mode + //bool must_get_work; // true iff in get_work mode int url_index; // index within project's URL list public: int state; + SCHEDULER_OP_REASON reason; double url_random; // used to randomize order public: SCHEDULER_OP(HTTP_OP_SET*); bool poll(); int init_get_work(); - int init_return_results(PROJECT*); + int init_op_project(PROJECT*, SCHEDULER_OP_REASON); +// int init_return_results(PROJECT*); int init_master_fetch(PROJECT*); bool check_master_fetch_start(); void backoff(PROJECT* p, const char *error_msg); void abort(PROJECT*); // if we're doing an op to this project, abort it private: - int init_op_project(PROJECT*); int set_min_rpc_time(PROJECT*); bool update_urls(PROJECT*, std::vector &urls); int start_op(PROJECT*); diff --git a/clientgui/ViewResources.cpp b/clientgui/ViewResources.cpp index 12d3375da8..6ccaaef2d2 100644 --- a/clientgui/ViewResources.cpp +++ b/clientgui/ViewResources.cpp @@ -227,8 +227,6 @@ wxInt32 CViewResources::FormatDiskSpace(wxInt32 item, wxString& strBuffer) const fBuffer = resource->disk_usage; } - wxASSERT(fBuffer); - if (fBuffer >= xTera) { strBuffer.Printf(wxT("%0.2f TB"), fBuffer/xTera); } else if (fBuffer >= xGiga) { diff --git a/win_build/boinc_cli.vcproj b/win_build/boinc_cli.vcproj index 6376817569..781b487c10 100644 --- a/win_build/boinc_cli.vcproj +++ b/win_build/boinc_cli.vcproj @@ -1128,9 +1128,6 @@ - -