# HG changeset patch # User normaldotcom # Date 2010-03-14 13:45:31 # Node ID df7e1f917a6df62ddff4a0d862994b470d706e89 # Parent 4ec01e2efee7c534bae6add02c6aa97f50524b1d Added more checks, fixed paths, etc diff --git a/src/server/simpleslave.c b/src/server/simpleslave.c --- a/src/server/simpleslave.c +++ b/src/server/simpleslave.c @@ -112,6 +112,7 @@ int main(int argc, char *argv[]) char *urltoOutput; /* Full URL where output is posted */ char *pathtoOutput; /* Full path to the output (rendered) file */ + char *pathtoOutdir; /* Full path to output directory */ char *pathtoJob; /* Path to job data folder */ char *pathtoJobfile; /* Full path to the job's main file */ @@ -139,7 +140,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Preparing to render frame %d in job %d\n", framenum, jobnum); - prepareJobPaths(jobnum, framenum, outputExt, datadir, &urltoTar, &pathtoTar, &pathtoJob, &pathtoJobfile, &urltoOutput, &pathtoOutput); + prepareJobPaths(jobnum, framenum, outputExt, datadir, &urltoTar, &pathtoTar, &pathtoJob, &pathtoJobfile, &urltoOutput, &pathtoOutput, &pathtoOutdir); // free(outputExt); int dlret = downloadTar(urltoTar, pathtoTar); if(dlret == 0) @@ -151,13 +152,16 @@ int main(int argc, char *argv[]) unpackJob(pathtoJob, pathtoTar); - /* Execute blender */ - fprintf(stderr,"Executing blender on file %s", pathtoJobfile); + /* ignore return because directory may exist already */ + fprintf(stderr,"Creating output directory %s\n", pathtoOutdir); + mkdir(pathtoOutdir, 0700); + fprintf(stderr,"Marking frame started on server... "); + _web_startframe(slavekey, password, jobnum, framenum); - /* ignore return because directory may exist already */ - mkdir(pathtoOutput, 0700); + /* Execute blender */ + fprintf(stderr,"Executing blender on file %s\n", pathtoJobfile); + fprintf(stderr,"Directing output to file %s\n", pathtoOutput); - _web_startframe(slavekey, password, jobnum, framenum); if(exec_blender(pathtoJobfile, pathtoOutput, framenum)) { fprintf(stderr,"Error running Blender. Check your installation and/or your PATH.\n"); @@ -165,15 +169,23 @@ int main(int argc, char *argv[]) } free(pathtoJobfile); - /* Post-execution */ - fprintf(stderr, "Finished frame %d in job %d, uploading...\n", framenum, jobnum); - uploadOutput(pathtoOutput, urltoOutput, jobnum, framenum, slavekey); // @TODO: Handle return value + struct stat buffer; + int fstatus = stat(pathtoOutput, &buffer); + if(fstatus == -1){ + fprintf(stderr,"Frame was not rendered correctly! Scene may not have camera, or your blender installation is not working.\n"); + return 1; + } + else{ + /* Post-execution */ + fprintf(stderr, "Finished frame %d in job %d, uploading...\n", framenum, jobnum); + uploadOutput(pathtoOutput, urltoOutput, jobnum, framenum, slavekey); // @TODO: Handle return value - free(urltoOutput); - free(pathtoOutput); + free(urltoOutput); + free(pathtoOutput); - // Tell the server that rendering and upload are complete - _web_finishframe(slavekey, password, jobnum, framenum); + // Tell the server that rendering and upload are complete + _web_finishframe(slavekey, password, jobnum, framenum); + } } else fprintf(stderr,"Nothing to do. Idling...\n"); diff --git a/src/server/slave.c b/src/server/slave.c --- a/src/server/slave.c +++ b/src/server/slave.c @@ -118,6 +118,7 @@ int main(int argc, char *argv[]) char *urltoOutput; /* Full URL where output is posted */ char *pathtoOutput; /* Full path to the output (rendered) file */ + char *pathtoOutdir; /* Full path to output directory */ char *pathtoJob; /* Full path to job data folder */ char *pathtoJobfile; /* Full path to the job's main file */ @@ -145,7 +146,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "Preparing to render frame %d in job %d\n", framenum, jobnum); - prepareJobPaths(jobnum, framenum, outputExt, datadir, &urltoTar, &pathtoTar, &pathtoJob, &pathtoJobfile, &urltoOutput, &pathtoOutput); + prepareJobPaths(jobnum, framenum, outputExt, datadir, &urltoTar, &pathtoTar, &pathtoJob, &pathtoJobfile, &urltoOutput, &pathtoOutput, &pathtoOutdir); free(outputExt); if(downloadTar(urltoTar, pathtoTar)) diff --git a/src/server/slavefuncs.c b/src/server/slavefuncs.c --- a/src/server/slavefuncs.c +++ b/src/server/slavefuncs.c @@ -288,19 +288,19 @@ return 1; // Success /** Executor function for Blender operations */ int exec_blender(char *input, char *output, int frame) { - fprintf(stderr,"Preparing to execute...\n"); int ret; char *frame_str; + _distren_asprintf(&frame_str, "%i", frame); char *command = "blender"; // @TODO: We currently expect this to be in PATH char *cmd[] = { command, "-b", "-o", output, input, "-f", frame_str, (char *)NULL }; // arguments for blender + fprintf(stderr,"Preparing to execute command: %s \"-b\" \"-o\" %s %s \"-f\" %s\n", command, output, input, frame_str); + char buf[10]; struct execio *testrem; size_t readlen; - _distren_asprintf(&frame_str, "%i", frame); - fprintf(stderr,"Executing: %s\n", frame_str); ret = execio_open(&testrem, command, cmd); buf[9] = '\0'; @@ -477,7 +477,7 @@ int unpackJob(char *outdir, char *pathto } -void prepareJobPaths(int jobnum, int framenum, char *outputExt, char *datadir, char **urltoTar,char **pathtoTar,char **pathtoJob, char **pathtoJobfile,char **urltoOutput,char **pathtoOutput) +void prepareJobPaths(int jobnum, int framenum, char *outputExt, char *datadir, char **urltoTar,char **pathtoTar,char **pathtoJob, char **pathtoJobfile,char **urltoOutput,char **pathtoOutput, char **pathtoOutdir) { // Variable Preparation char *jobdatapath; @@ -488,6 +488,7 @@ void prepareJobPaths(int jobnum, int fra _distren_asprintf(pathtoJobfile, "%s/%s/job.blend", datadir, jobdatapath ); // Prepares the path to the jobfile _distren_asprintf(urltoOutput, "http://distren.org/slaveUpload.php"); // Prepares the URL where output is posted _distren_asprintf(pathtoOutput, "%s/%s/output/job%d-frame%d.%s", datadir, jobdatapath, jobnum, framenum, outputExt ); + _distren_asprintf(pathtoOutdir, "%s/%s/output", datadir, jobdatapath); free(jobdatapath); } @@ -656,7 +657,7 @@ void _web_finishframe(int slavekey, char struct _web_memorystruct data = _web_getrequest(url); free(url); - fprintf(stderr,"Got data: %s\n", data.memory); + fprintf(stderr,"%s\n", data.memory); if(data.memory) free(data.memory); } @@ -667,7 +668,7 @@ void _web_startframe(int slavekey, char struct _web_memorystruct data = _web_getrequest(url); free(url); - fprintf(stderr,"Got data: %s\n", data.memory); + fprintf(stderr,"%s\n", data.memory); if(data.memory) free(data.memory); } diff --git a/src/server/slavefuncs.h b/src/server/slavefuncs.h --- a/src/server/slavefuncs.h +++ b/src/server/slavefuncs.h @@ -49,7 +49,7 @@ int job_build_path(char *filename, unsig int downloadTar(char *url, char *destinationPath); int uploadOutput(char *pathtoOutput, char *urltoOutput, int jobnum, int framenum, int slavekey); int unpackJob(char *outdir, char *pathtoTar); -void prepareJobPaths(int jobnum, int framenum, char *outputExt, char *datadir, char **urltoTar,char **pathtoTar,char **pathtoJob, char **pathtoJobfile,char **urltoOutput,char **pathtoOutput); +void prepareJobPaths(int jobnum, int framenum, char *outputExt, char *datadir, char **urltoTar,char **pathtoTar,char **pathtoJob, char **pathtoJobfile,char **urltoOutput,char **pathtoOutput, char **pathtoOutdir); int checkUsername(char *username); void slaveTest();