#include #include #include #include #include #define NUMCLUSTERS 10 #define NUMSLOTS 2048 int pipes[NUMSLOTS][2]; int pids[NUMSLOTS]; void bqp_init() { int i; for (i=0; i currprob) { bzero(buf, 3); sprintf(buf, "FF"); write(pipes[id][1], buf, 3); done++; } else { bzero(buf, 3); sprintf(buf, "NO"); write(pipes[id][1], buf, 3); done=0; } while(!done) { now = time(NULL)+60; gap = (int)(toolate - now); currprob = bqp_query(cluster_name, nodes, gap+reqtime, (int)((time_t)toolate - (time_t)now)); printf("%d %d %f\n", gap+reqtime, toolate - now, currprob); fflush(stdout); // if ((rand() % 10) == 4 || time(NULL) > toolate) { if (currprob >= prob || mode == 1) { mode = 1; if (currprob < prob) { done++; } else { sleep(1); } } else { sleep(1); } } if(time(NULL) > toolate) { // printf("FFFFF\n"); sprintf(buf, "FF"); write(pipes[id][1], buf, 3); } else { sprintf(buf, "GO"); write(pipes[id][1], buf, 3); } exit(0); } return(id); } int bqp_reserve_check(int id) { char buf[3]; fd_set rfds; struct timeval timeout; int rc; // use the pipe luke! bzero(buf, 3); if (pipes[id] == NULL) { return(-10); } FD_ZERO(&rfds); FD_SET(pipes[id][0], &rfds); timeout.tv_sec = 0; timeout.tv_usec = 1000; // printf("reading..."); fflush(stdout); if (select(pipes[id][0]+1, &rfds, NULL, NULL, &timeout) <= 0) { // printf("select thinks nuthin\n"); return(0); } rc = read(pipes[id][0], buf, 3); // printf("RBUF: %s\n", buf); if (!strncmp(buf, "NO", 3)) { return(0); } else if (!strncmp(buf, "GO", 3)) { close(pipes[id][0]); close(pipes[id][1]); return(1); } else if (!strncmp(buf, "FF", 3)) { close(pipes[id][0]); close(pipes[id][1]); return(-1); } else { return(-1); } } int bqp_alternative(char *cluster_name, int innodes, int inreqtime, int indeadline, double prob, int *alt_nodes, int *alt_reqtime, int *alt_deadline, double *alt_prob) { double prc, nodes, reqtime, deadline; int done, nodefudge, reqtimefudge, deadlinefudge; int county; nodefudge = reqtimefudge = deadlinefudge = 0; county = 0; nodes = (double)innodes; reqtime = (double)inreqtime; deadline = (double)indeadline; if (nodes < 0.0) { nodes *= -1.0; nodefudge = 1; } if (reqtime < 0.0) { reqtime *= -1.0; reqtimefudge = 1; } if (deadline < 0.0) { deadline *= -1.0; deadlinefudge = 1; } done=0; while(!done) { // printf("%f %f %f\n", nodes, reqtime, deadline); *alt_nodes = (int)nodes; *alt_reqtime = (int)reqtime; *alt_deadline = (int)deadline; prc = bqp_query(cluster_name, (int)nodes, (int)reqtime, (int)deadline); *alt_prob = prc; if (prc <= 0.0) { // crap! printf("NOOO %f\n", prc); return(-10); } else if (prc >= prob) { // yay! return(1); } else { // try agin if (!nodefudge && !reqtimefudge && !deadlinefudge) { // nocando return(-10); } else { if (nodefudge) { nodes *= 0.99; if (nodes < 1.0) { nodes = 1.0; nodefudge = 0; } } if (reqtimefudge) { reqtime *= 0.98; if (reqtime < 60.0) { reqtime = 60.0; reqtimefudge = 0; } } if (deadlinefudge) { deadline *= 1.02; if (deadline > 173000.0) { deadline = 173000.0; deadlinefudge = 0; } } } } county++; } } int bqp_precog(char *cluster_name, int nodes, int reqtime, int deadline, double prob, int *outwait, int *outrtime, double *outprob) { int rc; char themach[32], thequeue[32]; rc = vgrads_cluster_map(cluster_name, themach, thequeue); if (rc < 0) { return(rc); } rc = varq_request(themach, thequeue, nodes, reqtime, deadline, prob, outwait, outrtime, outprob); return(rc); } int bqp_precog_orig(char *cluster_name, int nodes, int reqtime, int deadline, double prob, int *outwait, int *outrtime, double *outprob) { int past=0, wait, realrtime, idx, realidx; double newprob, lastprob, realprob; idx=realidx=0; realprob = 0.0; wait = realrtime = past = 0; newprob = bqp_query(cluster_name, nodes, reqtime+deadline, deadline); lastprob = newprob; if (newprob >= prob) { wait = past; realrtime = reqtime + (deadline - past); realprob = newprob; idx=0; } while(deadline - past > 0) { if (newprob >= prob) { wait = past; realrtime = reqtime + (deadline - past); realprob = newprob; realidx = idx; } if (lastprob < prob && newprob >= prob) { wait = past; realrtime = reqtime + (deadline - past); realprob = newprob; realidx = idx; // printf("WINNER %d %f\n", realidx, realprob); } else if (lastprob >= prob && newprob < prob) { wait = past - 30; realrtime = reqtime + (deadline - (past - 30)); realprob = lastprob; realidx = idx-1; // printf("WINNER %d %f\n", realidx, realprob); } lastprob = newprob; past += 30; // printf("TEST %d %f %d\n", idx, newprob, realidx); newprob = bqp_query(cluster_name, nodes, reqtime+(deadline-past), deadline-past); idx++; } // printf("WAIT: %d REALRTIME %d\n", wait, realrtime); // printf("TOT: %d\n", idx); *outwait = wait; *outrtime = realrtime; *outprob = realprob; if (wait == 0 && realrtime == 0) { return(-10); } return(1); }