mirror of https://github.com/BOINC/boinc.git
Added a few functions to test.inc. One now has the ability to remove and reinstall parts of a project. These functions can be used while running the client asynchronously and can be used to test the expononetial backoff and recovery mechanism of the client.
Added two files: test_sched_failure.php which can be used to test recovery on scheduler failures test_masterurl_failure.php which can be used to test recovery on masterurl failures Fixed a couple of bugs in cs_scheduler.C and scheduler_op.C svn path=/trunk/boinc/; revision=624
This commit is contained in:
parent
53908f3cbe
commit
ffc115afa2
|
@ -172,7 +172,7 @@ class Project {
|
|||
run_db_script("constraints.sql", $this->db_name);
|
||||
|
||||
db_open($this->db_name);
|
||||
db_query("insert into project(name) values('$this->name')");
|
||||
db_query("insert into project(name) values('$this->name')");
|
||||
|
||||
for ($i=0; $i<sizeof($this->users); $i++) {
|
||||
$user = $this->users[$i];
|
||||
|
@ -271,7 +271,77 @@ class Project {
|
|||
$admin_url = $html_url."/".$this->name."/html_ops/index.html";
|
||||
echo "The admin URL for project $this->name is $admin_url\n";
|
||||
}
|
||||
|
||||
//moves the masterindex file to temp after $time seconds (if not null).This is used to test exponential backoff on the client side.
|
||||
function delete_masterindex($time)
|
||||
{
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("mv $this->project_dir/html_user/index.php $this->project_dir/html_user/temp");
|
||||
}
|
||||
|
||||
//moves temp back to the masterindex after $time seconds(if not null). This is used to test exponential backoff on the client side.
|
||||
|
||||
function reestablish_masterindex($time)
|
||||
{
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("mv $this->project_dir/html_user/temp $this->project_dir/html_user/index.php");
|
||||
|
||||
}
|
||||
|
||||
//delete the cgi file for this project after $time if not null. This is used to test exponential backoff on the client side.
|
||||
function delete_scheduler($time)
|
||||
{
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("rm $this->project_dir/cgi/cgi");
|
||||
}
|
||||
|
||||
//copies the cgi file back into the cgi directory.This is used to test exponential backoff on the client side.
|
||||
function reinstall_scheduler($time)
|
||||
{
|
||||
|
||||
$source_dir = get_env_var("BOINC_SRC_DIR");
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("cp $source_dir/sched/cgi $this->project_dir/cgi/");
|
||||
}
|
||||
|
||||
//moves the download directory to temp. This is used to test exponential backoff on the client side.
|
||||
function delete_downloaddir($time)
|
||||
{
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("mv $this->project_dir/download/ $this->project_dir/temp/");
|
||||
}
|
||||
|
||||
//reinstalls the download directory. This is used to test exponential backoff on the client side.
|
||||
function reinstall_downloaddir($time)
|
||||
{
|
||||
if($time != null)
|
||||
{
|
||||
echo "\nsleeping for $time seconds";
|
||||
PassThru("sleep $time");
|
||||
}
|
||||
PassThru("mv $this->project_dir/temp/ $this->project_dir/download/");
|
||||
}
|
||||
|
||||
function start_feeder(){
|
||||
PassThru("cd $this->project_dir/cgi; ./feeder -asynch > feeder_out");
|
||||
}
|
||||
|
@ -291,6 +361,9 @@ class Project {
|
|||
fclose($f);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
function check_results($ntarget, $result) {
|
||||
$n = 0;
|
||||
db_open($this->db_name);
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
#! /usr/local/bin/php
|
||||
<?php
|
||||
//This tests the exponential backoff mechanism on the client in case of master IURL failures
|
||||
//This test is not automated. It has to be run, and then client.out (in the host directory) must be looked at to examine wether everything is working correctly.
|
||||
|
||||
include_once("test.inc");
|
||||
|
||||
$project = new Project;
|
||||
$user = new User();
|
||||
$host = new Host($user);
|
||||
|
||||
$app = new App("upper_case");
|
||||
$app_version = new App_Version($app);
|
||||
|
||||
// the following is optional (makes client web download possible)
|
||||
$core_app = new App("core client");
|
||||
$core_app_version = new App_Version($core_app);
|
||||
$project->add_app($core_app);
|
||||
$project->add_app_version($core_app_version);
|
||||
|
||||
$project->add_user($user);
|
||||
$project->add_app($app);
|
||||
$project->add_app_version($app_version);
|
||||
|
||||
$project->install(); // must install projects before adding to hosts
|
||||
|
||||
$host->log_flags = "log_flags.xml";
|
||||
$host->add_project($project);
|
||||
$host->install();
|
||||
|
||||
echo "adding work\n";
|
||||
|
||||
$work = new Work($app);
|
||||
$work->wu_template = "uc_wu";
|
||||
$work->result_template = "uc_result";
|
||||
$work->nresults = 2;
|
||||
$work->delay_bound = 10;
|
||||
array_push($work->input_files, "input");
|
||||
$work->install($project);
|
||||
|
||||
$project->start_feeder();
|
||||
$project->delete_masterindex(null);
|
||||
$pid = $host->run_asynch("-exit_when_idle");
|
||||
$project->reestablish_masterindex(100);
|
||||
$status = 0;
|
||||
pcntl_waitpid($pid,$status,0);
|
||||
$project->stop();
|
||||
|
||||
$result->state = RESULT_STATE_DONE;
|
||||
$result->stderr_out = "APP: upper_case: starting, argc 1";
|
||||
$result->exit_status = 0;
|
||||
$project->check_results(2, $result);
|
||||
$project->compare_file("uc_wu_0_0", "uc_correct_output");
|
||||
$project->compare_file("uc_wu_1_0", "uc_correct_output");
|
||||
?>
|
|
@ -0,0 +1,57 @@
|
|||
#! /usr/local/bin/php
|
||||
<?php
|
||||
//This tests the exponential backoff mechanism on the client in case of scheduling server failures.
|
||||
//This test is not automated. It has to be run, and then client.out (in the host directory) must be looked at to examine wether everything is working correctly.
|
||||
include_once("test.inc");
|
||||
|
||||
$project = new Project;
|
||||
$user = new User();
|
||||
$host = new Host($user);
|
||||
|
||||
$app = new App("upper_case");
|
||||
$app_version = new App_Version($app);
|
||||
|
||||
// the following is optional (makes client web download possible)
|
||||
$core_app = new App("core client");
|
||||
$core_app_version = new App_Version($core_app);
|
||||
$project->add_app($core_app);
|
||||
$project->add_app_version($core_app_version);
|
||||
|
||||
$project->add_user($user);
|
||||
$project->add_app($app);
|
||||
$project->add_app_version($app_version);
|
||||
|
||||
$project->install(); // must install projects before adding to hosts
|
||||
|
||||
$host->log_flags = "log_flags.xml";
|
||||
$host->add_project($project);
|
||||
$host->install();
|
||||
|
||||
echo "adding work\n";
|
||||
|
||||
$work = new Work($app);
|
||||
$work->wu_template = "uc_wu";
|
||||
$work->result_template = "uc_result";
|
||||
$work->nresults = 2;
|
||||
$work->delay_bound = 10;
|
||||
array_push($work->input_files, "input");
|
||||
$work->install($project);
|
||||
|
||||
$project->start_feeder();
|
||||
//delete the scheduler immediately
|
||||
$project->delete_scheduler(null);
|
||||
$pid = $host->run_asynch("-exit_when_idle");
|
||||
//reinstall scheduler after 500 seconds
|
||||
$project->reinstall_scheduler(500);
|
||||
$status = 0;
|
||||
//wait until the host has stopped running
|
||||
pcntl_waitpid($pid,$status,0);
|
||||
$project->stop();
|
||||
|
||||
$result->state = RESULT_STATE_DONE;
|
||||
$result->stderr_out = "APP: upper_case: starting, argc 1";
|
||||
$result->exit_status = 0;
|
||||
$project->check_results(2, $result);
|
||||
$project->compare_file("uc_wu_0_0", "uc_correct_output");
|
||||
$project->compare_file("uc_wu_1_0", "uc_correct_output");
|
||||
?>
|
Loading…
Reference in New Issue