Changeset - 8b67a70070ef
[Not reviewed]
default
0 1 0
LordOfWar - 16 years ago 2009-07-04 15:21:03

Fixed a syntax error, changing curvy brackets to parenthesis

added a frameset structure

adjusted the job_builder and frame_finder functions to use the new structure

prepared to start a function called status_report_generator, this function will scan all the jobs and figure out how done they are

preparing to:
add code to the frame_finder function to scan all the jobs and then run the job of highest priority. Then I will add code to the status_report_generate to change the priority of the job to something the frame_finder won't look it if the job is completed.
1 file changed with 45 insertions and 22 deletions:
0 comments (0 inline, 0 general)
src/server/distrend.c
Show inline comments
 
@@ -40,24 +40,38 @@
 
int jobnum = 0;
 

	
 
// Structures for storing job information
 
// OOOOOOkay so we really need a struct for frameset rather than just an array, because we should track who each frame was sent out to. Please do this, someone! :D
 
struct {
 
  char *name;
 
  char *submitter;
 
  char *email;
 
  int priority;
 
  struct frameset **frameset; // What exactly is this now? hehe
 
} blendjob[max];
 

	
 
// -- Matthew's handywork --
 
// struct for storing informaiton on each frame for a particular blender job
 
struct {
 
	int frame_num; // frame number to render
 
	char slave_name; // user that frame is assigned to
 
	int frame_status; // status of frame, 0= unassigned, 1= taken, 2= done
 

	
 
	// For secondary upload location...
 
	char url;
 
	char login_name;
 
	char login_pass;
 
} frameset[frame_count];
 
// -- end of Matthew's handywork --
 

	
 
struct {
 
  char *name;
 
  char *submitter;
 
  char *email;
 
  int priority;
 
  int mode; // 0 = Static Render, stop at Spp, or infinity if spp is null. Framerange is ignored || 1 = animation, stop at Spp and stay in framerange.
 
  int spp;
 
  struct frameset ** frameset;
 
} luxjob[max];
 

	
 

	
 

	
 
@@ -74,73 +88,73 @@ we get a key generated on the server, an
 
*/
 

	
 
  int cont = 1;
 
  struct distrend_listenset *listenset;
 
  struct distrend_config *config;
 
  distrend_do_config(argc, argv, &config);
 

	
 
  distrend_listen(&listenset, config);
 
  /* This is called the ``main loop'' */
 
  while(cont)
 
    {
 
      struct distren_action *action;
 
      
 

	
 
      distrend_accept(&action);
 
      cont = distrend_do(action);
 
      distrend_action_free(action);
 
    }
 
  
 

	
 
  distrend_unlisten(listenset);
 
  distrend_config_free(config);
 

	
 
  return 0;
 
}
 

	
 
struct distrend_config
 
{
 
  cfg_t *mycfg;
 
  struct options_common *options;
 
  
 

	
 
  struct distrend_listen **listens; /*< Null terminated array of structs */
 
  
 

	
 
}
 
  
 

	
 

	
 
int distrend_do_config(int argc, char *argv[], struct distrend_config *config)
 
{
 
  cfg_opt_t myopts = 
 
  cfg_opt_t myopts =
 
    {
 
      CFG_SEC("listen",  /* this must be imported into struct listens (which must still be declared) */
 
    {
 
      CFG_SIMPLE_STR("type", NULL),
 
	CFG_SIMPLE_STR("path", NULL),
 
	CFG_SIMPLE_INT("port", NULL)
 
	},
 
	      CFGF_MULTI),
 
      CFG_END
 
    };
 

	
 
  config = malloc(sizeof(struct distrend_config));
 
  options_init(argc, argv, &config->mycfg, &myopts, "server", &config->options);
 
  
 

	
 
  return 0;
 
}
 
int distrend_config_free(struct distrend_config *config)
 
{
 
  options_free(config->options);
 
  free(config);
 
  
 

	
 
  return 0;
 
}
 
  
 

	
 

	
 
// Registration on server. Needs attention. (e.g., people could make tons of accounts with the key we give them...
 
// Set up distrend -c username email@example.com
 
// We must prevent multi-user-creation abuse, too.
 
