void JOB_DESC::create() { if (assign_flag) { wu.transitioner_flags = assign_multi?TRANSITION_NONE:TRANSITION_NO_NEW_RESULTS; } int retval = create_work2( wu, wu_template, result_template_file, result_template_path, infiles, config, command_line, additional_xml ); if (retval) { fprintf(stderr, "create_work: %s\n", boincerror(retval)); exit(1); } if (assign_flag) { DB_ASSIGNMENT assignment; assignment.clear(); assignment.create_time = time(0); assignment.target_id = assign_id; assignment.target_type = assign_type; assignment.multi = assign_multi; assignment.workunitid = wu.id; retval = assignment.insert(); if (retval) { fprintf(stderr, "assignment.insert() failed: %s\n", boincerror(retval) ); exit(1); } } }
// Arrange that further results for this workunit // will be sent only to hosts with the given user ID. // This could be used, for example, so that late workunits // are sent only to cloud or cluster resources // int restrict_wu_to_user(WORKUNIT& _wu, int userid) { DB_RESULT result; DB_ASSIGNMENT asg; DB_WORKUNIT wu; wu = _wu; char buf[256]; int retval; // mark unsent results as DIDNT_NEED // sprintf(buf, "where workunitid=%d and server_state=%d", wu.id, RESULT_SERVER_STATE_UNSENT ); while (!result.enumerate(buf)) { char buf2[256]; sprintf(buf2, "server_state=%d, outcome=%d", RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_DIDNT_NEED ); result.update_field(buf2); } // mark the WU as TRANSITION_NO_NEW_RESULTS // sprintf(buf, "transitioner_flags=%d", TRANSITION_NO_NEW_RESULTS); retval = wu.update_field(buf); if (retval) return retval; // create an assignment record // asg.clear(); asg.create_time = time(0); asg.target_id = userid; asg.target_type = ASSIGN_USER; asg.multi = 0; asg.workunitid = wu.id; retval = asg.insert(); return retval; }
int main(int argc, const char** argv) { DB_APP app; DB_WORKUNIT wu; int retval; char wu_template[BLOB_SIZE]; char wu_template_file[256], result_template_file[256], result_template_path[1024]; const char* command_line=NULL; const char** infiles = NULL; int i, ninfiles; char download_dir[256], db_name[256], db_passwd[256]; char db_user[256],db_host[256]; char buf[256]; char additional_xml[256]; bool assign_flag = false; bool assign_multi = false; int assign_id = 0; int assign_type; strcpy(result_template_file, ""); strcpy(app.name, ""); strcpy(db_passwd, ""); strcpy(additional_xml, ""); const char* config_dir = 0; i = 1; ninfiles = 0; wu.clear(); // defaults (in case they're not in WU template) wu.id = 0; wu.min_quorum = 2; wu.target_nresults = 2; wu.max_error_results = 3; wu.max_total_results = 10; wu.max_success_results = 6; wu.rsc_fpops_est = 3600e9; wu.rsc_fpops_bound = 86400e9; wu.rsc_memory_bound = 5e8; wu.rsc_disk_bound = 1e9; wu.rsc_bandwidth_bound = 0.0; wu.delay_bound = 7*86400; while (i < argc) { if (arg(argv, i, "appname")) { strcpy(app.name, argv[++i]); } else if (arg(argv, i, "wu_name")) { strcpy(wu.name, argv[++i]); } else if (arg(argv, i, "wu_template")) { strcpy(wu_template_file, argv[++i]); } else if (arg(argv, i, "result_template")) { strcpy(result_template_file, argv[++i]); } else if (arg(argv, i, "batch")) { wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "config_dir")) { config_dir = argv[++i]; } else if (arg(argv, i, "batch")) { wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "priority")) { wu.priority = atoi(argv[++i]); } else if (arg(argv, i, "rsc_fpops_est")) { wu.rsc_fpops_est = atof(argv[++i]); } else if (arg(argv, i, "rsc_fpops_bound")) { wu.rsc_fpops_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_memory_bound")) { wu.rsc_memory_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_disk_bound")) { wu.rsc_disk_bound = atof(argv[++i]); } else if (arg(argv, i, "delay_bound")) { wu.delay_bound = atoi(argv[++i]); } else if (arg(argv, i, "min_quorum")) { wu.min_quorum = atoi(argv[++i]); } else if (arg(argv, i, "target_nresults")) { wu.target_nresults = atoi(argv[++i]); } else if (arg(argv, i, "max_error_results")) { wu.max_error_results = atoi(argv[++i]); } else if (arg(argv, i, "max_total_results")) { wu.max_total_results = atoi(argv[++i]); } else if (arg(argv, i, "max_success_results")) { wu.max_success_results = atoi(argv[++i]); } else if (arg(argv, i, "opaque")) { wu.opaque = atoi(argv[++i]); } else if (arg(argv, i, "command_line")) { command_line= argv[++i]; } else if (arg(argv, i, "additional_xml")) { strcpy(additional_xml, argv[++i]); } else if (arg(argv, i, "wu_id")) { wu.id = atoi(argv[++i]); } else if (arg(argv, i, "assign_all")) { assign_multi = true; assign_flag = true; assign_type = ASSIGN_NONE; } else if (arg(argv, i, "assign_host")) { assign_flag = true; assign_type = ASSIGN_HOST; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "assign_user_one")) { assign_flag = true; assign_type = ASSIGN_USER; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "assign_user_all")) { assign_flag = true; assign_type = ASSIGN_USER; assign_multi = true; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "assign_team_one")) { assign_flag = true; assign_type = ASSIGN_TEAM; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "assign_team_all")) { assign_flag = true; assign_type = ASSIGN_TEAM; assign_multi = true; assign_id = atoi(argv[++i]); } else { if (!strncmp("-", argv[i], 1)) { fprintf(stderr, "create_work: bad argument '%s'\n", argv[i]); exit(1); } infiles = argv+i; ninfiles = argc - i; break; } i++; } #define CHKARG(x,m) do { if (!(x)) { fprintf(stderr, "create_work: bad command line: "m"\n"); exit(1); } } while (0) #define CHKARG_STR(v,m) CHKARG(strlen(v),m) CHKARG_STR(app.name , "need --appname"); CHKARG_STR(wu.name , "need --wu_name"); CHKARG_STR(wu_template_file , "need --wu_template"); CHKARG_STR(result_template_file , "need --result_template"); #undef CHKARG #undef CHKARG_STR if (assign_flag) { if (!strstr(wu.name, ASSIGNED_WU_STR)) { fprintf(stderr, "Assigned WU names must contain '%s'\n", ASSIGNED_WU_STR ); exit(1); } } retval = config.parse_file(); if (retval) { fprintf(stderr, "Can't parse config file: %d\n", retval); exit(1); } else { strcpy(db_name, config.db_name); strcpy(db_passwd, config.db_passwd); strcpy(db_user, config.db_user); strcpy(db_host, config.db_host); strcpy(download_dir, config.download_dir); } retval = boinc_db.open(db_name, db_host, db_user, db_passwd); if (retval) { fprintf(stderr, "create_work: error opening database: %d\n", retval ); exit(1); } sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { fprintf(stderr, "create_work: app not found\n"); exit(1); } retval = read_filename(wu_template_file, wu_template, sizeof(wu_template)); if (retval) { fprintf(stderr, "create_work: can't open WU template: %d\n", retval); exit(1); } wu.appid = app.id; strcpy(result_template_path, "./"); strcat(result_template_path, result_template_file); retval = create_work( wu, wu_template, result_template_file, result_template_path, const_cast<const char **>(infiles), ninfiles, config, command_line, additional_xml ); if (retval) { fprintf(stderr, "create_work: %d\n", retval); exit(1); } if (assign_flag) { DB_ASSIGNMENT assignment; assignment.clear(); assignment.create_time = time(0); assignment.target_id = assign_id; assignment.target_type = assign_type; assignment.multi = assign_multi; assignment.workunitid = wu.id; retval = assignment.insert(); if (retval) { fprintf(stderr, "assignment.insert() failed: %d\n", retval); exit(1); } } boinc_db.close(); }
// send non-multi assigned jobs // bool send_assigned_jobs() { DB_ASSIGNMENT asg; DB_RESULT result; DB_WORKUNIT wu; bool sent_something = false; int retval; // for now, only look for user assignments // char buf[256]; sprintf(buf, "where target_type=%d and target_id=%d and multi=0", ASSIGN_USER, g_reply->user.id ); while (!asg.enumerate(buf)) { if (!work_needed(false)) continue; // if the WU doesn't exist, delete the assignment record. // retval = wu.lookup_id(asg.workunitid); if (retval) { asg.delete_from_db(); continue; } // don't send if WU is validation pending or completed, // or has transition pending // if (wu.need_validate) continue; if (wu.canonical_resultid) continue; if (wu.transition_time < time(0)) continue; // don't send if we already sent one to this host // sprintf(buf, "where workunitid=%d and hostid=%d", asg.workunitid, g_request->host.id ); retval = result.lookup(buf); if (retval != ERR_DB_NOT_FOUND) continue; // don't send if there's already one in progress to this user // sprintf(buf, "where workunitid=%d and userid=%d and server_state=%d", asg.workunitid, g_reply->user.id, RESULT_SERVER_STATE_IN_PROGRESS ); retval = result.lookup(buf); if (retval != ERR_DB_NOT_FOUND) continue; // OK, send the job // retval = send_assigned_job(asg); if (retval) continue; sent_something = true; // update the WU's transition time to time out this job // retval = wu.lookup_id(asg.workunitid); if (retval) continue; int new_tt = time(0) + wu.delay_bound; if (new_tt < wu.transition_time) { char buf2[256]; sprintf(buf2, "transition_time=%d", new_tt); wu.update_field(buf2); } } return sent_something; }
int SCHED_SHMEM::scan_tables() { DB_PLATFORM platform; DB_APP app; DB_APP_VERSION app_version; DB_ASSIGNMENT assignment; int i, j, n; n = 0; while (!platform.enumerate()) { if (platform.deprecated) continue; platforms[n++] = platform; if (n == MAX_PLATFORMS) { overflow("platforms", "MAX_PLATFORMS"); } } nplatforms = n; n = 0; app_weight_sum = 0; while (!app.enumerate()) { if (app.deprecated) continue; apps[n++] = app; if (n == MAX_APPS) { overflow("apps", "MAX_APPS"); } app_weight_sum += app.weight; } napps = n; n = 0; // for each (app, platform) pair, // get all versions with numbers maximal in their plan class. // for (i=0; i<nplatforms; i++) { PLATFORM& splatform = platforms[i]; for (j=0; j<napps; j++) { APP& sapp = apps[j]; vector<APP_VERSION> avs; char query[1024]; sprintf(query, "where appid=%d and platformid=%d and deprecated=0", sapp.id, splatform.id ); while (!app_version.enumerate(query)) { avs.push_back(app_version); } for (unsigned int k=0; k<avs.size(); k++) { APP_VERSION& av1 = avs[k]; for (unsigned int kk=0; kk<avs.size(); kk++) { if (k == kk) continue; APP_VERSION& av2 = avs[kk]; if (!strcmp(av1.plan_class, av2.plan_class) && av1.version_num > av2.version_num) { av2.deprecated = 1; } } } for (unsigned int k=0; k<avs.size(); k++) { APP_VERSION& av1 = avs[k]; if (av1.deprecated) continue; if (av1.min_core_version && av1.min_core_version < 10000) { fprintf(stderr, "min core version too small - multiplying by 100\n"); av1.min_core_version *= 100; } if (av1.max_core_version && av1.max_core_version < 10000) { fprintf(stderr, "max core version too small - multiplying by 100\n"); av1.max_core_version *= 100; } app_versions[n++] = av1; if (n == MAX_APP_VERSIONS) { overflow("app_versions", "MAX_APP_VERSIONS"); } } } } napp_versions = n; // see which resources we have app versions for // have_cpu_apps = false; have_cuda_apps = false; have_ati_apps = false; for (i=0; i<napp_versions; i++) { APP_VERSION& av = app_versions[i]; if (strstr(av.plan_class, "cuda")) { have_cuda_apps = true; } else if (strstr(av.plan_class, "nvidia")) { have_cuda_apps = true; } else if (strstr(av.plan_class, "ati")) { have_ati_apps = true; } else { have_cpu_apps = true; } } n = 0; while (!assignment.enumerate()) { assignments[n++] = assignment; if (n == MAX_ASSIGNMENTS) { overflow("assignments", "MAX_ASSIGNMENTS"); } } nassignments = n; return 0; }
int main(int argc, const char** argv) { DB_APP app; DB_WORKUNIT wu; int retval; char wu_template[BLOB_SIZE]; char wu_template_file[256], result_template_file[256], result_template_path[MAXPATHLEN]; const char* command_line=NULL; const char** infiles = NULL; int i, ninfiles; char download_dir[256], db_name[256], db_passwd[256]; char db_user[256],db_host[256]; char buf[256]; char additional_xml[256]; bool show_wu_name = true; bool assign_flag = false; bool assign_multi = false; int assign_id = 0; int assign_type = ASSIGN_NONE; strcpy(wu_template_file, ""); strcpy(result_template_file, ""); strcpy(app.name, ""); strcpy(db_passwd, ""); strcpy(additional_xml, ""); const char* config_dir = 0; i = 1; ninfiles = 0; wu.clear(); // defaults (in case they're not in WU template) wu.id = 0; wu.min_quorum = 2; wu.target_nresults = 2; wu.max_error_results = 3; wu.max_total_results = 10; wu.max_success_results = 6; wu.rsc_fpops_est = 3600e9; wu.rsc_fpops_bound = 86400e9; wu.rsc_memory_bound = 5e8; wu.rsc_disk_bound = 1e9; wu.rsc_bandwidth_bound = 0.0; wu.delay_bound = 7*86400; while (i < argc) { if (arg(argv, i, "appname")) { strcpy(app.name, argv[++i]); } else if (arg(argv, i, "d")) { int dl = atoi(argv[++i]); log_messages.set_debug_level(dl); if (dl ==4) g_print_queries = true; } else if (arg(argv, i, "wu_name")) { show_wu_name = false; strcpy(wu.name, argv[++i]); } else if (arg(argv, i, "wu_template")) { strcpy(wu_template_file, argv[++i]); } else if (arg(argv, i, "result_template")) { strcpy(result_template_file, argv[++i]); } else if (arg(argv, i, "batch")) { wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "config_dir")) { config_dir = argv[++i]; } else if (arg(argv, i, "batch")) { wu.batch = atoi(argv[++i]); } else if (arg(argv, i, "priority")) { wu.priority = atoi(argv[++i]); } else if (arg(argv, i, "rsc_fpops_est")) { wu.rsc_fpops_est = atof(argv[++i]); } else if (arg(argv, i, "rsc_fpops_bound")) { wu.rsc_fpops_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_memory_bound")) { wu.rsc_memory_bound = atof(argv[++i]); } else if (arg(argv, i, "rsc_disk_bound")) { wu.rsc_disk_bound = atof(argv[++i]); } else if (arg(argv, i, "delay_bound")) { wu.delay_bound = atoi(argv[++i]); } else if (arg(argv, i, "min_quorum")) { wu.min_quorum = atoi(argv[++i]); } else if (arg(argv, i, "target_nresults")) { wu.target_nresults = atoi(argv[++i]); } else if (arg(argv, i, "max_error_results")) { wu.max_error_results = atoi(argv[++i]); } else if (arg(argv, i, "max_total_results")) { wu.max_total_results = atoi(argv[++i]); } else if (arg(argv, i, "max_success_results")) { wu.max_success_results = atoi(argv[++i]); } else if (arg(argv, i, "opaque")) { wu.opaque = atoi(argv[++i]); } else if (arg(argv, i, "command_line")) { command_line= argv[++i]; } else if (arg(argv, i, "additional_xml")) { strcpy(additional_xml, argv[++i]); } else if (arg(argv, i, "wu_id")) { wu.id = atoi(argv[++i]); } else if (arg(argv, i, "broadcast")) { assign_multi = true; assign_flag = true; assign_type = ASSIGN_NONE; } else if (arg(argv, i, "broadcast_user")) { assign_flag = true; assign_type = ASSIGN_USER; assign_multi = true; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "broadcast_team")) { assign_flag = true; assign_type = ASSIGN_TEAM; assign_multi = true; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_host")) { assign_flag = true; assign_type = ASSIGN_HOST; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_user")) { assign_flag = true; assign_type = ASSIGN_USER; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "target_team")) { assign_flag = true; assign_type = ASSIGN_TEAM; assign_id = atoi(argv[++i]); } else if (arg(argv, i, "help")) { usage(); exit(0); } else { if (!strncmp("-", argv[i], 1)) { fprintf(stderr, "create_work: bad argument '%s'\n", argv[i]); exit(1); } infiles = argv+i; ninfiles = argc - i; break; } i++; } if (!strlen(app.name)) { usage(); } if (!strlen(wu.name)) { sprintf(wu.name, "%s_%d_%f", app.name, getpid(), dtime()); } if (!strlen(wu_template_file)) { sprintf(wu_template_file, "templates/%s_in", app.name); } if (!strlen(result_template_file)) { sprintf(result_template_file, "templates/%s_out", app.name); } retval = config.parse_file(config_dir); if (retval) { fprintf(stderr, "Can't parse config file: %s\n", boincerror(retval)); exit(1); } else { strcpy(db_name, config.db_name); strcpy(db_passwd, config.db_passwd); strcpy(db_user, config.db_user); strcpy(db_host, config.db_host); strcpy(download_dir, config.download_dir); } retval = boinc_db.open(db_name, db_host, db_user, db_passwd); if (retval) { fprintf(stderr, "create_work: error opening database: %s\n", boincerror(retval) ); exit(1); } sprintf(buf, "where name='%s'", app.name); retval = app.lookup(buf); if (retval) { fprintf(stderr, "create_work: app not found\n"); exit(1); } retval = read_filename(wu_template_file, wu_template, sizeof(wu_template)); if (retval) { fprintf(stderr, "create_work: can't open input template %s\n", wu_template_file ); exit(1); } wu.appid = app.id; strcpy(result_template_path, "./"); strcat(result_template_path, result_template_file); retval = create_work( wu, wu_template, result_template_file, result_template_path, const_cast<const char **>(infiles), ninfiles, config, command_line, additional_xml ); if (retval) { fprintf(stderr, "create_work: %s\n", boincerror(retval)); exit(1); } else { if (show_wu_name) { printf("workunit name: %s\n", wu.name); } } if (assign_flag) { DB_ASSIGNMENT assignment; assignment.clear(); assignment.create_time = time(0); assignment.target_id = assign_id; assignment.target_type = assign_type; assignment.multi = assign_multi; assignment.workunitid = wu.id; retval = assignment.insert(); if (retval) { fprintf(stderr, "assignment.insert() failed: %s\n", boincerror(retval) ); exit(1); } sprintf(buf, "transitioner_flags=%d", assign_multi?TRANSITION_NONE:TRANSITION_NO_NEW_RESULTS ); retval = wu.update_field(buf); if (retval) { fprintf(stderr, "wu.update() failed: %s\n", boincerror(retval)); exit(1); } } boinc_db.close(); }
// Send targeted jobs of a given type. // NOTE: there may be an atomicity problem in the following. // Ideally it should be in a transaction. // bool send_jobs(int assign_type) { DB_ASSIGNMENT asg; DB_RESULT result; DB_WORKUNIT wu; int retval; bool sent_something = false; char query[256]; switch (assign_type) { case ASSIGN_USER: sprintf(query, "where target_type=%d and target_id=%lu and multi=0", ASSIGN_USER, g_reply->user.id ); break; case ASSIGN_HOST: sprintf(query, "where target_type=%d and target_id=%lu and multi=0", ASSIGN_HOST, g_reply->host.id ); break; case ASSIGN_TEAM: sprintf(query, "where target_type=%d and target_id=%lu and multi=0", ASSIGN_TEAM, g_reply->team.id ); break; } while (!asg.enumerate(query)) { if (!work_needed(false)) { asg.end_enumerate(); break; } // if the WU doesn't exist, delete the assignment record. // retval = wu.lookup_id(asg.workunitid); if (retval) { asg.delete_from_db(); continue; } if (!need_targeted_instance(wu, g_reply->host.id)) { continue; } // OK, send the job // if (config.debug_send) { log_messages.printf(MSG_NORMAL, "sending targeted job: %s\n", wu.name ); } retval = send_assigned_job(asg); if (retval) { log_messages.printf(MSG_NORMAL, "failed to send targeted job: %s\n", boincerror(retval) ); continue; } sent_something = true; // update the WU's transition time to time out this job // retval = wu.lookup_id(asg.workunitid); if (retval) continue; int new_tt = time(0) + wu.delay_bound; if (new_tt < wu.transition_time) { char buf2[256]; sprintf(buf2, "transition_time=%d", new_tt); wu.update_field(buf2); } } return sent_something; }
// return true if did anything // bool do_pass() { int retval = 0; // The number of workunits/results purged in a single pass of do_pass(). // Since do_pass() may be invoked multiple times, // corresponding global variables store global totals. // int do_pass_purged_workunits = 0; int do_pass_purged_results = 0; // check to see if we got a stop signal. // Note that if we do catch a stop signal here, // we call an exit handler that closes [and optionally compresses] files // before returning to the OS. // check_stop_daemons(); bool did_something = false; DB_WORKUNIT wu; char buf[256]; if (min_age_days) { char timestamp[15]; mysql_timestamp(dtime()-min_age_days*86400., timestamp); sprintf(buf, "where file_delete_state=%d and mod_time<'%s' limit %d", FILE_DELETE_DONE, timestamp, DB_QUERY_LIMIT ); } else { sprintf(buf, "where file_delete_state=%d limit %d", FILE_DELETE_DONE, DB_QUERY_LIMIT ); } int n=0; while (1) { retval = wu.enumerate(buf); if (retval) { if (retval != ERR_DB_NOT_FOUND) { log_messages.printf(MSG_DEBUG, "DB connection lost, exiting\n" ); exit(0); } break; } if (strstr(wu.name, "nodelete")) continue; did_something = true; // if archives have not already been opened, then open them. // if (!no_archive && !wu_stream) { open_all_archives(); } retval = purge_and_archive_results(wu, n); do_pass_purged_results += n; if (!no_archive) { retval= archive_wu(wu); if (retval) { log_messages.printf(MSG_CRITICAL, "Failed to write to XML file workunit:%d\n", wu.id ); exit(5); } log_messages.printf(MSG_DEBUG, "Archived workunit [%d] to a file\n", wu.id ); } // purge workunit from DB // if (!dont_delete) { retval= wu.delete_from_db(); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't delete workunit [%d] from database:%d\n", wu.id, retval ); exit(6); } } log_messages.printf(MSG_DEBUG, "Purged workunit [%d] from database\n", wu.id ); if (config.enable_assignment) { DB_ASSIGNMENT asg; char buf2[256]; sprintf(buf, "workunitid=%d", wu.id); asg.delete_from_db_multi(buf2); } purged_workunits++; do_pass_purged_workunits++; wu_stored_in_file++; if (!no_archive) { fflush(NULL); // if file has got max # of workunits, close and compress it. // This sets file pointers to NULL // if (max_wu_per_file && wu_stored_in_file>=max_wu_per_file) { close_all_archives(); wu_stored_in_file = 0; } } if (time_to_quit()) { break; } } if (do_pass_purged_workunits) { log_messages.printf(MSG_NORMAL, "Archived %d workunits and %d results\n", do_pass_purged_workunits, do_pass_purged_results ); } if (did_something && wu_stored_in_file>0) { log_messages.printf(MSG_DEBUG, "Currently open archive files contain %d workunits\n", wu_stored_in_file ); } if (do_pass_purged_workunits > DB_QUERY_LIMIT/2) { return true; } else { return false; } }
int SCHED_SHMEM::scan_tables() { DB_PLATFORM platform; DB_APP app; DB_APP_VERSION app_version; DB_ASSIGNMENT assignment; int i, j, n; n = 0; while (!platform.enumerate("where deprecated=0")) { platforms[n++] = platform; if (n == MAX_PLATFORMS) { overflow("platforms", "MAX_PLATFORMS"); } } nplatforms = n; n = 0; app_weight_sum = 0; while (!app.enumerate("where deprecated=0")) { if (n == MAX_APPS) { overflow("apps", "MAX_APPS"); } app_weight_sum += app.weight; if (app.locality_scheduling == LOCALITY_SCHED_LITE) { locality_sched_lite = true; } if (app.non_cpu_intensive) { have_nci_app = true; } if (config.non_cpu_intensive) { have_nci_app = true; app.non_cpu_intensive = true; } if (app.n_size_classes > 1) { char path[MAXPATHLEN]; sprintf(path, "../size_census_%s", app.name); #ifndef _USING_FCGI_ FILE* f = fopen(path, "r"); #else FCGI_FILE* f = FCGI::fopen(path, "r"); #endif if (!f) { log_messages.printf(MSG_CRITICAL, "Missing size census file for app %s\n", app.name ); return ERR_FOPEN; } for (int i=0; i<app.n_size_classes-1; i++) { char buf[256]; char* p = fgets(buf, 256, f); if (!p) { log_messages.printf(MSG_CRITICAL, "Size census file for app %s is too short\n", app.name ); return ERR_XML_PARSE; // whatever } app.size_class_quantiles[i] = atof(buf); } fclose(f); } apps[n++] = app; } napps = n; n = 0; // for each (app, platform) pair, // get all versions with numbers maximal in their plan class. // for (i=0; i<nplatforms; i++) { PLATFORM& splatform = platforms[i]; for (j=0; j<napps; j++) { APP& sapp = apps[j]; vector<APP_VERSION> avs; char query[1024]; sprintf(query, "where appid=%d and platformid=%d and deprecated=0", sapp.id, splatform.id ); while (!app_version.enumerate(query)) { avs.push_back(app_version); } for (unsigned int k=0; k<avs.size(); k++) { APP_VERSION& av1 = avs[k]; for (unsigned int kk=0; kk<avs.size(); kk++) { if (k == kk) continue; APP_VERSION& av2 = avs[kk]; if (!strcmp(av1.plan_class, av2.plan_class) && av1.version_num > av2.version_num) { av2.deprecated = 1; } } } for (unsigned int k=0; k<avs.size(); k++) { APP_VERSION& av1 = avs[k]; if (av1.deprecated) continue; if (av1.min_core_version && av1.min_core_version < 10000) { fprintf(stderr, "min core version too small - multiplying by 100\n"); av1.min_core_version *= 100; } if (av1.max_core_version && av1.max_core_version < 10000) { fprintf(stderr, "max core version too small - multiplying by 100\n"); av1.max_core_version *= 100; } app_versions[n++] = av1; if (n == MAX_APP_VERSIONS) { overflow("app_versions", "MAX_APP_VERSIONS"); } } } } napp_versions = n; // see which resources we have app versions for // for (i=0; i<NPROC_TYPES; i++) { have_apps_for_proc_type[i] = false; } for (i=0; i<napp_versions; i++) { APP_VERSION& av = app_versions[i]; if (strstr(av.plan_class, "cuda") || strstr(av.plan_class, "nvidia")) { have_apps_for_proc_type[PROC_TYPE_NVIDIA_GPU] = true; } else if (strstr(av.plan_class, "ati")) { have_apps_for_proc_type[PROC_TYPE_AMD_GPU] = true; } else if (strstr(av.plan_class, "intel_gpu")) { have_apps_for_proc_type[PROC_TYPE_INTEL_GPU] = true; } else { have_apps_for_proc_type[PROC_TYPE_CPU] = true; } } n = 0; while (!assignment.enumerate("where multi <> 0")) { assignments[n++] = assignment; if (n == MAX_ASSIGNMENTS) { overflow("assignments", "MAX_ASSIGNMENTS"); } } nassignments = n; return 0; }