David 24 Apr 2007

- Server: add new database field host.error_rate.
        Stores a dynamic estimate of the fraction of the hosts's
        results that fail validation (updated by the validator).

    client/
        sim.C
        cs_prefs.C
    db/
        boinc_db.C,h
    html/ops/
        db_update.php
    sched/
        handle_request.C
        sched_msgs.h
        validator.C

svn path=/trunk/boinc/; revision=12466
This commit is contained in:
David Anderson 2007-04-24 23:21:42 +00:00
parent 8be1434696
commit 7e2b39c4db
17 changed files with 127 additions and 38 deletions

View File

@ -3954,3 +3954,20 @@ Rom 24 Apr 2007
win_build/
*.vcproj
David 24 Apr 2007
- Server: add new database field host.error_rate.
Stores a dynamic estimate of the fraction of the hosts's
results that fail validation (updated by the validator).
client/
sim.C
cs_prefs.C
db/
boinc_db.C,h
html/ops/
db_update.php
sched/
handle_request.C
sched_msgs.h
validator.C

View File

@ -407,7 +407,7 @@ void CLIENT_STATE::read_global_prefs() {
(host_info.m_nbytes*global_prefs.ram_max_used_idle_frac)/MEGA
);
msg_printf(NULL, MSG_INFO,
"Preferences: limit disk usage to %.2fGB",
"Preferences limit disk usage to %.2fGB",
allowed_disk_usage()/GIGA
);
// max_cpus, bandwidth limits may have changed

View File

@ -352,13 +352,14 @@ bool CLIENT_STATE::simulate_rpc(PROJECT* _p) {
wup->rsc_fpops_est = ap->fpops_est;
results.push_back(rp);
double ops = ap->fpops.sample();
if (ops < 0) ops = 0;
rp->final_cpu_time = ops/net_fpops;
rp->report_deadline = now + ap->latency_bound;
sprintf(buf, "got job %s: CPU time %.2f, deadline %s<br>",
rp->name, rp->final_cpu_time, time_to_string(rp->report_deadline)
);
html_msg += buf;
p->work_request -= ap->fpops_est/net_fpops;
p->work_request -= p->duration_correction_factor*ap->fpops_est/net_fpops;
}
p->work_request = 0;
request_schedule_cpus("simulate_rpc");
@ -920,7 +921,7 @@ void parse_error(char* file, int retval) {
}
void help(char* prog) {
fprintf(stderr, "usage: %s [--duration X] [--delta X]\n", prog);
fprintf(stderr, "usage: %s [--duration X] [--delta X] [--dirs ...]\n", prog);
exit(1);
}

View File

