[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23325] trunk/blender/release/io/netrender : netrender: only one log file for each chunk

Martin Poirier theeth at yahoo.com
Fri Sep 18 05:29:54 CEST 2009


Revision: 23325
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23325
Author:   theeth
Date:     2009-09-18 05:29:50 +0200 (Fri, 18 Sep 2009)

Log Message:
-----------
netrender: only one log file for each chunk

Modified Paths:
--------------
    trunk/blender/release/io/netrender/master.py
    trunk/blender/release/io/netrender/model.py
    trunk/blender/release/io/netrender/slave.py

Modified: trunk/blender/release/io/netrender/master.py
===================================================================
--- trunk/blender/release/io/netrender/master.py	2009-09-18 03:11:17 UTC (rev 23324)
+++ trunk/blender/release/io/netrender/master.py	2009-09-18 03:29:50 UTC (rev 23325)
@@ -82,6 +82,15 @@
 		self.credits += (time.time() - self.last_dispatched) / 60
 		self.last_dispatched = time.time()
 	
+	def addLog(self, frames):
+		log_name = "_".join(("%04d" % f for f in frames)) + ".log"
+		log_path = self.save_path + log_name
+		
+		for number in frames:
+			frame = self[number]
+			if frame:
+				frame.log_path = log_path
+	
 	def addFrame(self, frame_number):
 		frame = MRenderFrame(frame_number)
 		self.frames.append(frame)
@@ -117,6 +126,7 @@
 		self.slave = None
 		self.time = 0
 		self.status = QUEUED
+		self.log_path = None
 		
 	def reset(self, all):
 		if all or self.status == ERROR:
@@ -222,11 +232,11 @@
 				frame = job[job_frame]
 				
 				if frame:
-					if frame.status in (QUEUED, DISPATCHED):
+					if not frame.log_path or frame.status in (QUEUED, DISPATCHED):
 						self.send_head(http.client.PROCESSING)
 					else:
 						self.server.stats("", "Sending log back to client")
-						f = open(job.save_path + "%04d" % job_frame + ".log", 'rb')
+						f = open(frame.log_path, 'rb')
 						
 						self.send_head()
 						
@@ -420,7 +430,27 @@
 			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']
+			
+			slave = self.server.updateSlave(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.getJobByID(log_info.job_id)
+				
+				if job:
+					job.addLog(log_info.frames)
+					self.send_head(http.client.OK)
+				else:
+					# no such job id
+					self.send_head(http.client.NO_CONTENT)
+			else: # invalid slave id
+				self.send_head(http.client.NO_CONTENT)	
 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
@@ -526,19 +556,24 @@
 			job = self.server.getJobByID(job_id)
 			
 			if job:
-				length = int(self.headers['content-length'])
 				job_frame = int(self.headers['job-frame'])
 				
-				buf = self.rfile.read(length)
-				f = open(job.save_path + "%04d" % job_frame + ".log", 'ab')
-				f.write(buf)
-				f.close()
+				frame = job[job_frame]
+				
+				if frame and frame.log_path:
+					length = int(self.headers['content-length'])
+					buf = self.rfile.read(length)
+					f = open(frame.log_path, 'ab')
+					f.write(buf)
+					f.close()
+						
+					del buf
 					
-				del buf
-				
-				self.server.updateSlave(self.headers['slave-id'])
-				
-				self.send_head()
+					self.server.updateSlave(self.headers['slave-id'])
+					
+					self.send_head()
+				else: # frame not found
+					self.send_head(http.client.NO_CONTENT)
 			else: # job not found
 				self.send_head(http.client.NO_CONTENT)
 

Modified: trunk/blender/release/io/netrender/model.py
===================================================================
--- trunk/blender/release/io/netrender/model.py	2009-09-18 03:11:17 UTC (rev 23324)
+++ trunk/blender/release/io/netrender/model.py	2009-09-18 03:29:50 UTC (rev 23325)
@@ -4,6 +4,28 @@
 
 from netrender.utils import *
 
+class LogFile:
+	def __init__(self, job_id = 0, frames = []):
+		self.job_id = job_id
+		self.frames = frames
+	
+	def serialize(self):
+		return 	{
+							"job_id": self.job_id,
+							"frames": self.frames
+						}
+	
+	@staticmethod
+	def materialize(data):
+		if not data:
+			return None
+		
+		logfile = LogFile()
+		logfile.job_id = data["job_id"]
+		logfile.frames = data["frames"]
+		
+		return logfile
+
 class RenderSlave:
 	_slave_map = {}
 	

Modified: trunk/blender/release/io/netrender/slave.py
===================================================================
--- trunk/blender/release/io/netrender/slave.py	2009-09-18 03:11:17 UTC (rev 23324)
+++ trunk/blender/release/io/netrender/slave.py	2009-09-18 03:29:50 UTC (rev 23325)
@@ -117,8 +117,14 @@
 					print("frame", frame.number)
 					frame_args += ["-f", str(frame.number)]
 				
+				# announce log to master
+				logfile = netrender.model.LogFile(job.id, [frame.number for frame in job.frames])
+				conn.request("POST", "log", bytes(repr(logfile.serialize()), encoding='utf8'), headers={"slave-id":slave_id})
+				response = conn.getresponse()
 				
+				first_frame = job.frames[0].number
 				
+				# start render
 				start_t = time.time()
 				
 				val = SetErrorMode()
@@ -136,14 +142,15 @@
 					cancelled = engine.test_break()
 					if current_t - run_t > CANCEL_POLL_SPEED:
 						
-						# update logs. Eventually, it should support one log file for many frames
-						for frame in job.frames:
-							headers["job-frame"] = str(frame.number)
+						# update logs if needed
+						if stdout:
+							# (only need to update on one frame, they are linked
+							headers["job-frame"] = str(first_frame)
 							conn.request("PUT", "log", stdout, headers=headers)
 							response = conn.getresponse()
+							
+							stdout = bytes()
 						
-						stdout = bytes()
-						
 						run_t = current_t
 						if testCancel(conn, job.id):
 							cancelled = True
@@ -164,10 +171,10 @@
 				
 				# flush the rest of the logs
 				if stdout:
-					for frame in job.frames:
-						headers["job-frame"] = str(frame.number)
-						conn.request("PUT", "log", stdout, headers=headers)
-						response = conn.getresponse()
+					# (only need to update on one frame, they are linked
+					headers["job-frame"] = str(first_frame)
+					conn.request("PUT", "log", stdout, headers=headers)
+					response = conn.getresponse()
 				
 				headers = {"job-id":job.id, "slave-id":slave_id, "job-time":str(avg_t)}
 				





More information about the Bf-blender-cvs mailing list