[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