[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22926] branches/blender2.5/blender/ release/io/netrender: more use of data structures for communication.
Martin Poirier
theeth at yahoo.com
Tue Sep 1 03:09:10 CEST 2009
Revision: 22926
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22926
Author: theeth
Date: 2009-09-01 03:09:05 +0200 (Tue, 01 Sep 2009)
Log Message:
-----------
more use of data structures for communication. begining support for more than one file per fob (external dependencies, point cache, ...)
Modified Paths:
--------------
branches/blender2.5/blender/release/io/netrender/client.py
branches/blender2.5/blender/release/io/netrender/master.py
branches/blender2.5/blender/release/io/netrender/model.py
branches/blender2.5/blender/release/io/netrender/operators.py
branches/blender2.5/blender/release/io/netrender/slave.py
branches/blender2.5/blender/release/io/netrender/ui.py
branches/blender2.5/blender/release/io/netrender/utils.py
Modified: branches/blender2.5/blender/release/io/netrender/client.py
===================================================================
--- branches/blender2.5/blender/release/io/netrender/client.py 2009-09-01 00:52:03 UTC (rev 22925)
+++ branches/blender2.5/blender/release/io/netrender/client.py 2009-09-01 01:09:05 UTC (rev 22926)
@@ -22,7 +22,7 @@
def render_master(self, scene):
server_address = (scene.network_render.server_address, scene.network_render.server_port)
- httpd = master.RenderMasterServer(server_address, master.RenderHandler)
+ httpd = master.RenderMasterServer(server_address, master.RenderHandler, scene.network_render.path)
httpd.timeout = 1
httpd.stats = self.update_stats
while not self.test_break():
@@ -32,6 +32,7 @@
slave.render_slave(self, scene)
def render_client(self, scene):
+ netsettings = scene.network_render
self.update_stats("", "Network render client initiation")
conn = clientConnection(scene)
@@ -41,7 +42,7 @@
self.update_stats("", "Network render exporting")
- job_id = scene.network_render.job_id
+ job_id = netsettings.job_id
# reading back result
@@ -51,10 +52,10 @@
response = conn.getresponse()
if response.status == http.client.NO_CONTENT:
- scene.network_render.job_id = clientSendJob(conn, scene)
+ netsettings.job_id = clientSendJob(conn, scene)
clientRequestResult(conn, scene, job_id)
- while response.status == http.client.PROCESSING and not self.test_break():
+ while response.status == http.client.ACCEPTED and not self.test_break():
print("waiting")
time.sleep(1)
clientRequestResult(conn, scene, job_id)
@@ -68,7 +69,7 @@
x= int(r.resolution_x*r.resolution_percentage*0.01)
y= int(r.resolution_y*r.resolution_percentage*0.01)
- f = open(PATH_PREFIX + "output.exr", "wb")
+ f = open(netsetting.path + "output.exr", "wb")
buf = response.read(1024)
while buf:
@@ -78,7 +79,7 @@
f.close()
result = self.begin_result(0, 0, x, y)
- result.load_from_file(PATH_PREFIX + "output.exr", 0, 0)
+ result.load_from_file(netsettings.path + "output.exr", 0, 0)
self.end_result(result)
conn.close()
Modified: branches/blender2.5/blender/release/io/netrender/master.py
===================================================================
--- branches/blender2.5/blender/release/io/netrender/master.py 2009-09-01 00:52:03 UTC (rev 22925)
+++ branches/blender2.5/blender/release/io/netrender/master.py 2009-09-01 01:09:05 UTC (rev 22926)
@@ -9,12 +9,22 @@
JOB_PAUSED = 1 # paused by user
JOB_QUEUED = 2 # ready to be dispatched
+class MRenderFile:
+ def __init__(self, filepath):
+ self.filepath = filepath
+ self.found = False
+
+ def test(self):
+ self.found = os.path.exists(self.filepath)
+ return self.found
+
+
class MRenderSlave(netrender.model.RenderSlave):
- def __init__(self, name, adress, stats):
+ def __init__(self, name, address, stats):
super().__init__()
- self.id = hashlib.md5(bytes(repr(name) + repr(adress), encoding='utf8')).hexdigest()
+ self.id = hashlib.md5(bytes(repr(name) + repr(address), encoding='utf8')).hexdigest()
self.name = name
- self.adress = adress
+ self.address = address
self.stats = stats
self.last_seen = time.time()
@@ -31,11 +41,12 @@
return (job.status, job.framesLeft() > 0, job.priority, job.credits)
class MRenderJob(netrender.model.RenderJob):
- def __init__(self, job_id, name, path, chunks = 1, priority = 1, credits = 100.0, blacklist = []):
+ def __init__(self, job_id, name, files, chunks = 1, priority = 1, credits = 100.0, blacklist = []):
super().__init__()
self.id = job_id
self.name = name
- self.path = path
+ self.files = files
+ self.render_files = [MRenderFile(path) for path in files]
self.status = JOB_WAITING
self.frames = []
self.chunks = chunks
@@ -44,6 +55,14 @@
self.blacklist = blacklist
self.last_dispatched = time.time()
+ def testStart(self):
+ for f in self.render_files:
+ if not f.test():
+ return False
+
+ self.start()
+ return True
+
def start(self):
self.status = JOB_QUEUED
@@ -75,7 +94,7 @@
if f.status == QUEUED:
self.update()
frames.append(f)
- if len(frames) == self.chunks:
+ if len(frames) >= self.chunks:
break
return frames
@@ -162,10 +181,10 @@
if frame:
if frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.PROCESSING)
+ self.send_head(http.client.ACCEPTED)
elif frame.status == DONE:
self.server.stats("", "Sending result back to client")
- f = open(PATH_PREFIX + job_id + "%04d" % job_frame + ".exr", 'rb')
+ f = open(self.server.path + job_id + "%04d" % job_frame + ".exr", 'rb')
self.send_head()
@@ -173,13 +192,13 @@
f.close()
elif frame.status == ERROR:
- self.send_head(http.client.NO_CONTENT)
+ self.send_head(http.client.PARTIAL_CONTENT)
else:
# no such frame
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
else:
# no such job id
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "log":
job_id = self.headers['job-id']
@@ -194,23 +213,21 @@
if frame:
if frame.status in (QUEUED, DISPATCHED):
self.send_head(http.client.PROCESSING)
- elif frame.status == DONE:
+ else:
self.server.stats("", "Sending log back to client")
- f = open(PATH_PREFIX + job_id + "%04d" % job_frame + ".log", 'rb')
+ f = open(self.server.path + job_id + "%04d" % job_frame + ".log", 'rb')
self.send_head()
shutil.copyfileobj(f, self.wfile)
f.close()
- elif frame.status == ERROR:
- self.send_head(http.client.NO_CONTENT)
else:
# no such frame
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
else:
# no such job id
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "status":
job_id = self.headers.get('job-id', "")
@@ -228,13 +245,13 @@
message = frame.serialize()
else:
# no such frame
- self.send_heat(http.client.NOT_FOUND)
+ self.send_heat(http.client.NO_CONTENT)
return
else:
message = job.serialize()
else:
# no such job id
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
return
else: # status of all jobs
message = []
@@ -262,6 +279,7 @@
if job and frames:
for f in frames:
+ print("dispatch", f.number)
f.status = DISPATCHED
f.slave = slave
@@ -274,9 +292,9 @@
self.server.stats("", "Sending job frame to render node")
else:
# no job available, return error code
- self.send_head(http.client.NO_CONTENT)
+ self.send_head(http.client.ACCEPTED)
else: # invalid slave id
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "file":
job_id = self.headers['job-id']
@@ -288,14 +306,14 @@
self.send_head(headers={"job-id": job.id})
self.server.stats("", "Sending file to render node")
- f = open(PATH_PREFIX + job.id + ".blend", 'rb')
+ f = open(self.server.path + job.id + ".blend", 'rb')
shutil.copyfileobj(f, self.wfile)
f.close()
else:
# no such job id
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "slave":
message = []
@@ -322,33 +340,25 @@
self.server.stats("", "Receiving job")
length = int(self.headers['content-length'])
- job_frame_string = self.headers['job-frame']
- job_name = self.headers.get('job-name', "")
- job_chunks = int(self.headers.get('job-chunks', "1"))
- blacklist = self.headers.get('slave-blacklist', '').split()
- job_path = str(self.rfile.read(length), encoding='utf8')
+ job_info = netrender.model.RenderJob.materialize(eval(str(self.rfile.read(length), encoding='utf8')))
- if os.path.exists(job_path):
- job_id = self.server.nextJobID()
+ job_id = self.server.nextJobID()
+
+ print("chunks", job_info.chunks)
+
+ job = MRenderJob(job_id, job_info.name, job_info.files, chunks = job_info.chunks, priority = job_info.priority, blacklist = job_info.blacklist)
+ self.server.addJob(job)
+
+ for frame in job_info.frames:
+ frame = job.addFrame(frame.number)
- job = MRenderJob(job_id, job_name, job_path, chunks = job_chunks, blacklist = blacklist)
- self.server.addJob(job)
-
- if ":" in job_frame_string:
- frame_start, frame_end = [int(x) for x in job_frame_string.split(":")]
-
- for job_frame in range(frame_start, frame_end + 1):
- frame = job.addFrame(job_frame)
- else:
- job_frame = int(job_frame_string)
- frame = job.addFrame(job_frame)
-
- job.start()
-
- self.send_head(headers={"job-id": job_id})
+ headers={"job-id": job_id}
+
+ if job.testStart():
+ self.send_head(headers=headers)
else:
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.ACCEPTED, headers=headers)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "cancel":
job_id = self.headers.get('job-id', "")
@@ -375,7 +385,7 @@
self.send_head()
else: # job not found
- self.send_head(http.client.NOT_FOUND)
+ self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "slave":
length = int(self.headers['content-length'])
@@ -412,7 +422,7 @@
job_path = job_id + ".blend"
- f = open(PATH_PREFIX + job_path, "wb")
+ f = open(self.server.path + job_path, "wb")
f.write(buf)
f.close()
del buf
@@ -445,7 +455,7 @@
if job_result == DONE:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list