void registeruser(char *username, char *email){
 
  // Logs into sandboxed user on zserver2 and registers a user. Should eventually generate a key on the server and return it to the user.
 
  // All created user accounts should be sandboxed accordingly, requiring a different skel, and the default shell to be rbash. They also
 
  // need a custom path, which can be defined in the .bash_profile of the skel. All activity of server-side configuration should be documented
 
  // to ease the creation of new distren servers, or it should be automated and made much more all-inclusive, not requiring much config.
 
  char buf[10];
 
  struct execio *testrem;
 
  char *execargv[] =
 
@@ -234,50 +248,59 @@ void loginuser(char *username, int secre
 
/*
 
 frame[frame] Assignments:
 
  "0" - cancelled
 
  "1" - unassigned
 
  "2" - assigned to slave
 
  "3" - completed by slave and uploaded
 
 Have a script crawl through each job in the arrays, ordered by priority?, and assign a certain number of frames to each slave.
 
 Then we will need some sort of watchdog to monitor slaves on the main server to check for stales.
 
*/
 

	
 

	
 
/* This function creates frame array based on the total number of frames to be rendered, which will then be parsed by function frame_farmer. */
 
void frame_array_builder(int sframe, int eframe) {
 
	int total = eframe + 1;
 
	int x = sframe;
 
	blendjob[jobnum].frameset[total];
 
void frame_num_struct_builder(int jobnum, int sframe, int eframe) {
 
	int total = sframe - eframe;
 
	int fcount = sframe; // Used to create all the frames in the structure from sframe to eframe
 
	int x = 0;
 

	
 
	while(x <= eframe){
 
		blendjob[jobnum].frameset[x]=0;
 
	while(x < total){
 
		blendjob[jobnum].frameset[x].frame_num = fcount;
 
		x++;
 
		fcount++;
 
	}
 
}
 

	
 
// matches your computer up with a lovely frame to render
 
int frame_finder(){
 
	int your_frame = 0;  // your_frame is an interger value that will be given to the client as the frame number to render
 
	int your_frame = null;  // your_frame is an interger value that will be given to the client as the frame number to render
 
	int x = 0; // the frameset number
 

	
 
	while(your_frame < eframe){ // this finds a frame with the value of zero, which is a frame that is ready to be rendered
 
		if (blendjob[jobnum].frameset[your_frame] = 0)
 
	while(your_frame <= (sframe - eframe)){ // Finds the frameset number with a frame that needs to be rendered
 
		if (blendjob[jobnum].frameset[x].frame_status = 0)
 
			break;
 
	}
 

	
 
		your_frame++;
 
	}
 
blendjob[jobnum].frameset[your_frame]++; // sets the value of the frame to 2, which means its taken
 
blendjob[jobnum].frameset[x].frame_status++; // sets the value of the frame to 2, which means its taken
 

	
 
your_frame = blendjob[jobnum].frameset[x].frame_num; //  Takes the frameset found in the while statement above, and extracts the frame number from it and assigns it to the int your_frame
 

	
 
return your_frame; // your_frame is returned as the frame to be rendered
 
}
 

	
 
// This figures out how much of the job is done, where jobnum corresponds to the job number
 
// This uses pointers, so when it is run it updates certain values in memory
 
void status_report_generator(int jobnum){
 

	
 
}
 

	
 
// This function makes the value of the frame 2, which means its completed.
 
void the_finisher(int frame){
 
	blendjob[jobnum].frameset[frame]++;
 
}
 

	
 
// Queuer: this function should add files to the queue
 
// Type: 0 = blender, 1 = luxrender
 
// jobnum is the current job number
 

	
 
void queue(int type, char *name, char *submitter, char *email, int priority, int mode, int spp, *frameset) {
 
  if(type == 1){
 
    blendjob[jobnum].name = name;
 
@@ -320,25 +343,25 @@ We need if's for returns... ==> watchdog
 
*/
 

	
 

	
 
// Executors
 

	
 
void exec_blender(char *input, char *output, int frame) {
 
  int ret;
 
  /* SEGFAULTAGE :-D */
 
  char *cmd[] = { "blender", "-b", "-o", output, input, "-f", frame, (char *)0 };
 
  ret = execv("/usr/bin/blender", cmd);
 

	
 
  // OHNOBINKI! ... check this... Its supposed to send a command back to the server and run the_finisher(); function which sets the frame status to complete.
 
  fprintf{stdin, the_finisher(frame)};
 
  fprintf(stdin, the_finisher(frame));
 

	
 
void exec_luxrender_single(char *input, char *output) {
 
  int ret;
 
  char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 };
 
  ret = execv("/usr/bin/luxrender", cmd);
 
}
 

	
 
void exec_luxrender_anim(char *input, char *output, int sframe, int eframe, int spp) {
 
// spp is samples per pixel limitation on each frame
 
  int ret;
 
  char *cmd[] = { "luxrender", "-something", "something", "something", (char *)0 };
 
  ret = execv ("/usr/bin/luxrender", cmd);
0 comments (0 inline, 0 general)