// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2012 University of California // // BOINC is free software; you can redistribute it and/or modify it // under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation, // either version 3 of the License, or (at your option) any later version. // // BOINC is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with BOINC. If not, see . #include #include #include "boinc_db.h" #include "util.h" #include "vda_lib.h" // return the name of a file created by Jerasure's encoder // // encoder creates files with names of the form // Coding/fname_k01.ext // Coding/fname_m01.ext // void encoder_filename( const char* base, const char* ext, CODING& c, int i, char* buf ) { int ndigits = 1; if (c.m > 9) ndigits = 2; else if (c.m > 99) ndigits = 3; else if (c.m > 999) ndigits = 4; int j; char ch; if (i >= c.n) { j = i-c.n + 1; ch = 'm'; } else { j = i+1; ch = 'k'; } sprintf(buf, "%s_%c%0*d%s", base, ch, ndigits, j, ext); } // encode a meta-chunk. // precondition: "dir" contains a file "fname". // postcondition: dir contains // a subdir Coding with encoded chunks // subdirs fname_k0 ... fname_mn, // each containing a same-named symbolic link to the corresponding chunk // int encode(const char* dir, const char* fname, CODING& c) { char cmd[1024]; sprintf(cmd, "cd %s; /mydisks/b/users/boincadm/vda_test/encoder %s %d %d cauchy_good 32 1024 500000", dir, fname, c.n, c.k ); printf("%s\n", cmd); int s = system(cmd); if (WIFEXITED(s)) { int status = WEXITSTATUS(s); if (status != 32) return -1; // encoder returns 32 for some reason } char base[256], ext[256]; strcpy(base, fname); char* p = strchr(base, '.'); if (p) { strcpy(ext, p); *p = 0; } else { strcpy(ext, ""); } for (int i=0; i0")) { found = true; retval = handle_file(vf); if (retval) { fprintf(stderr, "handle_file() failed: %d\n", retval); } else { vf.need_update = 0; vf.update(); } } return found; } void handle_chunk(VDA_CHUNK_HOST& ch) { DB_VDA_FILE } // handle timed-out transfers // bool scan_chunks() { DB_VDA_CHUNK_HOST ch; char buf[256]; bool found = false; sprintf(buf, "transition_time < %f", dtime()); while (ch.enumerate(buf)) { found = true; handle_chunk(ch); } return found; } int main(int argc, char** argv) { VDA_FILE vf; strcpy(vf.dir, "/mydisks/b/users/boincadm/vda_test"); strcpy(vf.name, "file.ext"); init_file(vf); exit(0); while(1) { bool action = scan_files(); action |= scan_chunks(); if (!action) boinc_sleep(5.); } }