// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2008 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 . #ifndef _SCHEDULER_OP_ #define _SCHEDULER_OP_ #include #include "client_types.h" //#include "auto_update.h" #include "http_curl.h" #include "prefs.h" #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 // defaults related to scheduler RPC policy // See client_state.h for definitions #define MASTER_FETCH_PERIOD 10 // fetch and parse master URL if nrpc_failures is a multiple of this #define RETRY_CAP 10 // cap on nrpc_failures #define MASTER_FETCH_RETRY_CAP 3 // after this many master-fetch failures, // move into a state in which we retry master fetch // at the frequency below #define MASTER_FETCH_INTERVAL (86400) // 1 day // See above // constants used to bound RPC backoff #define SCHED_RETRY_DELAY_MIN 60 // 1 minute #define SCHED_RETRY_DELAY_MAX (60*60*4) // 4 hours // SCHEDULER_OP encapsulates the mechanism for // 1) fetching master files // 2) communicating with scheduling servers // Only one such operation can be in progress at once. class SCHEDULER_OP { private: int scheduler_op_retval; HTTP_OP http_op; HTTP_OP_SET* http_ops; char scheduler_url[256]; int url_index; // index within project's URL list public: PROJECT* cur_proj; // project we're currently contacting int state; int reason; double url_random; // used to randomize order public: SCHEDULER_OP(HTTP_OP_SET*); bool poll(); int init_op_project(PROJECT*, int); int init_master_fetch(PROJECT*); bool check_master_fetch_start(); void project_rpc_backoff(PROJECT* p, const char *error_msg); void abort(PROJECT*); // if we're doing an op to this project, abort it private: bool update_urls(PROJECT*, std::vector &urls); int start_op(PROJECT*); int start_rpc(PROJECT*); void rpc_failed(const char*); int parse_master_file(PROJECT*, std::vector&); }; struct USER_MESSAGE { std::string message; std::string priority; USER_MESSAGE(char*, char*); }; struct SCHEDULER_REPLY { int hostid; double request_delay; double next_rpc_delay; std::vector messages; char* global_prefs_xml; // not including tags; // may include elements char* project_prefs_xml; // not including tags // may include elements char master_url[256]; char host_venue[256]; unsigned int user_create_time; std::vector apps; std::vector file_infos; std::vector file_deletes; std::vector app_versions; std::vector workunits; std::vector results; std::vector result_acks; std::vector result_abort; std::vector result_abort_if_not_started; std::vector project_files; char* code_sign_key; char* code_sign_key_signature; bool message_ack; bool project_is_down; bool send_file_list; bool send_full_workload; bool dont_use_dcf; int send_time_stats_log; int send_job_log; int scheduler_version; #ifdef ENABLE_AUTO_UPDATE AUTO_UPDATE auto_update; #endif std::vector sr_feeds; std::vector trickle_up_urls; bool got_rss_feeds; // whether scheduler reply included void clear(); SCHEDULER_REPLY(); ~SCHEDULER_REPLY(); int parse(FILE*, PROJECT*); void handle_backoff(const char*, double); void handle_rsc_backoff(FILE*); }; #endif