[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23440] trunk/blender/release/io/netrender : netrender: load balancer fixes, cancel all jobs button and small html interface changes

Martin Poirier theeth at yahoo.com
Wed Sep 23 23:46:29 CEST 2009


Revision: 23440
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23440
Author:   theeth
Date:     2009-09-23 23:46:29 +0200 (Wed, 23 Sep 2009)

Log Message:
-----------
netrender: load balancer fixes, cancel all jobs button and small html interface changes

Modified Paths:
--------------
    trunk/blender/release/io/netrender/balancing.py
    trunk/blender/release/io/netrender/master.py
    trunk/blender/release/io/netrender/master_html.py
    trunk/blender/release/io/netrender/operators.py
    trunk/blender/release/io/netrender/ui.py
    trunk/blender/release/io/netrender/utils.py

Modified: trunk/blender/release/io/netrender/balancing.py
===================================================================
--- trunk/blender/release/io/netrender/balancing.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/balancing.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -71,14 +71,14 @@
 		self.limit = limit
 		
 	def test(self, job):
-		return job.countFrames(status = DISPATCHED) < self.limit
+		return job.countFrames(status = DONE) < self.limit
 
 class MinimumTimeBetweenDispatchPriority(PriorityRule):
 	def __init__(self, limit = 10):
 		self.limit = limit
 		
 	def test(self, job):
-		return (time.time() - job.last_dispatched) / 60 > self.limit
+		return job.countFrames(status = DISPATCHED) == 0 and (time.time() - job.last_dispatched) / 60 > self.limit
 
 class ExcludeQueuedEmptyJob(ExclusionRule):
 	def test(self, job):
@@ -91,4 +91,4 @@
 		self.limit = limit
 		
 	def test(self, job):
-		return not ( self.count_jobs() == 1 or float(job.countSlaves() + 1) / self.count_slaves() <= self.limit )
\ No newline at end of file
+		return not ( self.count_jobs() == 1 or self.count_slaves() == 1 or float(job.countSlaves() + 1) / self.count_slaves() <= self.limit )

Modified: trunk/blender/release/io/netrender/master.py
===================================================================
--- trunk/blender/release/io/netrender/master.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/master.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -50,6 +50,7 @@
 		self.last_dispatched = time.time()
 	
 		# special server properties
+		self.last_update = 0
 		self.save_path = ""
 		self.files_map = {path: MRenderFile(path, start, end) for path, start, end in files}
 		self.status = JOB_WAITING
@@ -68,13 +69,23 @@
 		self.start()
 		return True
 	
+	def testFinished(self):
+		for f in self.frames:
+			if f.status == QUEUED or f.status == DISPATCHED:
+				break
+		else:
+			self.status = JOB_FINISHED
+
 	def start(self):
 		self.status = JOB_QUEUED
-	
+
 	def update(self):
-		self.credits -= 5 # cost of one frame
-		self.credits += (time.time() - self.last_dispatched) / 60
-		self.last_dispatched = time.time()
+		if self.last_update == 0:
+			self.credits += (time.time() - self.last_dispatched) / 60
+		else:
+			self.credits += (time.time() - self.last_update) / 60
+
+		self.last_update = time.time()
 	
 	def addLog(self, frames):
 		log_name = "_".join(("%04d" % f for f in frames)) + ".log"
@@ -98,7 +109,8 @@
 		frames = []
 		for f in self.frames:
 			if f.status == QUEUED:
-				self.update()
+				self.credits -= 1 # cost of one frame
+				self.last_dispatched = time.time()
 				frames.append(f)
 				if len(frames) >= self.chunks:
 					break
@@ -512,7 +524,7 @@
 					job_time = float(self.headers['job-time'])
 					
 					frame = job[job_frame]
-					
+
 					if job_result == DONE:
 						length = int(self.headers['content-length'])
 						buf = self.rfile.read(length)
@@ -527,6 +539,8 @@
 						
 					frame.status = job_result
 					frame.time = job_time
+
+					job.testFinished()
 			
 					self.server.updateSlave(self.headers['slave-id'])
 					
@@ -581,7 +595,7 @@
 		self.balancer.addException(netrender.balancing.ExcludeQueuedEmptyJob())
 		self.balancer.addException(netrender.balancing.ExcludeSlavesLimit(self.countJobs, self.countSlaves))
 		self.balancer.addPriority(netrender.balancing.NewJobPriority())
-		self.balancer.addPriority(netrender.balancing.MinimumTimeBetweenDispatchPriority())
+		self.balancer.addPriority(netrender.balancing.MinimumTimeBetweenDispatchPriority(limit = 2))
 		
 		if not os.path.exists(self.path):
 			os.mkdir(self.path)
