// This file is part of BOINC. // http://boinc.berkeley.edu // Copyright (C) 2008 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 . // This program generates a stream of scheduler requests; // it acts as a "driver" for the scheduler when used as: // sched_driver | cgi --batch --mark_jobs_done // // This was written to test the homogeneous redundancy features // of the feeder and scheduler, // but it could be used for a variety of other purposes. // // Usage: sched_driver --nrequests N --reqs_per_second X // // Each request asks for a uniformly-distributed random amount of work. // The OS and CPU info is taken from the successive lines of a file of the form // | os_name | p_vendor | p_model | // Generate this file with a SQL query, trimming off the start and end. // Notes: // 1) Use sample_trivial_validator and sample_dummy_assimilator // 2) Edit the following to something in your DB #define AUTHENTICATOR "49bcae97f1788385b0f41123acdf5694" // authenticator of a user record #define HOSTID "7" // ID of a host belonging to that user #include #include #include "util.h" #include "svn_version.h" using std::vector; struct HOST_DESC{ char os_name[128]; char p_vendor[128]; char p_model[128]; }; vector host_descs; double min_time = 1; double max_time = 1; void read_hosts() { char buf[256], buf2[256]; host_descs.clear(); FILE* f = fopen("host_descs.txt", "r"); if (!f) { fprintf(stderr, "no input file\n"); exit(1); } while (fgets(buf, sizeof(buf), f)) { HOST_DESC hd; strcpy(buf2, buf); char* p1 = strtok(buf2, "\t\n"); strcpy(hd.os_name, p1); char* p2 = strtok(0, "\t\n"); strcpy(hd.p_vendor, p2); char* p3 = strtok(0, "\t\n"); if (!p3) { fprintf(stderr, "bad line: %s\n", buf); exit(1); } strcpy(hd.p_model, p3); host_descs.push_back(hd); } } inline double req_time() { if (max_time == min_time) return min_time; return min_time + drand()*(max_time-min_time); } inline double exponential(double mean) { return -mean*log(1-drand()); } void make_request(int i) { HOST_DESC& hd = host_descs[i%host_descs.size()]; printf( "\n" " %s\n" " %s\n" " %f\n" " windows_intelx86\n" " \n" " %s\n" " %s\n" " %s\n" " 1e9\n" " 1e9\n" " 1e11\n" " 1e11\n" " \n" "\n", AUTHENTICATOR, HOSTID, req_time(), hd.os_name, hd.p_vendor, hd.p_model ); } void usage(char *name) { fprintf(stderr, "This program generates a stream of scheduler requests;\n" "it acts as a \"driver\" for the scheduler when used as:\n" "%s | cgi --batch --mark_jobs_done\n\n" "This was written to test the homogeneous redundancy features\n" "of the feeder and scheduler,\n" "but it could be used for a variety of other purposes.\n\n" "Each request asks for a uniformly-distributed random amount of work.\n" "The OS and CPU info is taken from the successive lines of a file of the form\n" "| os_name | p_vendor | p_model |\n" "Generate this file with a SQL query, trimming off the start and end.\n\n" "Notes:\n" "1) Use sample_trivial_validator and sample_dummy_assimilator\n" "2) Edit the following to something in your DB\n\n" "Usage: %s [OPTION]...\n\n" "Options: \n" " --nrequests N Sets the total nukmer of requests to N\n" " --reqs_per_second X Sets the number of requests per second to X\n" " [ -h | -help | --help ] Show this help text.\n" " [ -v | -version | --version ] Show version information\n", name ); } int main(int argc, char** argv) { int i, nrequests = 1; double reqs_per_second = 1; for (i=1; i