[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