support for external images, blacklisting slaves on errors and proper job termination on cancel

This commit is contained in:
Martin Poirier 2009-09-09 20:56:49 +00:00
parent 25f4fe5d13
commit 434af76286
3 changed files with 50 additions and 25 deletions

@ -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

@ -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":

@ -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