// find a project with finished results that should be reported. // This means: // - we're not backing off contacting the project // - no upload for that project is active // - the result is ready_to_report (compute done; files uploaded) // - we're within a day of the report deadline, // or at least a day has elapsed since the result was completed, // or we have a sporadic connection // or the project is in "don't request more work" state // or a network suspend period is coming up soon // or the project has > RESULT_REPORT_IF_AT_LEAST_N results ready to report // PROJECT* CLIENT_STATE::find_project_with_overdue_results( bool network_suspend_soon ) { unsigned int i; RESULT* r; for (i=0; i<projects.size(); i++) { PROJECT* p = projects[i]; p->n_ready = 0; p->dont_contact = false; if (p->waiting_until_min_rpc_time()) p->dont_contact = true; if (p->suspended_via_gui) p->dont_contact = true; #ifndef SIM if (actively_uploading(p)) p->dont_contact = true; #endif } for (i=0; i<results.size(); i++) { r = results[i]; if (!r->ready_to_report) continue; PROJECT* p = r->project; if (p->dont_contact) continue; if (p->dont_request_more_work) { return p; } if (r->report_immediately) { return p; } if (config.report_results_immediately) { return p; } if (net_status.have_sporadic_connection) { return p; } if (network_suspend_soon) { return p; } double cushion = std::max(REPORT_DEADLINE_CUSHION, work_buf_min()); if (gstate.now > r->report_deadline - cushion) { return p; } if (gstate.now > r->completed_time + SECONDS_PER_DAY) { return p; } p->n_ready++; if (p->n_ready >= RESULT_REPORT_IF_AT_LEAST_N) { return p; } } return 0; }
// find a project with finished results that should be reported. // This means: // - we're not backing off contacting the project // - the result is ready_to_report (compute done; files uploaded) // - we're within a day of the report deadline, // or at least a day has elapsed since the result was completed, // or we have a sporadic connection // PROJECT* CLIENT_STATE::find_project_with_overdue_results() { unsigned int i; RESULT* r; for (i=0; i<results.size(); i++) { r = results[i]; if (!r->ready_to_report) continue; PROJECT* p = r->project; if (p->waiting_until_min_rpc_time()) continue; if (p->suspended_via_gui) continue; if (config.report_results_immediately) { return p; } if (net_status.have_sporadic_connection) { return p; } double cushion = std::max(REPORT_DEADLINE_CUSHION, work_buf_min()); if (gstate.now > r->report_deadline - cushion) { return p; } if (gstate.now > r->completed_time + SECONDS_PER_DAY) { return p; } } return 0; }
// find a project for which a scheduler RPC has been requested // - by user // - by an account manager // - by the project // - because the project was just attached (for verification) // PROJECT* CLIENT_STATE::next_project_sched_rpc_pending() { unsigned int i; PROJECT* p; for (i=0; i<projects.size(); i++) { p = projects[i]; bool honor_backoff = true; bool honor_suspend = true; // is a scheduler-requested RPC due? // if (!p->sched_rpc_pending && p->next_rpc_time && p->next_rpc_time<now) { // don't do it if project is set to no new work // and has no jobs currently // if (!p->dont_request_more_work || p->has_results()) { p->sched_rpc_pending = RPC_REASON_PROJECT_REQ; } } switch (p->sched_rpc_pending) { case RPC_REASON_USER_REQ: honor_backoff = false; honor_suspend = false; break; case RPC_REASON_RESULTS_DUE: break; case RPC_REASON_NEED_WORK: break; case RPC_REASON_TRICKLE_UP: break; case RPC_REASON_ACCT_MGR_REQ: // This is critical for acct mgrs, to propagate new host CPIDs honor_suspend = false; break; case RPC_REASON_INIT: break; case RPC_REASON_PROJECT_REQ: break; } if (honor_backoff && p->waiting_until_min_rpc_time()) { continue; } if (honor_suspend && p->suspended_via_gui) { continue; } if (p->sched_rpc_pending) { return p; } } return 0; }
PROJECT* CLIENT_STATE::next_project_trickle_up_pending() { unsigned int i; PROJECT* p; for (i=0; i<projects.size(); i++) { p = projects[i]; if (p->waiting_until_min_rpc_time()) continue; if (p->suspended_via_gui) continue; if (p->trickle_up_pending) { return p; } } return 0; }
// find a project that needs to have its master file fetched // PROJECT* CLIENT_STATE::next_project_master_pending() { unsigned int i; PROJECT* p; for (i=0; i<projects.size(); i++) { p = projects[i]; if (p->waiting_until_min_rpc_time()) continue; if (p->suspended_via_gui) continue; if (p->suspended_during_update) continue; if (p->master_url_fetch_pending) { return p; } } return 0; }
// find a project for which a scheduler RPC has been requested // - by user // - by an account manager // - by the project // - because the project was just attached (for verification) // PROJECT* CLIENT_STATE::next_project_sched_rpc_pending() { unsigned int i; PROJECT* p; for (i=0; i<projects.size(); i++) { p = projects[i]; bool honor_backoff = true; bool honor_suspend = true; if (!p->sched_rpc_pending && p->next_rpc_time && p->next_rpc_time<now) { p->sched_rpc_pending = RPC_REASON_PROJECT_REQ; } switch (p->sched_rpc_pending) { case RPC_REASON_USER_REQ: honor_backoff = false; honor_suspend = false; break; case RPC_REASON_RESULTS_DUE: break; case RPC_REASON_NEED_WORK: break; case RPC_REASON_TRICKLE_UP: break; case RPC_REASON_ACCT_MGR_REQ: // This is critical for acct mgrs, to propagate new host CPIDs honor_suspend = false; break; case RPC_REASON_INIT: break; case RPC_REASON_PROJECT_REQ: break; } if (honor_backoff && p->waiting_until_min_rpc_time()) { continue; } if (honor_suspend && p->suspended_via_gui) { continue; } if (p->sched_rpc_pending) { return p; } } return 0; }