@ -358,7 +358,8 @@ void DB_HOST::db_print(char* buf){
"credit_per_cpu_sec=%.15e, "
"venue='%s', nresults_today=%d, "
"avg_turnaround=%f, "
"host_cpid='%s', external_ip_addr='%s', max_results_day=%d ",
"host_cpid='%s', external_ip_addr='%s', max_results_day=%d, "
"error_rate=%f ",
create_time, userid,
rpc_seqno, rpc_time,
total_credit, expavg_credit, expavg_time,
@ -376,7 +377,8 @@ void DB_HOST::db_print(char* buf){
credit_per_cpu_sec,
venue, nresults_today,
avg_turnaround,
host_cpid, external_ip_addr, max_results_day
host_cpid, external_ip_addr, max_results_day,
error_rate
);
UNESCAPE(domain_name);
UNESCAPE(serialnum);
@ -434,10 +436,12 @@ void DB_HOST::db_parse(MYSQL_ROW &r) {
strcpy2(host_cpid, r[i++]);
strcpy2(external_ip_addr, r[i++]);
max_results_day = atoi(r[i++]);
error_rate = atof(r[i++]);
}
// update fields that differ from the argument HOST.
// called from scheduler (handle_request.C)
// Update fields that differ from the argument HOST.
// Called from scheduler (handle_request.C),
// so only include fields modified by the scheduler.
//
int DB_HOST::update_diff(HOST& h) {
char buf[LARGE_BLOB_SIZE], updates[LARGE_BLOB_SIZE], query[LARGE_BLOB_SIZE];

View File

@ -280,6 +280,8 @@ struct HOST {
char external_ip_addr[256]; // IP address seen by scheduler
int max_results_day; // maximum # of results to send per day per CPU
// this is dynamically adjusted to limit work sent to bad hosts
double error_rate; // dynamic estimate of fraction of results
// that fail validation
// the following not stored in DB
//

View File

@ -6,8 +6,9 @@
html/
inc/
host.inc (host)
ops/
db_ops.inc
ops/
db_update.php
user/
create_account_action.php (user)
team_create_action.php (team)
@ -167,6 +168,7 @@ create table host (
host_cpid varchar(254),
external_ip_addr varchar(254),
max_results_day integer not null,
error_rate double not null default 0,
primary key (id)
) type=InnoDB;

View File

@ -1,6 +1,17 @@
<?
$project_news = array(
array("April 23, 2007",
"Krystof Dolezal's
<a href=http://www.kd-web.info/clanky.php>Flash-based BOINC tutorials</a>
are now available in English and Slovak,
as well as Czech."
),
array("April 23, 2007",
"BOINCstats and BAM! are now available in the Czech language
(<a href=http://cz.boincstats.com>http://cz.boincstats.com</a>).
Thanks to Zelvuska for the translation."
),
array("April 17, 2007",
"<a href=http://desktopgrid.hu/>Desktopgrid.hu</a>
has been created by the Computer and Automation Research Institute

View File

@ -68,7 +68,7 @@ function show_participate() {
".sprintf(tr(HOME_P3), "<a href=help.php>", "</a>")."
<center>
<a href=download.php><b>".tr(HOME_DOWNLOAD)."</b></a>
| <a href=participate.php><b><nobr>".tr(HOME_MORE_INFO)."</nobr></b></a>
| <a href=trac/wiki/RunningBoinc><b><nobr>".tr(HOME_MORE_INFO)."</nobr></b></a>
| <a href=links.php><b><nobr>".tr(HOME_WEB_SITES)."</nobr></b></a>
| <a href=addons.php><b>".tr(HOME_ADD_ONS)."</b></a>
| <a href=poll.php><b><nobr>".tr(HOME_SURVEY)."</nobr></b></a>
@ -109,10 +109,10 @@ function show_other() {
<tr><td bgcolor=$light_blue><font size=4>Other info</font></td></tr>
<tr><td>
<ul>
<li> <a href=intro.php>Overview</a>
<li> <a href=trac/wiki/BoincIntro/>Overview</a>
<li> <a href=trac/>Software development</a>
<li> <a href=translation.php>Translation</a> of web and GUI text
<li> <a href=contact.php>Personnel and contributors</a>
<li> <a href=trac/wiki/ProjectPeople>Personnel and contributors</a>
<li> BOINC <a href=email_lists.php>email lists</a>
<li> BOINC <a href=dev/>message boards</a>
<li> <a href=papers.php>Papers and talks</a> about BOINC
@ -190,9 +190,4 @@ echo "
";
page_tail(true, true);
echo "
<script language=\"JavaScript\" type=\"text/javascript\" src=\"wz_tooltip.js\"></script>
</body>
</html>
";
?>

View File

@ -118,7 +118,7 @@ Show if the servers of various projects are up or down.
<h3>Miscellaneous</h3>
";
$misc_sites = array(
array("http://www.kd-web.info/clanky.php", "Flash-based BOINC tutorial", "(in Czech)"),
array("http://www.kd-web.info/clanky.php", "Flash-based BOINC tutorial", "(in Czech, English, and Slovak)"),
array("http://www.myboinc.com/", "BOINC Users of the Day"),
array("http://groups.myspace.com/BOINConMYSPACE", "BOINC on MySpace"),
array("http://www.boincuk.com/repository.php", "bunc", "(excellent newsletter produced by BOINC UK)"),
@ -196,14 +196,14 @@ language("English", array(
));
language("Estonian", array(
site("http://boinc.tmac.pri.ee", "boinc.tmac.pri.ee"),
site("http://setimehed.net/", "setimehed.net"),
//site("http://setimehed.net/", "setimehed.net"),
));
language("Finnish", array(
site( "http://www.universe-examiners.org/",
"Universe Examiners"),
site(
"http://news.universe-examiners.org/asennus/boinc.html",
"BOINC instructions in Finnish")
//site("http://news.universe-examiners.org/asennus/boinc.html",
// "BOINC instructions in Finnish"
//),
));
language("French", array(
site("http://boincfrance.org", "BOINCFRANCE.ORG"),
@ -247,7 +247,7 @@ language("Korean", array(
));
language("Polish", array(
site("http://www.boinc-polska.org/", "BOINC-Polska.org"),
//site("http://www.boinc-polska.org/", "BOINC-Polska.org"),
site("http://www.boinc.org.pl/", "Team boinc.pl"),
site("http://www.boinc.prv.pl", "BOINC@Kolobrzeg"),
site("http://www.boincatpoland.org", "BOINC@Poland"),

View File

@ -62,7 +62,7 @@ $logos = array(
<img src=logos/markus/Logo2/MarkusBoinc.jpg>
<br>... and <a href=logos/markus>various others</a>"
),
array("<a href=http://www.boincproject.org/>Invisible Design</a>",
array("Invisible Design",
"<img src=logos/logo.boinc.240x80-01.jpg>
... and <a href=logos/>many variants</a> in different sizes and colors,
and for specific countries."

View File

@ -1,6 +1,6 @@
<?php
require_once("docutil.php");
page_head("Project creation cookbook");
page_head("Project creation cookbook [Deprecated - wiki]");
echo "
<h2>Make skeletal project</h2>
<ul>

View File

@ -97,7 +97,7 @@ the character set (e.g. iso-8859-1) used in the translation.
Here are links to the translation files for
<ul>
<li> <a href=http://boinc.berkeley.edu/trac/browser/trunk/boinc/languages/translations/>this web site</a>
<li> <a href=http://boinc.berkeley.edu/trac/browser/trunk/boinc/html/languages/translations/>the BOINC-supplied part of project web sites.
<li> <a href=http://boinc.berkeley.edu/trac/browser/trunk/boinc/html/languages/translations/>the BOINC-supplied part of project web sites</a>.
<li> <a href=http://boinc.berkeley.edu/trac/browser/trunk/boinc/locale/client/>the BOINC Manager</a>.
</ul>

View File

@ -1,7 +1,7 @@
<?php
require_once("docutil.php");
page_head("Simple validator framework");
page_head("Simple validator framework [deprecated: SimpleValidation]");
echo "
To create a validator using the simple framework,
you must supply four functions:

View File

@ -360,6 +360,11 @@ function update_4_07_2007() {
);
}
function update_4_24_2007() {
do_query('alter table host add error_rate double not null default 0');
}
// modify the following to call the function you want.
// Make sure you do all needed functions, in order.
// (Look at your DB structure using "explain" queries to see

View File

@ -330,6 +330,7 @@ make_new_host:
host.userid = reply.user.id;
host.rpc_seqno = 0;
host.expavg_time = time(0);
host.error_rate = 0.1;
strcpy(host.venue, reply.user.venue);
host.fix_nans();
retval = host.insert();

View File

@ -23,10 +23,10 @@
#include "msg_log.h"
class SCHED_MSG_LOG : public MSG_LOG {
int debug_level;
const char* v_format_kind(int kind) const;
bool v_message_wanted(int kind) const;
public:
int debug_level;
enum Kind {
MSG_CRITICAL=1,
MSG_NORMAL=2,

View File

@ -79,11 +79,20 @@ double max_granted_credit = 0;
double max_claimed_credit = 0;
bool grant_claimed_credit = false;
void update_error_rate(DB_HOST& host, bool valid) {
if (host.error_rate > 1) host.error_rate = 1;
if (host.error_rate <= 0) host.error_rate = 0.1;
//
host.error_rate *= 0.95;
if (!valid) {
host.error_rate += 0.05;
}
}
// here when a result has been validated and its granted_credit as been set.
// grant credit to host, user and team
// Here when a result has been validated and its granted_credit as been set.
// Grant credit to host, user and team, and update host error rate.
//
int grant_credit(RESULT& result) {
int is_valid(RESULT& result) {
DB_USER user;
DB_HOST host;
DB_TEAM team;
@ -147,10 +156,12 @@ int grant_credit(RESULT& result) {
);
}
double old_error_rate = host.error_rate;
update_error_rate(host, true);
sprintf(
buf,
"total_credit=total_credit+%f, expavg_credit=%f, expavg_time=%f, avg_turnaround=%f, credit_per_cpu_sec=%f",
result.granted_credit, host.expavg_credit, host.expavg_time, host.avg_turnaround, host.credit_per_cpu_sec
"total_credit=total_credit+%f, expavg_credit=%f, expavg_time=%f, avg_turnaround=%f, credit_per_cpu_sec=%f, error_rate=%f",
result.granted_credit, host.expavg_credit, host.expavg_time, host.avg_turnaround, host.credit_per_cpu_sec, host.error_rate
);
retval = host.update_field(buf);
if (retval) {
@ -160,6 +171,10 @@ int grant_credit(RESULT& result) {
result.id, result.hostid, retval
);
}
log_messages.printf(SCHED_MSG_LOG::MSG_DEBUG,
"[HOST#%d] error rate %f->%f\n",
host.id, old_error_rate, host.error_rate
);
if (user.teamid) {
retval = team.lookup_id(user.teamid);
@ -189,6 +204,39 @@ int grant_credit(RESULT& result) {
return 0;
}
int is_invalid(RESULT& result) {
char buf[256];
int retval;
DB_HOST host;
retval = host.lookup_id(result.hostid);
if (retval) {
log_messages.printf(
SCHED_MSG_LOG::MSG_CRITICAL,
"[RESULT#%d] lookup of host %d failed %d\n",
result.id, result.hostid, retval
);
return retval;
}
double old_error_rate = host.error_rate;
update_error_rate(host, false);
sprintf(buf, "error_rate=%f", host.error_rate);
retval = host.update_field(buf);
if (retval) {
log_messages.printf(
SCHED_MSG_LOG::MSG_CRITICAL,
"[RESULT#%d] update of host %d failed %d\n",
result.id, result.hostid, retval
);
return retval;
}
log_messages.printf(SCHED_MSG_LOG::MSG_DEBUG,
"[HOST#%d] invalid result; error rate %f->%f\n",
host.id, old_error_rate, host.error_rate
);
return 0;
}
// Return zero iff we resolved the WU
//
int handle_wu(
@ -277,7 +325,7 @@ int handle_wu(
"[RESULT#%d %s] pair_check() matched: setting result to valid; credit %f\n",
result.id, result.name, result.granted_credit
);
retval = grant_credit(result);
retval = is_valid(result);
if (retval) {
log_messages.printf(
SCHED_MSG_LOG::MSG_NORMAL,
@ -293,6 +341,7 @@ int handle_wu(
"[RESULT#%d %s] pair_check() didn't match: setting result to invalid\n",
result.id, result.name
);
is_invalid(result);
}
if (update_result) {
log_messages.printf(
@ -385,11 +434,11 @@ int handle_wu(
if (max_granted_credit && result.granted_credit > max_granted_credit) {
result.granted_credit = max_granted_credit;
}
retval = grant_credit(result);
retval = is_valid(result);
if (retval) {
log_messages.printf(
SCHED_MSG_LOG::MSG_DEBUG,
"[RESULT#%d %s] grant_credit() failed: %d\n",
"[RESULT#%d %s] is_valid() failed: %d\n",
result.id, result.name, retval
);
}
@ -400,6 +449,7 @@ int handle_wu(
);
break;
case VALIDATE_STATE_INVALID:
is_invalid(result);
update_result = true;
break;
case VALIDATE_STATE_INIT:
@ -426,8 +476,7 @@ int handle_wu(
// the transitioner - doing so creates a race condition
//
transition_time = NEVER;
log_messages.printf(
SCHED_MSG_LOG::MSG_DEBUG,
log_messages.printf(SCHED_MSG_LOG::MSG_DEBUG,
"[WU#%d %s] Found a canonical result: id=%d\n",
wu.id, wu.name, canonicalid
);
@ -643,7 +692,9 @@ int main(int argc, char** argv) {
exit(1);
}
log_messages.printf(SCHED_MSG_LOG::MSG_NORMAL, "Starting validator\n");
log_messages.printf(SCHED_MSG_LOG::MSG_NORMAL,
"Starting validator, debug level %d\n", log_messages.debug_level
);
if (wu_id_modulus) {
log_messages.printf(SCHED_MSG_LOG::MSG_NORMAL,
"Modulus %d, remainder %d\n", wu_id_modulus, wu_id_remainder