function submit_batch($r) { xml_start_tag("submit_batch"); $app = get_submit_app((string) $r->batch->app_name); list($user, $user_submit) = authenticate_user($r, $app); $template = read_input_template($app, $r); $jobs = xml_get_jobs($r); validate_batch($jobs, $template); stage_files($jobs, $template); $njobs = count($jobs); $now = time(); $batch_id = (int) $r->batch->batch_id; if ($batch_id) { $batch = BoincBatch::lookup_id($batch_id); if (!$batch) { xml_error(-1, "BOINC server: no batch {$batch_id}"); } if ($batch->user_id != $user->id) { xml_error(-1, "BOINC server: not owner of batch"); } if ($batch->state != BATCH_STATE_INIT) { xml_error(-1, "BOINC server: batch not in init state"); } } // - compute batch FLOP count // - run adjust_user_priorities to increment user_submit.logical_start_time // - use that for batch logical end time and job priority // $total_flops = 0; foreach ($jobs as $job) { if ($job->rsc_fpops_est) { $total_flops += $job->rsc_fpops_est; } else { $x = (double) $template->workunit->rsc_fpops_est; if ($x) { $total_flops += $x; } else { xml_error(-1, "BOINC server: no rsc_fpops_est given"); } } } $cmd = "cd " . project_dir() . "/bin; ./adjust_user_priority --user {$user->id} --flops {$total_flops} --app {$app->name}"; $x = exec($cmd); if (!is_numeric($x) || (double) $x == 0) { xml_error(-1, "BOINC server: {$cmd} returned {$x}"); } $let = (double) $x; if ($batch_id) { $njobs = count($jobs); $ret = $batch->update("njobs={$njobs}, logical_end_time={$let}"); if (!$ret) { xml_error(-1, "BOINC server: batch->update() failed"); } } else { $batch_name = (string) $r->batch->batch_name; $batch_name = BoincDb::escape_string($batch_name); $batch_id = BoincBatch::insert("(user_id, create_time, njobs, name, app_id, logical_end_time, state) values ({$user->id}, {$now}, {$njobs}, '{$batch_name}', {$app->id}, {$let}, " . BATCH_STATE_INIT . ")"); if (!$batch_id) { xml_error(-1, "BOINC server: Can't create batch: " . BoincDb::error()); } $batch = BoincBatch::lookup_id($batch_id); } if ($r->batch->result_template_file) { $result_template_file = $r->batch->result_template_file; } else { $result_template_file = null; } if ($r->batch->workunit_template_file) { $workunit_template_file = $r->batch->workunit_template_file; } else { $workunit_template_file = null; } submit_jobs($jobs, $template, $app, $batch_id, $let, $result_template_file, $workunit_template_file); // set state to IN_PROGRESS only after creating jobs; // otherwise we might flag batch as COMPLETED // $ret = $batch->update("state= " . BATCH_STATE_IN_PROGRESS); if (!$ret) { xml_error(-1, "BOINC server: batch->update() failed"); } echo "<batch_id>{$batch_id}</batch_id>\n </submit_batch>\n "; }
function submit_batch($r) { $app = get_app($r); list($user, $user_submit) = authenticate_user($r, $app); $template = read_input_template($app); $jobs = xml_get_jobs($r); validate_batch($jobs, $template); stage_files($jobs, $template); $njobs = count($jobs); $now = time(); $batch_name = (string) $r->batch->batch_name; $batch_id = BoincBatch::insert("(user_id, create_time, njobs, name, app_id) values ({$user->id}, {$now}, {$njobs}, '{$batch_name}', {$app->id})"); $i = 0; foreach ($jobs as $job) { submit_job($job, $template, $app, $batch_id, $i++); } $batch = BoincBatch::lookup_id($batch_id); $batch->update("state=" . BATCH_STATE_IN_PROGRESS); echo "<batch_id>{$batch_id}</batch_id>\n"; }