// handle a scheduler request: // // - handle completed uploads // - handle set of files present on client // (update or create VDA_CHUNK_HOST record) // - handle files expected but not present // - issue delete commands if needed to enforce share // - issue upload or download commands to client // // relevant fields of SCHEDULER_REQUEST // file_infos: list of sticky files // file_xfer_results: list of completed file xfers // void handle_vda() { int retval; unsigned int i; CHUNK_LIST chunks; // chunks that are supposed to be on this host // if client is outdated, mark as dead // if (outdated_client(g_reply->host)) { g_reply->host.cpu_efficiency = 1; return; } // otherwise mark it as alive // g_reply->host.cpu_efficiency = 0; // enumerate the vda_chunk_host records for this host from DB // DB_VDA_CHUNK_HOST ch; char buf[256]; sprintf(buf, "where host_id=%d", g_reply->host.id); while (1) { retval = ch.enumerate(buf); if (retval == ERR_DB_NOT_FOUND) break; if (retval) { // if we didn't get a complete enumeration, // give up rather than continuing with partial info // log_messages.printf(MSG_NORMAL, "[vda]: ch.enumerate() failed %d\n", retval ); return; } if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[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.physical_file_name), ch) ); } // process completed uploads // (completed downloads are handled below) // for (i=0; i<g_request->file_xfer_results.size(); i++) { RESULT& r = g_request->file_xfer_results[i]; if (strstr(r.name, "upload_vda_")) { char* phys_file_name = r.name + strlen("upload_"); if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[vda] completed upload of %s\n", phys_file_name ); } retval = process_completed_upload(phys_file_name, chunks); if (retval) { log_messages.printf(MSG_CRITICAL, "[vda] process_completed_upload(): %d\n", retval ); return; } } } // process files present on client // for (i=0; i<g_request->file_infos.size(); i++) { FILE_INFO& fi = g_request->file_infos[i]; if (!starts_with(fi.name, "vda_")) { continue; } if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[vda] request: client has file %s, status %d\n", fi.name, fi.status ); } if (fi.status != FILE_PRESENT) { continue; } process_chunk_present_on_client(fi, chunks); } process_chunks_missing_on_client(chunks); enforce_quota(chunks); issue_transfer_commands(chunks); }
// handle a scheduler request: // // - handle completed uploads // - handle set of files present on client // (update or create VDA_CHUNK_HOST record) // - handle files expected but not present // - issue delete commands if needed to enforce share // - issue upload or download commands to client // // relevant fields of SCHEDULER_REQUEST // file_infos: list of sticky files // file_xfer_results: list of completed file xfers // void handle_vda() { int retval; unsigned int i; CHUNK_LIST chunks; // chunks that are supposed to be on this host // enumerate the vda_chunk_host records for this host from DB // DB_VDA_CHUNK_HOST ch; char buf[256]; sprintf(buf, "where host_id=%d", g_reply->host.id); while (1) { retval = ch.enumerate(buf); if (retval == ERR_DB_NOT_FOUND) break; if (retval) { // if we didn't get a complete enumeration, // give up rather than continuing with partial info // log_messages.printf(MSG_NORMAL, "[vda]: ch.enumerate() failed %d\n", retval ); return; } if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[vda] DB: has chunk %s\n", ch.name ); } chunks.insert(pair<string, DB_VDA_CHUNK_HOST>(string(ch.name), ch)); } // process completed uploads // for (i=0; i<g_request->file_xfer_results.size(); i++) { RESULT& r = g_request->file_xfer_results[i]; if (!starts_with(r.name, "vda_upload_")) continue; char* chunk_name = r.name + strlen("vda_upload_"); if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[vda] DB: completed upload %s\n", chunk_name ); } retval = process_completed_upload(chunk_name, chunks); if (retval) { log_messages.printf(MSG_CRITICAL, "[vda] process_completed_upload(): %d\n", retval ); return; } } // process files present on host // for (i=0; i<g_request->file_infos.size(); i++) { FILE_INFO& fi = g_request->file_infos[i]; if (!starts_with(fi.name, "vda_")) { continue; } if (config.debug_vda) { log_messages.printf(MSG_NORMAL, "[vda] request: client has file %s\n", fi.name ); } process_present_file(fi, chunks); } process_missing_chunks(chunks); enforce_quota(chunks); issue_transfer_commands(chunks); }