рдЕрдкрдиреЗ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, BOINC рд╕рд░реНрд╡рд░ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдп рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдмрд╛рдж рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢реЗрд╖ рджрд╛рдирд╡ рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмрд╣реБрдзрд╛ рдЗрд╕реЗ рдХрд╛рдо_рдЬрдирдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬрдирд░реЗрдЯрд░ ~ / server_stable / рд╢реЗрдбреНрдпреВрд▓ / sample_work_generatr.cpp рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдЬрд░реВрд░рддреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреЛрдбрд╛рдВрддрд░рдг рдФрд░ рдЬрдирд░реЗрдЯрд░ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
0. рдпрджрд┐ BOINC рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рд░реЛрдХ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ~ / рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ / рдкрд░реАрдХреНрд╖рдг / рдмрд┐рди / рд╕реНрдЯреЙрдк (~ / рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ / рдкрд░реАрдХреНрд╖рдг / рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдШрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ)
1. ~ / server_stable / schedule / рдкрд░ рдЬрд╛рдПрдВ
2. рд╣рдо рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ: рдмрдирд╛рддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рд╕реБрдкрд░рдпреБрд╕рд░ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдореЗрдХрдлрд╛рдЗрд▓ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдЬрдирд░реЗрдЯрд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХрд╛рдлреА рдмрдбрд╝реА рдФрд░ рднреНрд░рд╛рдордХ рд╣реИред рдЖрдк рдЗрд╕рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреЗрд╡рд▓ рд╡рд╣реА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЬрдирд░реЗрдЯрд░ рдХреЛ рдЪрд┐рдВрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ NTL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП CXXFLAGS рдЪрд░ рдореЗрдВ -lntl рдзреНрд╡рдЬ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА)ред рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдФрд░ рд╕рдВрдкрд╛рджрди рдХреЗ рдмрд┐рдирд╛ рд╕рдмрдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
3. рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ 2 рдлрд╛рдЗрд▓реЗрдВ рдорд┐рд▓рддреА рд╣реИрдВ: sample_work_generator.o (рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп) рдФрд░ sample_work_generator (рд╕реНрдХреНрд░рд┐рдкреНрдЯ)ред рд╣рдо рдЗрди рдлрд╛рдЗрд▓реЛрдВ рдХреЛ ~ / рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рдЯреЗрд╕реНрдЯ / рдмрд┐рди / рдХреЗ рд▓рд┐рдП рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ
4. рдЕрдм рд╣рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рд╣реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: ~ / рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рдЯреЗрд╕реНрдЯ / config.xmlред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдбреЗрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рд╣реИред рдЗрд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ:
<daemon> <cmd> sample_work_generator -d 3 </cmd> </daemon>
рдЗрд╕реА рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред -D 3 рдЭрдВрдбреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрдорд╛рдВрдб рдбреЗрдорди рдХреЛ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдХреЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред
5. рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВ ~ / рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рдЯреЗрд╕реНрдЯ / рдмрд┐рди / рд╕реНрдЯрд╛рд░реНрдЯ
рдЕрдм, рдЬрдмрдХрд┐ BOINC рд╕рд░реНрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдиреМрдХрд░рд┐рдпрд╛рдВ рд▓рдЧрд╛рддрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реЛрдВрдЧреАред рдХрд╛рд░реНрдп рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ ~ / рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ / рдкрд░реАрдХреНрд╖рдг / рдбрд╛рдЙрдирд▓реЛрдб рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рддрдм рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред рдЬреЙрдм рд╡рд░реНрдХрдмреЛрд░реНрдб рдЯреЗрдмрд▓ рдореЗрдВ BOINC рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднреА рдкрдВрдЬреАрдХреГрдд рд╣реЛрдЧрд╛ред
рдЕрдм рдПрдХ рдЙрджрд╛рд╣рд░рдг рдлрд╝рд╛рдЗрд▓ рдЬрдирд░реЗрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
#include <unistd.h> #include <cstdlib> #include <string> #include <cstring> #include "boinc_db.h" #include "error_numbers.h" #include "backend_lib.h" #include "parse.h" #include "util.h" #include "svn_version.h" #include "sched_config.h" #include "sched_util.h" #include "sched_msgs.h" #include "str_util.h" #define CUSHION 1000 // , // #define REPLICATION_FACTOR 2 char* wu_template; DB_APP app; int start_time; int seqno; // int make_job(ZZ &num) { DB_WORKUNIT wu; char name[256], path[256]; const char* infiles[1]; int retval; // - sprintf(name, "s_%d_%d", start_time, seqno++); // retval = config.download_path(name, path); if (retval) return retval; // ofstreamfile file(path); file << num; file.close(); // wu.clear(); wu.appid = app.id; strcpy(wu.name, name); wu.rsc_fpops_est = 1e12; wu.rsc_fpops_bound = 1e14; wu.rsc_memory_bound = 1e8; wu.rsc_disk_bound = 1e8; wu.delay_bound = 86400; wu.min_quorum = REPLICATION_FACTOR; wu.target_nresults = REPLICATION_FACTOR; wu.max_error_results = REPLICATION_FACTOR*4; wu.max_total_results = REPLICATION_FACTOR*8; wu.max_success_results = REPLICATION_FACTOR*4; infiles[0] = name; // BOINC ( ) return create_work( wu, wu_template, "templates/uc_result", config.project_path("templates/uc_result"), infiles, 1, config ); } // void main_loop() { int retval; ZZ curr_num=to_ZZ("5"); while (1) { check_stop_daemons(); //, int n; retval = count_unsent_results(n, 0); // if (n > CUSHION) { // - sleep(60); } else { int njobs = (CUSHION-n)/REPLICATION_FACTOR; log_messages.printf(MSG_DEBUG, "Making %d jobs\n", njobs ); for (int i=0; i<njobs; i++) { retval = make_job(curr_num); while (1) { curr_num++; if (curr_num%2==0 || curr_num%3==0 || curr_num%5==0) continue; break; } if (retval) { // log_messages.printf(MSG_CRITICAL, "can't make job: %d\n", retval ); exit(retval); } } sleep(5); } } } int main(int argc, char** argv) { int i, retval; start_num=0; end_num = 0; for (i=1; i<argc; i++) { if (is_arg(argv[i], "d")) { if (!argv[++i]) { log_messages.printf(MSG_CRITICAL, "%s requires an argument\n\n", argv[--i]); exit(1); } int dl = atoi(argv[i]); log_messages.set_debug_level(dl); if (dl == 4) g_print_queries = true; } else { log_messages.printf(MSG_CRITICAL, "unknown command line argument: %s\n\n", argv[i]); usage(argv[0]); exit(1); } } retval = config.parse_file(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't parse config.xml: %s\n", boincerror(retval) ); exit(1); } retval = boinc_db.open( config.db_name, config.db_host, config.db_user, config.db_passwd ); if (retval) { log_messages.printf(MSG_CRITICAL, "can't open db\n"); exit(1); } if (app.lookup("where name='uppercase'")) { log_messages.printf(MSG_CRITICAL, "can't find app\n"); exit(1); } if (read_file_malloc(config.project_path("templates/uc_wu"), wu_template)) { log_messages.printf(MSG_CRITICAL, "can't read WU template\n"); exit(1); } start_time = time(0); seqno = 0; log_messages.printf(MSG_NORMAL, "Starting\n"); main_loop(); }