// 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; }
// 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; }
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 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; }