From 434af76286152c001d9df0d6da8048fb6da85696 Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Wed, 9 Sep 2009 20:56:49 +0000 Subject: [PATCH] support for external images, blacklisting slaves on errors and proper job termination on cancel --- release/io/netrender/client.py | 18 ++++++++++-- release/io/netrender/master.py | 54 ++++++++++++++++++++-------------- release/io/netrender/slave.py | 3 ++ 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/release/io/netrender/client.py b/release/io/netrender/client.py index da27a8ecc57..0c60bd1603c 100644 --- a/release/io/netrender/client.py +++ b/release/io/netrender/client.py @@ -26,6 +26,9 @@ def clientSendJob(conn, scene, anim = False, chunks = 5): if job_name == "[default]": job_name = name + ########################### + # LIBRARIES + ########################### for lib in bpy.data.libraries: lib_path = lib.filename @@ -34,11 +37,13 @@ def clientSendJob(conn, scene, anim = False, chunks = 5): job.addFile(lib_path) + ########################### + # POINT CACHES + ########################### + root, ext = os.path.splitext(name) cache_path = path + os.sep + "blendcache_" + root + os.sep # need an API call for that - print("cache:", cache_path) - if os.path.exists(cache_path): caches = {} pattern = re.compile("([a-zA-Z0-9]+)_([0-9]+)_[0-9]+\.bphys") @@ -80,7 +85,14 @@ def clientSendJob(conn, scene, anim = False, chunks = 5): previous_frame = previous_item[0] job.addFile(cache_path + current_file, previous_frame + 1, next_frame - 1) - print(job.files) + ########################### + # IMAGES + ########################### + for image in bpy.data.images: + if image.source == "FILE" and not image.packed_file: + job.addFile(image.filename) + + # print(job.files) job.name = job_name diff --git a/release/io/netrender/master.py b/release/io/netrender/master.py index d938c59a2ec..78e9243bc9d 100644 --- a/release/io/netrender/master.py +++ b/release/io/netrender/master.py @@ -477,33 +477,43 @@ class RenderHandler(http.server.BaseHTTPRequestHandler): print("writing result file") self.server.stats("", "Receiving render result") - job_id = self.headers['job-id'] + slave_id = self.headers['slave-id'] - job = self.server.getJobByID(job_id) + slave = self.server.updateSlave(slave_id) - if job: - job_frame = int(self.headers['job-frame']) - job_result = int(self.headers['job-result']) - job_time = float(self.headers['job-time']) + if slave: # only if slave id is valid + job_id = self.headers['job-id'] - if job_result == DONE: - length = int(self.headers['content-length']) - buf = self.rfile.read(length) - f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb') - f.write(buf) - f.close() - - del buf - job = self.server.getJobByID(job_id) - frame = job[job_frame] - frame.status = job_result - frame.time = job_time - - self.server.updateSlave(self.headers['slave-id']) - self.send_head() - else: # job not found + if job: + job_frame = int(self.headers['job-frame']) + job_result = int(self.headers['job-result']) + job_time = float(self.headers['job-time']) + + frame = job[job_frame] + + if job_result == DONE: + length = int(self.headers['content-length']) + buf = self.rfile.read(length) + f = open(job.save_path + "%04d" % job_frame + ".exr", 'wb') + f.write(buf) + f.close() + + del buf + elif job_result == ERROR: + # blacklist slave on this job on error + job.blacklist.append(slave.id) + + frame.status = job_result + frame.time = job_time + + self.server.updateSlave(self.headers['slave-id']) + + self.send_head() + else: # job not found + self.send_head(http.client.NO_CONTENT) + else: # invalid slave id self.send_head(http.client.NO_CONTENT) # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- elif self.path == "log": diff --git a/release/io/netrender/slave.py b/release/io/netrender/slave.py index 0435ba3f8cb..c12c846231d 100644 --- a/release/io/netrender/slave.py +++ b/release/io/netrender/slave.py @@ -119,6 +119,9 @@ def render_slave(engine, scene): run_t = current_t if cancelled: + # kill process if needed + if process.poll() == None: + process.terminate() continue # to next frame total_t = time.time() - start_t