/*
Copyright 2008 Nathan Phillip Brink, Ethan Zonca
This file is a part of DistRen.
DistRen is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
DistRen 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with DistRen. If not, see .
*/
/* This file contains the code which both processes (renders) jobs as a slave, and the code which distributes frames to slaves after receiving them from the client portion of the codebase. */
/* Just some notes -- Ethan Zonca
* ++ Make data availible for other apps to parse
* Server<==>Client Communication
* Upload while rendering
*/
#include
#include "execio.h"
#include "options.h"
#define max 100
// maximum number of stored jobs in memory, per job type (lux/blend). Eventually we can dump this data to disk, or atleast the remainder not in memory...
int jobnum = 0;
// Structures for storing job information
struct {
char *name;
char *submitter;
char *email;
int priority;
struct frameset **frameset; // What exactly is this now? hehe
} blendjob[max];
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];
int main(int argc, char *argv[])
{
/*
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.
*/
// 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, struct frameset **frameset) {
if(type == 1){
blendjob[jobnum].name = name;
blendjob[jobnum].submitter = submitter;
blendjob[jobnum].email = email;
blendjob[jobnum].priority = priority;
blendjob[jobnum].frameset = frameset;
}
if(type == 2){
luxjob[jobnum].name = name;
luxjob[jobnum].submitter = submitter;
luxjob[jobnum].email = email;
luxjob[jobnum].priority = priority;
luxjob[jobnum].mode = mode;
luxjob[jobnum].spp = spp;
luxjob[jobnum].frameset = frameset;
// handle lux modes somehow.
}
else{
// Throw error.
}
jobnum++;
}
// Mostly kinda copied from old code, but I understand it a tad better now :)
char buf[10];
struct execio *testrem;
char *execargv[] =
{
"ssh",
"ethanzonca@protofusion.org",
"sh",
"-c",
"\"echo hello from ${HOSTNAME}\"",
(char *)NULL
};
size_t readlen;
fprintf(stderr, "execio_open:", execio_open(&testrem, "ssh", execargv));
buf[9] = '\0'; // null-terminating the array...
while(!execio_read(testrem, buf, 9, &readlen)) // What's with the readlen stuff?
{
if(readlen > 9) {
fprintf(stderr, "Something is terribly wrong!\n");
}
buf[readlen] = '\0'; // Null-terminating the end of it again based on how large the data is?
fprintf(stderr, "read \"%s\"\n", buf);
}
execio_close(testrem);
///////////////////////// SLAVE ///////////////////////////////
/*
Slave listens on server for a command in the format of each function...
We need if's for returns... ==> watchdog
*/
// Executors
void exec_blender(char *input, char *output, int sframe, int eframe) {
int ret;
/* SEGFAULTAGE :-D */
char *cmd[] = { "blender", "-b", "-o", output, input, "-s", sframe, "-e", eframe, (char *)0 };
ret = execv("/usr/bin/blender", cmd);
}
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);
}
return 0;
}