- volunteer data storage: intermediate checkin

svn path=/trunk/boinc/; revision=25890
This commit is contained in:
David Anderson 2012-07-25 21:41:32 +00:00
parent 5ca65f184a
commit 6e816094bd
10 changed files with 92 additions and 48 deletions

View File

@ -5058,3 +5058,17 @@ David 23 July 2012
client/
current_version.cpp
David 25 July 2012
- volunteer data storage: intermediate checkin
vda/
vda.cpp
ssim.cpp
vdad.cpp
sched_vda.cpp
vda_lib2.cpp
db/
boinc_db_types.h
boinc_db.cpp
schema_vda.sql

View File

@ -2381,7 +2381,7 @@ void DB_VDA_CHUNK_HOST::db_print(char* buf) {
"create_time=%f, "
"vda_file_id=%d, "
"host_id=%d, "
"chunk_name='%s', "
"physical_file_name='%s', "
"present_on_host=%d, "
"transfer_in_progress=%d, "
"transfer_wait=%d, "
@ -2390,7 +2390,7 @@ void DB_VDA_CHUNK_HOST::db_print(char* buf) {
create_time,
vda_file_id,
host_id,
chunk_name,
physical_file_name,
present_on_host,
transfer_in_progress,
transfer_wait,
@ -2405,7 +2405,7 @@ void DB_VDA_CHUNK_HOST::db_parse(MYSQL_ROW &r) {
create_time = atof(r[i++]);
vda_file_id = atoi(r[i++]);
host_id = atoi(r[i++]);
strcpy(chunk_name, r[i++]);
strcpy(physical_file_name, r[i++]);
present_on_host = (atoi(r[i++]) != 0);
transfer_in_progress = (atoi(r[i++]) != 0);
transfer_wait = (atoi(r[i++]) != 0);

View File

@ -692,7 +692,7 @@ struct VDA_CHUNK_HOST {
double create_time;
int vda_file_id;
int host_id;
char chunk_name[256]; // C1.C2.Cn
char physical_file_name[256]; // e.g. vda_467_0_file.ext
bool present_on_host;
bool transfer_in_progress;
bool transfer_wait;

View File

@ -17,7 +17,7 @@ create table vda_chunk_host (
create_time double not null default 0,
vda_file_id integer not null default 0,
host_id integer not null default 0,
chunk_name varchar(254) not null,
physical_file_name varchar(254) not null,
present_on_host tinyint not null default 0,
transfer_in_progress tinyint not null default 0,
transfer_wait tinyint not null default 0,

View File

@ -26,6 +26,14 @@ $cogsci = array(
$biomed = array(
tra("Biology and Medicine"),
array(
array(
"FightMalaria@Home",
"http://boinc.ucd.ie/fmah",
tra("University College Dublin"),
tra("Antimalarial drug discovery"),
tra("The parasite that causes malaria continues to evolve resistance to available medication. We therefore urgently need to discover new drugs to replace existing drugs. Importantly, these new drugs need to target NEW proteins in the parasite. The FightMalaria@Home project is aimed at finding these new targets."),
"fmah_banner3.png"
),
array(
"POEM@HOME",
"http://boinc.fzk.de/poem/",

View File

@ -200,7 +200,7 @@ static void process_present_file(FILE_INFO& fi, CHUNK_LIST& chunks) {
}
DB_VDA_FILE vf;
sprintf(buf, "file_name='%s'", fname);
sprintf(buf, "where file_name='%s'", fname);
retval = vf.lookup(buf);
if (retval) {
log_messages.printf(MSG_CRITICAL, "No VDA file %s\n", fname);
@ -223,8 +223,8 @@ static void process_present_file(FILE_INFO& fi, CHUNK_LIST& chunks) {
ch.create_time = dtime();
ch.vda_file_id = vf.id;
ch.host_id = g_reply->host.id;
strcpy(ch.chunk_name, chunk_name);
ch.present_on_host = 1;
strcpy(ch.physical_file_name, fi.name);
ch.present_on_host = true;
ch.transfer_in_progress = false;
ch.transfer_wait = false;
ch.transfer_request_time = 0;
@ -258,12 +258,13 @@ static int process_missing_chunks(CHUNK_LIST& chunks) {
if (!ch.found) {
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] in DB but not on client: %s\n", ch.chunk_name
"[vda] in DB but not on client: %s\n", ch.physical_file_name
);
}
char buf[256];
sprintf(buf, "host_id=%d and vda_file_id=%d and chunk_name='%s'",
ch.host_id, ch.vda_file_id, ch.chunk_name
sprintf(buf,
"host_id=%d and vda_file_id=%d and physical_file_name='%s'",
ch.host_id, ch.vda_file_id, ch.physical_file_name
);
int retval = ch.delete_from_db_multi(buf);
if (retval) {
@ -296,10 +297,10 @@ static int enforce_quota(CHUNK_LIST& chunks) {
DB_VDA_CHUNK_HOST& ch = it->second;
if (!ch.found) continue;
FILE_INFO fi;
strcpy(fi.name, ch.chunk_name);
strcpy(fi.name, ch.physical_file_name);
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] deleting: %s\n", ch.chunk_name
"[vda] deleting: %s\n", ch.physical_file_name
);
}
DB_VDA_FILE vf;
@ -314,7 +315,7 @@ static int enforce_quota(CHUNK_LIST& chunks) {
// issue upload and download commands
//
static int issue_transfer_commands(CHUNK_LIST& chunks) {
char xml_buf[8192], file_name[1024];
char xml_buf[8192], chunk_name[256], file_name[1024];
int retval;
char url[1024];
@ -328,20 +329,18 @@ static int issue_transfer_commands(CHUNK_LIST& chunks) {
retval = vf.lookup_id(ch.vda_file_id);
if (retval) return retval;
if (ch.present_on_host) {
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] sending upload command: %s\n", ch.chunk_name
);
}
// upload
//
physical_file_name(
g_reply->host.id, ch.chunk_name, vf.file_name, file_name
);
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] sending command to upload %s\n",
ch.physical_file_name
);
}
urls.push_back(config.upload_url);
R_RSA_PRIVATE_KEY key;
retval = get_file_xml(
file_name,
ch.physical_file_name,
urls,
vf.chunk_size,
dtime() + VDA_HOST_TIMEOUT,
@ -350,22 +349,30 @@ static int issue_transfer_commands(CHUNK_LIST& chunks) {
xml_buf
);
} else {
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] sending download command: %s\n", ch.chunk_name
);
}
// download
//
char md5[64], chunk_dir[1024];
sprintf(file_name, "%s__%s", ch.chunk_name, vf.file_name);
get_chunk_url(vf, ch.chunk_name, url);
int hostid;
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] sending command to download %s\n",
ch.physical_file_name
);
}
parse_physical_filename(
ch.physical_file_name,
hostid,
chunk_name,
file_name
);
get_chunk_url(vf, chunk_name, url);
urls.push_back(url);
get_chunk_dir(vf, ch.chunk_name, chunk_dir);
get_chunk_dir(vf, chunk_name, chunk_dir);
retval = get_chunk_md5(chunk_dir, md5);
if (retval) return retval;
retval = put_file_xml(
file_name,
ch.physical_file_name,
urls,
md5,
vf.chunk_size,
@ -416,11 +423,12 @@ void handle_vda() {
}
if (config.debug_vda) {
log_messages.printf(MSG_NORMAL,
"[vda] DB: has chunk %s\n", ch.chunk_name
"[vda] DB: has chunk %s, file %d\n",
ch.physical_file_name, ch.vda_file_id
);
}
chunks.insert(
pair<string, DB_VDA_CHUNK_HOST>(string(ch.chunk_name), ch)
pair<string, DB_VDA_CHUNK_HOST>(string(ch.physical_file_name), ch)
);
}

View File

@ -259,7 +259,7 @@ void CHUNK_ON_HOST::start_upload() {
transfer_wait = true;
t = sim.now + drand()*params.connect_interval;
#ifdef EVENT_DEBUG
printf("%s: waiting to start upload of %s\n", now_str(), chunk_name);
printf("%s: waiting to start upload of %s\n", now_str(), physical_file_name);
#endif
sim.insert(this);
}
@ -269,7 +269,7 @@ void CHUNK_ON_HOST::start_download() {
transfer_wait = true;
t = sim.now + drand()*params.connect_interval;
#ifdef EVENT_DEBUG
printf("%s: waiting to start download of %s\n", now_str(), chunk_name);
printf("%s: waiting to start download of %s\n", now_str(), physical_file_name);
#endif
sim.insert(this);
}
@ -282,7 +282,7 @@ void CHUNK_ON_HOST::handle() {
transfer_wait = false;
if (present_on_host) {
#ifdef EVENT_DEBUG
printf("%s: starting upload of %s\n", now_str(), chunk_name);
printf("%s: starting upload of %s\n", now_str(), physical_file_name);
#endif
chunk->parent->dfile->upload_rate.sample_inc(
host->transfer_rate,
@ -291,7 +291,7 @@ void CHUNK_ON_HOST::handle() {
);
} else {
#ifdef EVENT_DEBUG
printf("%s: starting download of %s\n", now_str(), chunk_name);
printf("%s: starting download of %s\n", now_str(), physical_file_name);
#endif
chunk->parent->dfile->download_rate.sample_inc(
host->transfer_rate,
@ -307,7 +307,7 @@ void CHUNK_ON_HOST::handle() {
if (present_on_host) {
// it was an upload
#ifdef EVENT_DEBUG
printf("%s: upload of %s completed\n", now_str(), chunk_name);
printf("%s: upload of %s completed\n", now_str(), physical_file_name);
#endif
chunk->parent->dfile->upload_rate.sample_inc(
-host->transfer_rate,
@ -318,7 +318,7 @@ void CHUNK_ON_HOST::handle() {
} else {
present_on_host = true;
#ifdef EVENT_DEBUG
printf("%s: download of %s completed\n", now_str(), chunk_name);
printf("%s: download of %s completed\n", now_str(), physical_file_name);
#endif
chunk->parent->dfile->download_rate.sample_inc(
-host->transfer_rate,
@ -397,7 +397,7 @@ int CHUNK::assign() {
sim.insert(h);
#endif
CHUNK_ON_HOST *c = new CHUNK_ON_HOST();
sprintf(c->chunk_name, "chunk %s on host %d", name, h->id);
sprintf(c->physical_file_name, "chunk %s on host %d", name, h->id);
#ifdef EVENT_DEBUG
printf("%s: assigning chunk %s to host %d\n", now_str(), name, h->id);
#endif
@ -429,7 +429,7 @@ void CHUNK::host_failed(VDA_CHUNK_HOST* p) {
set<VDA_CHUNK_HOST*>::iterator i = hosts.find(p);
hosts.erase(i);
#ifdef EVENT_DEBUG
printf("%s: handling loss of %s\n", now_str(), p->chunk_name);
printf("%s: handling loss of %s\n", now_str(), p->physical_file_name);
#endif
SIM_FILE* sfp = (SIM_FILE*)parent->dfile;
sfp->recover();

View File

@ -127,7 +127,7 @@ int handle_add(const char* path) {
strcpy(vf.dir, dir);
strcpy(vf.file_name, filename);
vf.size = size;
vf.chunk_size = policy.chunk_size();
vf.chunk_size = 0; // don't know this yet; set by vdad
vf.need_update = 1;
vf.initialized = 0;
vf.retrieving = 0;

View File

@ -77,7 +77,13 @@ void encoder_filename(
}
int get_chunk_numbers(VDA_CHUNK_HOST& vch, vector<int>& chunk_numbers) {
char* p = vch.chunk_name;
char buf[256];
strcpy(buf, vch.physical_file_name); // vda_hostid_chunknums_filename
char* p = buf;
p = strchr(p, '_') + 1;
p = strchr(p, '_') + 1;
char* q = strchr(p, '_') + 1;
*q = 0;
while (1) {
int i = atoi(p);
chunk_numbers.push_back(i);
@ -272,7 +278,9 @@ int CHUNK::assign() {
ch.create_time = dtime();
ch.vda_file_id = parent->dfile->id;
ch.host_id = host_id;
strcpy(ch.chunk_name, name);
physical_file_name(
host_id, name, parent->dfile->file_name, ch.physical_file_name
);
ch.present_on_host = 0;
ch.transfer_in_progress = true;
ch.transfer_wait = true;

View File

@ -72,7 +72,8 @@ int handle_file(VDA_FILE_AUX& vf, DB_VDA_FILE& dvf) {
log_messages.printf(MSG_CRITICAL, "vf.init failed %d\n", retval);
return retval;
}
dvf.update_field("initialized=1");
sprintf(buf, "initialized=1, chunk_size=%.0f", vf.policy.chunk_size());
dvf.update_field(buf);
}
retval = vf.meta_chunk->recovery_plan();
if (retval) {
@ -110,8 +111,13 @@ bool scan_files() {
);
exit(1);
} else {
vf.need_update = 0;
vf.update();
retval = vf.update_field("need_update=0");
if (retval) {
log_messages.printf(
MSG_CRITICAL, "update_field() failed: %d\n", retval
);
exit(1);
}
}
}
return found;