diff --git a/src/server/distrend.c b/src/server/distrend.c --- a/src/server/distrend.c +++ b/src/server/distrend.c @@ -79,22 +79,19 @@ struct general_info ********************************************* */ /* ************General Functions************* */ -int xml_dump(); +// int xml_dump(); int distrend_do(); -int start_data(struct general_info *general_info); -void finish_frame(struct general_info *geninfo, struct distrenjob *distrenjob, int frame); +// int start_data(struct general_info *general_info); int mortition(struct general_info *geninfo, struct distrenjob *job); -int restoreJobState(struct distrenjob *job); -int prepare_distrenjob(struct general_info *geninfo, int type, char *name, char *submitter, int priority, int start_frame, int end_frame, int width, int height); -int distrenjob_enqueue(struct general_info *geninfo, struct distrenjob *job); -int change_job_priority(struct general_info *geninfo, struct distrenjob *job, int new_priority); -int find_jobframe(struct general_info *geninfo, struct distrenjob **job, struct frameset **frame); -int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame); -int find_jobframe_new(struct general_info *geninfo, int rend_pwr, struct distrenjob **job, struct frameset **frame); -int find_jobframe_again(struct general_info *geninfo, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame); +// int restoreJobState(struct distrenjob *job); +// int prepare_distrenjob(struct general_info *geninfo, int type, char *name, char *submitter, int priority, int start_frame, int end_frame, int width, int height); +// int distrenjob_enqueue(struct general_info *geninfo, struct distrenjob *job); +// int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame); +// int find_jobframe_new(struct general_info *geninfo, int rend_pwr, struct distrenjob **job, struct frameset **frame); +// int find_jobframe_again(struct general_info *geninfo, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame); void frame_watchdog(struct distrenjob *distrenjob_head); -struct distrenjob *distrenjob_get(struct distrenjob *head, jobnum_t jobnum); -void distrenjob_remove(struct general_info *geninfo, struct distrenjob *bj); +// struct distrenjob *distrenjob_get(struct distrenjob *head, jobnum_t jobnum); +// void distrenjob_remove(struct general_info *geninfo, struct distrenjob *bj); int distrend_do_config(int argc, char *argv[], struct distrend_config **config); int distrend_config_free(struct distrend_config *config); @@ -157,11 +154,13 @@ int main(int argc, char *argv[]) _distren_asprintf(&general_info.files.geninfo, "%s/general_info.xml", general_info.config->datadir); + /* @QUERY: Obselete? if(start_data(&general_info)) { fprintf(stderr, "%s:%d: start_data() failed\n", __FILE__, __LINE__); return 1; } + */ /** MySQL Connection */ struct distrend_mysql_con *conn; @@ -172,14 +171,15 @@ int main(int argc, char *argv[]) } /** pre-loaded jobs for testing */ - prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480); - prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720); + // prepare_distrenjob(&general_info, 1, "awesome", "LordOfWar", 8, 1, 100, 640, 480); + // prepare_distrenjob(&general_info, 1, "hamburger", "ohnobinki", 3, 1, 50, 1280, 720); /** Execute test function */ - interactiveTest(test, general_info); + // interactiveTest(test, general_info); distrend_listen(general_info.config, &clients); + int slaveKey = 0; // Remotio should set me on a per-slave basis /* Main Loop */ while(!general_info.config->die) { @@ -196,7 +196,7 @@ int main(int argc, char *argv[]) /* If the client is idle, must be modified for climbing through linked list of clients (client->clientnum) */ if(clientstatus == CLIENTSTATUS_IDLE) { - int returnnum = find_jobframe(&general_info, &job, &frame); // Finds a frame to render + int returnnum = find_jobframe(slaveKey, &job->jobnum, &frame->num); // Finds a frame to render @FIXME: Slavenum :D if(returnnum) { fprintf(stderr,"No frames are available to render at this time. Idling...\n"); @@ -208,7 +208,7 @@ int main(int argc, char *argv[]) /* If the client states that they finished the frame */ if(clientsays == DISTREN_REQUEST_DONEFRAME){ clientstatus = CLIENTSTATUS_IDLE; // Sets the client back to idle - finish_frame(&general_info, job, frame->num); // @TODO: Make sure this actually works. + finish_frame(slaveKey, job->jobnum, frame->num); // @TODO: Make sure this actually works. } } /* while(!general_info.config->die) */ @@ -228,10 +228,14 @@ int main(int argc, char *argv[]) /** Dumps all data in RAM to an xml file (such as current jobs, etc) which is parsed by start_data. Remember to invoke this before shutting down! @TODO: Fill this stub*/ // @QUERY: Obselete function, get rid of me! +/* int xml_dump() { return 0; } +*/ + + /** Performs command stored in a client's request. @TODO: Fill stub */ @@ -244,13 +248,15 @@ int distrend_do() Fill variables at startup from XML dumps or defaults */ // @QUERY: Obselete function, as data is stored in sql now. + +/* int start_data(struct general_info *general_info) { struct stat buffer; - /** - defaults - */ + +// defaults + memset(&general_info->head, '\0', sizeof(struct distrenjob)); general_info->head.priority = 0; @@ -284,26 +290,16 @@ int start_data(struct general_info *gene return 0; } +*/ -/** Finish-Setter: Sets a frame to the "completed" status.*/ -// @QUERY: update `distren`.`Job` set `Finish_Confirmed`=1 where `Job_Key`='1'; -void finish_frame(struct general_info *geninfo, struct distrenjob *distrenjob, int frame) -{ - distrenjob->frameset[frame].status = FRAMESETSTATUS_DONE; - distrenjob->total_render_time = distrenjob->total_render_time + (clock() - distrenjob->frameset[frame].start_time); - distrenjob->completed_frames ++; - distrenjob->assigned_frames --; - geninfo->total_frames_rendered ++; /*< Increase total frames var for stats */ - - update_general_info(geninfo); - updateJobStatsXML(distrenjob); -} /** checks to see if a job is actually done. - scans the folder of the job to make sure all output files are present */ // @QUERY: Needs some complex query work + +/* int mortition(struct general_info *geninfo, struct distrenjob *job) { short int isJobDone; @@ -321,9 +317,9 @@ int mortition(struct general_info *genin job->output_format); if(stat(path_and_number, &buffer) == -1) { - /** - missing frame found - */ + + // missing frame found + job->frameset[counter].status = FRAMESETSTATUS_UNASSIGNED; job->completed_frames--; geninfo->total_frames_rendered--; @@ -334,23 +330,24 @@ int mortition(struct general_info *genin if(isJobDone) { - /** - all frames were accounted for - */ + + // all frames were accounted for + distrenjob_remove(geninfo, job); distrenjob_free(&job); update_xml_joblist(geninfo); } else - /** - if the job isn't done, have frame_finder() start from the first frame, allowing it to see the frames that are now unassigned - */ + + // if the job isn't done, have frame_finder() start from the first frame, allowing it to see the frames that are now unassigned + job->prev_frame_index = -1; update_general_info(geninfo); return 0; } +*/ /** scans the frames of a job to initialize a job after server @@ -358,6 +355,8 @@ int mortition(struct general_info *genin 1 if missing frames are found. */ // @QUERY: Obselete with mysql job/frame storage + +/* int restoreJobState(struct distrenjob *job) { short int isJobDone; @@ -368,7 +367,7 @@ int restoreJobState(struct distrenjob *j isJobDone = 1; for(counter = 0; counter < job->total_frames; counter++) { - _distren_asprintf(&path_and_number, "stor/job%d/out/%d.%s", job->jobnum, job->frameset[counter].num, job->output_format); /*< @TODO this path is used in multiple places, construct/build/determine it in a central function */ + _distren_asprintf(&path_and_number, "stor/job%d/out/%d.%s", job->jobnum, job->frameset[counter].num, job->output_format); //< @TODO this path is used in multiple places, construct/build/determine it in a central function if(stat(path_and_number, &buffer) == 0) { job->frameset[counter].status = FRAMESETSTATUS_ASSIGNED; @@ -381,6 +380,8 @@ int restoreJobState(struct distrenjob *j return !isJobDone; } +*/ + /** creates a structure from starting data, then calls another @@ -389,6 +390,8 @@ int restoreJobState(struct distrenjob *j Passed strings must be free()d by the caller. */ // @QUERY: Likely obselete, as jobs are submitted via the web + +/* int prepare_distrenjob(struct general_info *geninfo, int type, char *name, char *submitter, int priority, int start_frame, int end_frame, int width, int height) { int counter; @@ -410,7 +413,7 @@ int prepare_distrenjob(struct general_in distrenjob->priority = priority; distrenjob->width = width; distrenjob->height = height; - /** sets the total number of frames in animation for status purposes */ + // sets the total number of frames in animation for status purposes distrenjob->total_frames = (end_frame - start_frame + 1); distrenjob->frameset = malloc(sizeof(struct frameset) * distrenjob->total_frames); if(!distrenjob->frameset) @@ -421,7 +424,9 @@ int prepare_distrenjob(struct general_in return 1; } - /** initialize frameset */ + + + // initialize frameset counter2 = start_frame; for(counter = 0; counter < distrenjob->total_frames; counter++) { @@ -433,9 +438,9 @@ int prepare_distrenjob(struct general_in job_getserialfilename(&serialfile, geninfo, distrenjob->jobnum, 1); - /** - add job to queue - */ + +// add job to queue + fprintf(stderr, "prepare_distrenjob(): attempting distrenjob_serialize(%d, \"%s\")\n", distrenjob->jobnum, serialfile); distrenjob_serialize(distrenjob, serialfile); @@ -453,6 +458,8 @@ int prepare_distrenjob(struct general_in return 0; } +*/ + /** @@ -460,6 +467,8 @@ int prepare_distrenjob(struct general_in Updates geninfo->jobs_in_queue. */ // @QUERY: Likely obselete, enqueueing is done via web interface + +/* int distrenjob_enqueue(struct general_info *geninfo, struct distrenjob *job) { struct distrenjob *prev_job; @@ -469,19 +478,19 @@ int distrenjob_enqueue(struct general_in head = &geninfo->head; prev_job = head; - /** - iterate through linked jobs - */ + +// iterate through linked jobs + for(current_job = head->next; current_job; current_job = current_job->next) { fprintf(stderr, "enqueue loop iteration\n"); if(job->priority < current_job->priority) { - /** - if job's priority is less than current_job's priority, insert job - keep in mind 1 is the highest priority given to jobs, head has a - priority of zero so it will always be before other jobs - */ + + // if job's priority is less than current_job's priority, insert job + // keep in mind 1 is the highest priority given to jobs, head has a + // priority of zero so it will always be before other jobs + prev_job->next = job; job->next = current_job; fprintf(stderr, "added job before jobname: ``%s''\n", current_job->name); @@ -493,114 +502,21 @@ int distrenjob_enqueue(struct general_in prev_job = current_job; } - /** - if it has reached the end of the list, add job there - */ + + // if it has reached the end of the list, add job there + prev_job->next = job; fprintf(stderr, "added job at end of queue\n"); geninfo->jobs_in_queue ++; return 0; } - -/** Changes the priority of an existing (and maybe running) job. @arg head I may end up changing the head if job == head */ -// @QUERY: update `distren`.`Job` set `Priority`='12', `Finish_Confirmed`=1 where `Job_Key`='1'; -int change_job_priority(struct general_info *geninfo, struct distrenjob *job, int new_priority){ - struct distrenjob *current_job; - struct distrenjob *prev_job; - char *serialname; - - distrenjob_remove(geninfo, job); - job->priority = new_priority; - - prev_job = &geninfo->head; - - if(job->frameset[0].status == FRAMESETSTATUS_UNASSIGNED) - /** - if job was not yet started - */ - { - distrenjob_enqueue(geninfo, job); - return 0; - } - - /** - iterate through linked list of jobs - */ - for(current_job = &geninfo->head; - current_job != NULL - && job->priority > current_job->priority; - current_job = current_job->next) - prev_job = current_job; - - prev_job->next = job; - job->next = current_job; +*/ - update_xml_joblist(geninfo); - /** reserialize after changes */ - job_getserialfilename(&serialname, geninfo, job->jobnum, 0); - distrenjob_serialize(job, serialname); - free(serialname); - - return 0; -} - -/** - Frame Finder: matches your computer up with a lovely frame to render, starts looking at oldest job first - @TODO: We must return both jobnum and framenum - @TODO: Add calls in main() - @return 0 success, other: error -*/ -// @QUERY: Frame_Get() -int find_jobframe(struct general_info *geninfo, struct distrenjob **job, struct frameset **frame) -{ - if(geninfo->hibernate) - return 1; - - unsigned int frame_counter; - unsigned short int found; - - struct distrenjob *distrenjob_ptr; - - found = 0; - /* iterate through jobs from first to last */ - for(distrenjob_ptr = geninfo->head.next; distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) - { - for(frame_counter = (distrenjob_ptr->prev_frame_index + 1); frame_counter < distrenjob_ptr->total_frames; frame_counter ++) - { - if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found - { - found = 1; - distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; - distrenjob_ptr->frameset[frame_counter].start_time = clock(); - distrenjob_ptr->assigned_frames++; - distrenjob_ptr->prev_frame_index = frame_counter; - updateJobStatsXML(distrenjob_ptr); - } - - if(found) - break; - } - - if(found) - break; - } - - if(!found) - { - fprintf(stderr, "No more jobs to render\n"); - sleep(1); /*< @todo eliminate the need for this line*/ - return 1; - } - - *job = distrenjob_ptr; - *frame = &distrenjob_ptr->frameset[frame_counter]; - - return 0; -} // @QUERY: Obselete? +/* int find_jobframe_from_job(struct distrenjob *distrenjob_ptr, struct distrenjob **job, struct frameset **frame) { unsigned int frame_counter; @@ -636,9 +552,12 @@ int find_jobframe_from_job(struct distre return 0; } +*/ + // find a frame to render when the job that the last frame was for no longer exists // @QUERY: Obselete? +/* int find_jobframe_new(struct general_info *geninfo, int rend_pwr, struct distrenjob **job, struct frameset **frame) { if(geninfo->hibernate) @@ -653,16 +572,16 @@ int find_jobframe_new(struct general_inf greatest_power_difference = -10000; found = 0; - /* iterate through jobs from first to last */ + // iterate through jobs from first to last for(distrenjob_ptr = geninfo->head.next; distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) { if(distrenjob_ptr->prev_frame_index < (distrenjob_ptr->total_frames - 1)) { - /** - Why is the number 11 found here again? --ohnobinki - */ + + // Why is the number 11 found here again? --ohnobinki + power_difference = (((float)geninfo->total_render_power / (float)geninfo->total_priority_pieces) * ((float)distrenjob_ptr->priority)); power_difference = power_difference - (float)distrenjob_ptr->assigned_render_power; @@ -688,9 +607,12 @@ int find_jobframe_new(struct general_inf return 0; } +*/ + // gets a frame to render from the same job that the previously rendered frame was from // @QUERY: Obselete? +/* int find_jobframe_again(struct general_info *geninfo, int jobnum, int rend_pwr, struct distrenjob **job, struct frameset **frame) { if(geninfo->hibernate) @@ -721,6 +643,8 @@ int find_jobframe_again(struct general_i return 0; } +*/ + /** Checks for dead, latent, or stale slaves */ void frame_watchdog(struct distrenjob *distrenjob_head) @@ -756,13 +680,14 @@ void frame_watchdog(struct distrenjob *d @return NULL on job doesn't exist */ // @QUERY: Obselete +/* struct distrenjob *distrenjob_get(struct distrenjob *head, jobnum_t jobnum) { struct distrenjob *distrenjob_ptr; - /* - The conditions of the for loop will leave distrenjob_ptr at NULL if the end of the list is reached. It will leave it pointing to the correct job if it is found. - */ + + // The conditions of the for loop will leave distrenjob_ptr at NULL if the end of the list is reached. It will leave it pointing to the correct job if it is found. + for(distrenjob_ptr = head; distrenjob_ptr && distrenjob_ptr->jobnum != jobnum; @@ -770,7 +695,7 @@ struct distrenjob *distrenjob_get(struct return distrenjob_ptr; } - +*/ /** Removes a distrenjob from the distrenjob linked list. It does not free the @@ -780,23 +705,25 @@ struct distrenjob *distrenjob_get(struct @arg head pointer to the head of the linkedlist of distrenjobs */ // @QUERY: Obselete: removal done via web interface +/* void distrenjob_remove(struct general_info *geninfo, struct distrenjob *bj) { struct distrenjob *previous_distrenjob; for(previous_distrenjob = &geninfo->head; previous_distrenjob - && previous_distrenjob->next != bj; /*< stop on the distrenjob that comes before bj */ + && previous_distrenjob->next != bj; //< stop on the distrenjob that comes before bj previous_distrenjob = previous_distrenjob->next) ; - /* - This removes references to bj from the linked list. I.E., we now skip bj when iterating through the list - */ + + // This removes references to bj from the linked list. I.E., we now skip bj when iterating through the list + previous_distrenjob->next = bj->next; geninfo->jobs_in_queue --; } +*/ /* Grabs config info from confs */ @@ -1248,6 +1175,7 @@ int printAllJobnums(struct distrenjob *h } /** Interactive test for the queuing system */ +/* @QUEUE: Test uses methods not present in C code using mysql web-based system int interactiveTest(int test, struct general_info general_info){ int command; jobnum_t jobnum; @@ -1341,6 +1269,7 @@ int interactiveTest(int test, struct gen } return 0; } +*/ /** constructs the filename for a distrenjob's serialized XML diff --git a/src/server/mysql.c b/src/server/mysql.c --- a/src/server/mysql.c +++ b/src/server/mysql.c @@ -22,6 +22,7 @@ #include #include "common/asprintf.h" +#include "common/protocol.h" #include #include @@ -149,3 +150,122 @@ int mysqlResultFree(distrend_mysql_resul return 0; } + +/** + Querying Functions + */ + +/** Finish-Setter: Sets a frame to the "completed" status.*/ +// @QUERY: update `distren`.`Job` set `Finish_Confirmed`=1 where `Job_Key`='1' and `Frame` = somenumber; +void finish_frame(int slaveKey, int jobKey, int frameNum) +{ + // Check to make sure the slavekey is the one who rendered the frame before finishing :D + /* + distrenjob->frameset[frame].status = FRAMESETSTATUS_DONE; + distrenjob->total_render_time = distrenjob->total_render_time + (clock() - distrenjob->frameset[frame].start_time); + distrenjob->completed_frames ++; + distrenjob->assigned_frames --; + geninfo->total_frames_rendered ++; //< Increase total frames var for stats + + update_general_info(geninfo); + updateJobStatsXML(distrenjob); + */ +} + +/** Changes the priority of an existing (and maybe running) job. @arg head I may end up changing the head if job == head */ +// @QUERY: update `distren`.`Job` set `Priority`='12', `Finish_Confirmed`=1 where `Job_Key`='1'; +int change_job_priority(int jobKey, int newPriority){ + /* + struct distrenjob *current_job; + struct distrenjob *prev_job; + char *serialname; + + distrenjob_remove(geninfo, job); + job->priority = new_priority; + + prev_job = &geninfo->head; + + if(job->frameset[0].status == FRAMESETSTATUS_UNASSIGNED) + + // if job was not yet started + + { + distrenjob_enqueue(geninfo, job); + return 0; + } + + + // iterate through linked list of jobs + for(current_job = &geninfo->head; + current_job != NULL + && job->priority > current_job->priority; + current_job = current_job->next) + prev_job = current_job; + + prev_job->next = job; + job->next = current_job; + + + update_xml_joblist(geninfo); + // reserialize after changes + job_getserialfilename(&serialname, geninfo, job->jobnum, 0); + distrenjob_serialize(job, serialname); + free(serialname); +*/ + return 0; +} + +/** + Frame Finder: matches your computer up with a lovely frame to render, starts looking at oldest job first + @TODO: We must return both jobnum and framenum + @TODO: Add calls in main() + @return 0 success, other: error +*/ +// @QUERY: Frame_Get() +int find_jobframe(int slaveKey, int *jobKey, int *frameNum) +{ + /* + if(geninfo->hibernate) + return 1; + + unsigned int frame_counter; + unsigned short int found; + + struct distrenjob *distrenjob_ptr; + + found = 0; + // iterate through jobs from first to last + for(distrenjob_ptr = geninfo->head.next; distrenjob_ptr && !distrenjob_ptr->hibernate; distrenjob_ptr = distrenjob_ptr->next) + { + for(frame_counter = (distrenjob_ptr->prev_frame_index + 1); frame_counter < distrenjob_ptr->total_frames; frame_counter ++) + { + if(distrenjob_ptr->frameset[frame_counter].status == FRAMESETSTATUS_UNASSIGNED) // jobframe found + { + found = 1; + distrenjob_ptr->frameset[frame_counter].status = FRAMESETSTATUS_ASSIGNED; + distrenjob_ptr->frameset[frame_counter].start_time = clock(); + distrenjob_ptr->assigned_frames++; + distrenjob_ptr->prev_frame_index = frame_counter; + updateJobStatsXML(distrenjob_ptr); + } + + if(found) + break; + } + + if(found) + break; + } + + if(!found) + { + fprintf(stderr, "No more jobs to render\n"); + sleep(1); //< @todo eliminate the need for this line + return 1; + } + + *job = distrenjob_ptr; + *frame = &distrenjob_ptr->frameset[frame_counter]; +*/ + return 0; +} diff --git a/src/server/mysql.h b/src/server/mysql.h --- a/src/server/mysql.h +++ b/src/server/mysql.h @@ -55,4 +55,14 @@ distrend_mysql_result_t mysqlQuery(struc */ int mysqlResultFree(distrend_mysql_result_t result); + +/** Import */ + +void finish_frame(int slaveKey, int jobKey, int frameNum); +int change_job_priority(int jobKey, int newPriority); +int find_jobframe(int slaveKey, int *jobKey, int *frameNum); + + + + #endif /* MYSQL_H_ */