@@ -612,6 +626,8 @@
 		self.jobs = []
 	
 	def update(self):
+		for job in self.jobs:
+			job.update()
 		self.balancer.balance(self.jobs)
 	
 	def countJobs(self, status = JOB_QUEUED):

Modified: trunk/blender/release/io/netrender/master_html.py
===================================================================
--- trunk/blender/release/io/netrender/master_html.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/master_html.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -52,11 +52,13 @@
 		output("<h2>Jobs</h2>")
 		
 		startTable()
-		headerTable("id", "name", "length", "done", "dispatched", "error")
+		headerTable("id", "name", "credits", "time since last", "length", "done", "dispatched", "error", "priority", "exception")
+
+		handler.server.update()
 		
 		for job in handler.server.jobs:
 			results = job.framesStatus()
-			rowTable(link(job.id, "/html/job" + job.id), job.name, len(job), results[DONE], results[DISPATCHED], results[ERROR])
+			rowTable(link(job.id, "/html/job" + job.id), job.name, round(job.credits, 1), int(time.time() - job.last_dispatched), len(job), results[DONE], results[DISPATCHED], results[ERROR], handler.server.balancer.applyPriorities(job), handler.server.balancer.applyExceptions(job))
 		
 		endTable()
 		

Modified: trunk/blender/release/io/netrender/operators.py
===================================================================
--- trunk/blender/release/io/netrender/operators.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/operators.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -262,6 +262,8 @@
 			
 			response = conn.getresponse()
 			print( response.status, response.reason )
+
+			netsettings.jobs.remove(netsettings.active_job_index)
 		
 		return ('FINISHED',)
 	
@@ -269,6 +271,38 @@
 		return self.execute(context)
 	
 @rnaOperator
+class RENDER_OT_netclientcancelall(bpy.types.Operator):
+	'''Operator documentation text, will be used for the operator tooltip and python docs.'''
+	__idname__ = "render.netclientcancelall"
+	__label__ = "Net Render Client Cancel All"
+	
+	# List of operator properties, the attributes will be assigned
+	# to the class instance from the operator settings before calling.
+	
+	__props__ = []
+	
+	def poll(self, context):
+		return True
+		
+	def execute(self, context):
+		netsettings = context.scene.network_render
+		conn = clientConnection(context.scene)
+		
+		if conn:
+			conn.request("POST", "/cancel")
+			
+			response = conn.getresponse()
+			print( response.status, response.reason )
+		
+			while(len(netsettings.jobs) > 0):
+				netsettings.jobs.remove(0)
+
+		return ('FINISHED',)
+	
+	def invoke(self, context, event):
+		return self.execute(context)
+
+ at rnaOperator
 class netclientdownload(bpy.types.Operator):
 	'''Operator documentation text, will be used for the operator tooltip and python docs.'''
 	__idname__ = "render.netclientdownload"

Modified: trunk/blender/release/io/netrender/ui.py
===================================================================
--- trunk/blender/release/io/netrender/ui.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/ui.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -165,6 +165,7 @@
 		subcol = col.column(align=True)
 		subcol.itemO("render.netclientstatus", icon="ICON_FILE_REFRESH", text="")
 		subcol.itemO("render.netclientcancel", icon="ICON_ZOOMOUT", text="")
+		subcol.itemO("render.netclientcancelall", icon="ICON_ZOOMOUT", text="")
 		subcol.itemO("render.netclientdownload", icon='ICON_RENDER_ANIMATION', text="")
 
 		if len(bpy.data.netrender_jobs) == 0 and len(netsettings.jobs) > 0:

Modified: trunk/blender/release/io/netrender/utils.py
===================================================================
--- trunk/blender/release/io/netrender/utils.py	2009-09-23 21:26:24 UTC (rev 23439)
+++ trunk/blender/release/io/netrender/utils.py	2009-09-23 21:46:29 UTC (rev 23440)
@@ -11,7 +11,8 @@
 # Jobs status
 JOB_WAITING = 0 # before all data has been entered
 JOB_PAUSED = 1 # paused by user
-JOB_QUEUED = 2 # ready to be dispatched
+JOB_FINISHED = 2 # finished rendering
+JOB_QUEUED = 3 # ready to be dispatched
 
 # Frames status
 QUEUED = 0
@@ -82,4 +83,4 @@
 	else:
 		full_path = prefix_directory + file_path
 	
-	return full_path
\ No newline at end of file
+	return full_path





More information about the Bf-blender-cvs mailing list