[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25295] trunk/blender/release/scripts/io/ netrender: Netrender: categories and balancing by categories based on usage .

Martin Poirier theeth at yahoo.com
Thu Dec 10 19:56:21 CET 2009


Revision: 25295
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25295
Author:   theeth
Date:     2009-12-10 19:56:21 +0100 (Thu, 10 Dec 2009)

Log Message:
-----------
Netrender: categories and balancing by categories based on usage. Enables grouping of jobs in a single priority group. Jobs in the same category are still ordered by cluster usage.

Modified Paths:
--------------
    trunk/blender/release/scripts/io/netrender/balancing.py
    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/ui.py

Modified: trunk/blender/release/scripts/io/netrender/balancing.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/balancing.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/balancing.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -84,6 +84,16 @@
 		# less usage is better
 		return job.usage / job.priority
 
+class RatingUsageByCategory(RatingRule):
+	def __init__(self, get_jobs):
+		self.getJobs = get_jobs
+	def rate(self, job):
+		total_category_usage = sum([j.usage for j in self.getJobs() if j.category == job.category])
+		maximum_priority = max([j.priority for j in self.getJobs() if j.category == job.category])
+		
+		# less usage is better
+		return total_category_usage / maximum_priority
+	
 class NewJobPriority(PriorityRule):
 	def __init__(self, limit = 1):
 		self.limit = limit

Modified: trunk/blender/release/scripts/io/netrender/client.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/client.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/client.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -150,6 +150,7 @@
 	# print(job.files)
 	
 	job.name = job_name
+	job.category = netsettings.job_category
 	
 	for slave in netrender.blacklist:
 		job.blacklist.append(slave.id)

Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/master.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -60,17 +60,9 @@
 			self.job = None
 
 class MRenderJob(netrender.model.RenderJob):
-	def __init__(self, job_id, job_type, name, files, chunks = 1, priority = 1, blacklist = []):
-		super().__init__()
+	def __init__(self, job_id, job_info):
+		super().__init__(job_info)
 		self.id = job_id
-		self.type = job_type
-		self.name = name
-		self.files = files
-		self.frames = []
-		self.chunks = chunks
-		self.priority = priority
-		self.usage = 0.0
-		self.blacklist = blacklist
 		self.last_dispatched = time.time()
 		
 		# force one chunk for process jobs
@@ -80,7 +72,7 @@
 		# 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.files_map = {path: MRenderFile(path, start, end) for path, start, end in job_info.files}
 		self.status = JOB_WAITING
 	
 	def save(self):
@@ -393,7 +385,7 @@
 			
 			job_id = self.server.nextJobID()
 			
-			job = MRenderJob(job_id, job_info.type, job_info.name, job_info.files, chunks = job_info.chunks, priority = job_info.priority, blacklist = job_info.blacklist)
+			job = MRenderJob(job_id, job_info)
 			
 			for frame in job_info.frames:
 				frame = job.addFrame(frame.number, frame.command)
@@ -635,6 +627,7 @@
 		self.slave_timeout = 2
 		
 		self.balancer = netrender.balancing.Balancer()
+		self.balancer.addRule(netrender.balancing.RatingUsageByCategory(self.getJobs))
 		self.balancer.addRule(netrender.balancing.RatingUsage())
 		self.balancer.addException(netrender.balancing.ExcludeQueuedEmptyJob())
 		self.balancer.addException(netrender.balancing.ExcludeSlavesLimit(self.countJobs, self.countSlaves, limit = 0.9))
@@ -707,6 +700,9 @@
 	def balance(self):
 		self.balancer.balance(self.jobs)
 	
+	def getJobs(self):
+		return self.jobs
+	
 	def countJobs(self, status = JOB_QUEUED):
 		total = 0
 		for j in self.jobs:

Modified: trunk/blender/release/scripts/io/netrender/master_html.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master_html.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/master_html.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -71,6 +71,7 @@
 		startTable()
 		headerTable(	
 									"name",
+									"category",
 									"priority",
 									"usage",
 									"wait",
@@ -88,6 +89,7 @@
 			results = job.framesStatus()
 			rowTable(	
 								link(job.name, "/html/job" + job.id),
+								job.category,
 								job.priority,
 								"%0.1f%%" % (job.usage * 100),
 								"%is" % int(time.time() - job.last_dispatched),

Modified: trunk/blender/release/scripts/io/netrender/model.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/model.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/model.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -99,18 +99,29 @@
 						}
 
 class RenderJob:
-	def __init__(self):
+	def __init__(self, job_info = None):
 		self.id = ""
 		self.type = JOB_BLENDER
 		self.name = ""
+		self.category = "None"
 		self.files = []
-		self.frames = []
 		self.chunks = 0
 		self.priority = 0
+		self.blacklist = []
+
 		self.usage = 0.0
-		self.blacklist = []
 		self.last_dispatched = 0.0
-	
+		self.frames = []
+		
+		if job_info:
+			self.type = job_info.type
+			self.name = job_info.name
+			self.category = job_info.category
+			self.files = job_info.files
+			self.chunks = job_info.chunks
+			self.priority = job_info.priority
+			self.blacklist = job_info.blacklist
+			
 	def addFile(self, file_path, start=-1, end=-1):
 		self.files.append((file_path, start, end))
 	
@@ -167,6 +178,7 @@
 							"id": self.id,
 							"type": self.type,
 							"name": self.name,
+							"category": self.category,
 							"files": [f for f in self.files if f[1] == -1 or not frames or (f[1] <= max_frame and f[2] >= min_frame)],
 							"frames": [f.serialize() for f in self.frames if not frames or f in frames],
 							"chunks": self.chunks,
@@ -185,6 +197,7 @@
 		job.id = data["id"]
 		job.type = data["type"]
 		job.name = data["name"]
+		job.category = data["category"]
 		job.files = data["files"]
 		job.frames = [RenderFrame.materialize(f) for f in data["frames"]]
 		job.chunks = data["chunks"]

Modified: trunk/blender/release/scripts/io/netrender/ui.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/ui.py	2009-12-10 18:28:22 UTC (rev 25294)
+++ trunk/blender/release/scripts/io/netrender/ui.py	2009-12-10 18:56:21 UTC (rev 25295)
@@ -97,6 +97,7 @@
 		col.operator("render.netclientsend", icon='FILE_BLEND')
 		col.operator("render.netclientweb", icon='QUESTION')
 		col.prop(scene.network_render, "job_name")
+		col.prop(scene.network_render, "job_category")
 		row = col.row()
 		row.prop(scene.network_render, "priority")
 		row.prop(scene.network_render, "chunks")
@@ -264,6 +265,12 @@
 				maxlen = 128,
 				default = "[default]")
 
+NetRenderSettings.StringProperty( attr="job_category",
+				name="Job category",
+				description="Category of the job",
+				maxlen = 128,
+				default = "")
+
 NetRenderSettings.IntProperty( attr="chunks",
 				name="Chunks",
 				description="Number of frame to dispatch to each slave in one chunk",





More information about the Bf-blender-cvs mailing list