[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25389] trunk/blender/release/scripts/io/ netrender: Netrender internal refactor.
Martin Poirier
theeth at yahoo.com
Tue Dec 15 00:09:08 CET 2009
Revision: 25389
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25389
Author: theeth
Date: 2009-12-15 00:09:08 +0100 (Tue, 15 Dec 2009)
Log Message:
-----------
Netrender internal refactor.
use a real object for files instead of a tuple
unique urls for files, logs and render results (just missing the proper mime type for exr files)
fix bug with slaves not getting the correct machine name
Modified Paths:
--------------
trunk/blender/release/scripts/io/netrender/client.py
trunk/blender/release/scripts/io/netrender/master.py
trunk/blender/release/scripts/io/netrender/master_html.py
trunk/blender/release/scripts/io/netrender/model.py
trunk/blender/release/scripts/io/netrender/slave.py
trunk/blender/release/scripts/io/netrender/utils.py
Modified: trunk/blender/release/scripts/io/netrender/client.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/client.py 2009-12-14 22:59:41 UTC (rev 25388)
+++ trunk/blender/release/scripts/io/netrender/client.py 2009-12-14 23:09:08 UTC (rev 25389)
@@ -106,7 +106,6 @@
job_name = netsettings.job_name
path, name = os.path.split(filename)
- path += os.sep
if job_name == "[default]":
job_name = name
@@ -147,7 +146,7 @@
for psys in object.particle_systems:
addPointCache(job, object, psys.point_cache, default_path)
- # print(job.files)
+ #print(job.files)
job.name = job_name
job.category = netsettings.job_category
@@ -166,18 +165,18 @@
# if not ACCEPTED (but not processed), send files
if response.status == http.client.ACCEPTED:
- for filepath, start, end in job.files:
- f = open(filepath, "rb")
- conn.request("PUT", "/file", f, headers={"job-id": job_id, "job-file": filepath})
+ for rfile in job.files:
+ f = open(rfile.filepath, "rb")
+ conn.request("PUT", fileURL(job_id, rfile.index), f)
f.close()
response = conn.getresponse()
- # server will reply with NOT_FOUD until all files are found
+ # server will reply with ACCEPTED until all files are found
return job_id
def requestResult(conn, job_id, frame):
- conn.request("GET", "/render", headers={"job-id": job_id, "job-frame":str(frame)})
+ conn.request("GET", renderURL(job_id, frame))
@rnaType
class NetworkRenderEngine(bpy.types.RenderEngine):
Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py 2009-12-14 22:59:41 UTC (rev 25388)
+++ trunk/blender/release/scripts/io/netrender/master.py 2009-12-14 23:09:08 UTC (rev 25389)
@@ -25,11 +25,9 @@
import netrender.balancing
import netrender.master_html
-class MRenderFile:
- def __init__(self, filepath, start, end):
- self.filepath = filepath
- self.start = start
- self.end = end
+class MRenderFile(netrender.model.RenderFile):
+ def __init__(self, filepath, index, start, end):
+ super().__init__(filepath, index, start, end)
self.found = False
def test(self):
@@ -72,7 +70,7 @@
# special server properties
self.last_update = 0
self.save_path = ""
- self.files_map = {path: MRenderFile(path, start, end) for path, start, end in job_info.files}
+ self.files = [MRenderFile(rfile.filepath, rfile.index, rfile.start, rfile.end) for rfile in job_info.files]
self.status = JOB_WAITING
def save(self):
@@ -82,7 +80,7 @@
f.close()
def testStart(self):
- for f in self.files_map.values():
+ for f in self.files:
if not f.test():
return False
@@ -150,6 +148,9 @@
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+file_pattern = re.compile("/file_([a-zA-Z0-9]+)_([0-9]+)")
+render_pattern = re.compile("/render_([a-zA-Z0-9]+)_([0-9]+).exr")
+log_pattern = re.compile("/log_([a-zA-Z0-9]+)_([0-9]+).log")
class RenderHandler(http.server.BaseHTTPRequestHandler):
def send_head(self, code = http.client.OK, headers = {}, content = "application/octet-stream"):
@@ -194,62 +195,74 @@
self.server.stats("", "Version check")
self.wfile.write(VERSION)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/render":
- job_id = self.headers['job-id']
- job_frame = int(self.headers['job-frame'])
+ elif self.path.startswith("/render"):
+ match = render_pattern.match(self.path)
- job = self.server.getJobID(job_id)
+ if match:
+ job_id = match.groups()[0]
+ frame_number = int(match.groups()[1])
- if job:
- frame = job[job_frame]
+ job = self.server.getJobID(job_id)
- if frame:
- if frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.ACCEPTED)
- elif frame.status == DONE:
- self.server.stats("", "Sending result to client")
- f = open(job.save_path + "%04d" % job_frame + ".exr", 'rb')
-
- self.send_head()
-
- shutil.copyfileobj(f, self.wfile)
-
- f.close()
- elif frame.status == ERROR:
- self.send_head(http.client.PARTIAL_CONTENT)
+ if job:
+ frame = job[frame_number]
+
+ if frame:
+ if frame.status in (QUEUED, DISPATCHED):
+ self.send_head(http.client.ACCEPTED)
+ elif frame.status == DONE:
+ self.server.stats("", "Sending result to client")
+ f = open(job.save_path + "%04d" % frame_number + ".exr", 'rb')
+
+ self.send_head()
+
+ shutil.copyfileobj(f, self.wfile)
+
+ f.close()
+ elif frame.status == ERROR:
+ self.send_head(http.client.PARTIAL_CONTENT)
+ else:
+ # no such frame
+ self.send_head(http.client.NO_CONTENT)
else:
- # no such frame
+ # no such job id
self.send_head(http.client.NO_CONTENT)
else:
- # no such job id
+ # invalid url
self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/log":
- job_id = self.headers['job-id']
- job_frame = int(self.headers['job-frame'])
+ elif self.path.startswith("/log"):
+ match = log_pattern.match(self.path)
- job = self.server.getJobID(job_id)
-
- if job:
- frame = job[job_frame]
+ if match:
+ job_id = match.groups()[0]
+ frame_number = int(match.groups()[1])
- if frame:
- if not frame.log_path or frame.status in (QUEUED, DISPATCHED):
- self.send_head(http.client.PROCESSING)
+ job = self.server.getJobID(job_id)
+
+ if job:
+ frame = job[frame_number]
+
+ if frame:
+ if not frame.log_path or frame.status in (QUEUED, DISPATCHED):
+ self.send_head(http.client.PROCESSING)
+ else:
+ self.server.stats("", "Sending log to client")
+ f = open(frame.log_path, 'rb')
+
+ self.send_head(content = "text/plain")
+
+ shutil.copyfileobj(f, self.wfile)
+
+ f.close()
else:
- self.server.stats("", "Sending log to client")
- f = open(frame.log_path, 'rb')
-
- self.send_head()
-
- shutil.copyfileobj(f, self.wfile)
-
- f.close()
+ # no such frame
+ self.send_head(http.client.NO_CONTENT)
else:
- # no such frame
+ # no such job id
self.send_head(http.client.NO_CONTENT)
else:
- # no such job id
+ # invalid URL
self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "/status":
@@ -322,19 +335,24 @@
else: # invalid slave id
self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- elif self.path == "/file":
- slave_id = self.headers['slave-id']
+ elif self.path.startswith("/file"):
+ match = file_pattern.match(self.path)
- slave = self.server.getSeenSlave(slave_id)
-
- if slave: # only if slave id is valid
- job_id = self.headers['job-id']
- job_file = self.headers['job-file']
+ if match:
+ slave_id = self.headers['slave-id']
+ slave = self.server.getSeenSlave(slave_id)
+ if not slave:
+ # invalid slave id
+ print("invalid slave id")
+
+ job_id = match.groups()[0]
+ file_index = int(match.groups()[1])
+
job = self.server.getJobID(job_id)
if job:
- render_file = job.files_map.get(job_file, None)
+ render_file = job.files[file_index]
if render_file:
self.server.stats("", "Sending file to slave")
@@ -350,7 +368,7 @@
else:
# no such job id
self.send_head(http.client.NO_CONTENT)
- else: # invalid slave id
+ else: # invalid url
self.send_head(http.client.NO_CONTENT)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "/slaves":
@@ -395,10 +413,10 @@
headers={"job-id": job_id}
if job.testStart():
- self.server.stats("", "New job, missing files")
+ self.server.stats("", "New job, started")
self.send_head(headers=headers)
else:
- self.server.stats("", "New job, started")
+ self.server.stats("", "New job, missing files (%i total)" % len(job.files))
self.send_head(http.client.ACCEPTED, headers=headers)
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "/cancel":
@@ -455,22 +473,22 @@
self.server.stats("", "New slave connected")
- slave_info = netrender.model.RenderSlave.materialize(eval(str(self.rfile.read(length), encoding='utf8')))
+ slave_info = netrender.model.RenderSlave.materialize(eval(str(self.rfile.read(length), encoding='utf8')), cache = False)
slave_id = self.server.addSlave(slave_info.name, self.client_address, slave_info.stats)
self.send_head(headers = {"slave-id": slave_id})
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
elif self.path == "/log":
- slave_id = self.headers['slave-id']
+ length = int(self.headers['content-length'])
+ log_info = netrender.model.LogFile.materialize(eval(str(self.rfile.read(length), encoding='utf8')))
+
+ slave_id = log_info.slave_id
+
slave = self.server.getSeenSlave(slave_id)
if slave: # only if slave id is valid
- length = int(self.headers['content-length'])
-
- log_info = netrender.model.LogFile.materialize(eval(str(self.rfile.read(length), encoding='utf8')))
-
job = self.server.getJobID(log_info.job_id)
if job:
@@ -490,49 +508,57 @@
def do_PUT(self):
# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- if self.path == "/file":
- self.server.stats("", "Receiving job")
+ if self.path.startswith("/file"):
+ match = file_pattern.match(self.path)
- length = int(self.headers['content-length'])
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list