[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23496] trunk/blender/release/io/netrender : netrender: fix some bugs with job cancellation, remove credits system, add more status report on server, cleanup server error management

Martin Poirier theeth at yahoo.com
Sat Sep 26 18:22:52 CEST 2009


Revision: 23496
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23496
Author:   theeth
Date:     2009-09-26 18:22:52 +0200 (Sat, 26 Sep 2009)

Log Message:
-----------
netrender: fix some bugs with job cancellation, remove credits system, add more status report on server, cleanup server error management

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/model.py
    trunk/blender/release/io/netrender/operators.py
    trunk/blender/release/io/netrender/slave.py

Modified: trunk/blender/release/io/netrender/balancing.py
===================================================================
--- trunk/blender/release/io/netrender/balancing.py	2009-09-26 08:09:05 UTC (rev 23495)
+++ trunk/blender/release/io/netrender/balancing.py	2009-09-26 16:22:52 UTC (rev 23496)
@@ -61,12 +61,6 @@
 	
 # ==========================
 
-
-class RatingCredit(RatingRule):
-	def rate(self, job):
-		# more credit is better (sort at first in list)
-		return -job.credits * job.priority
-
 class RatingUsage(RatingRule):
 	def rate(self, job):
 		# less usage is better

Modified: trunk/blender/release/io/netrender/master.py
===================================================================
--- trunk/blender/release/io/netrender/master.py	2009-09-26 08:09:05 UTC (rev 23495)
+++ trunk/blender/release/io/netrender/master.py	2009-09-26 16:22:52 UTC (rev 23496)
@@ -35,9 +35,14 @@
 
 	def seen(self):
 		self.last_seen = time.time()
+		
+	def finishedFrame(self, frame_number):
+		self.job_frames.remove(frame_number)
+		if not self.job_frames:
+			self.job = None
 
 class MRenderJob(netrender.model.RenderJob):
-	def __init__(self, job_id, name, files, chunks = 1, priority = 1, credits = 100.0, blacklist = []):
+	def __init__(self, job_id, name, files, chunks = 1, priority = 1, blacklist = []):
 		super().__init__()
 		self.id = job_id
 		self.name = name
@@ -46,7 +51,6 @@
 		self.chunks = chunks
 		self.priority = priority
 		self.usage = 0.0
-		self.credits = credits
 		self.blacklist = blacklist
 		self.last_dispatched = time.time()
 	
@@ -79,14 +83,6 @@
 
 	def start(self):
 		self.status = JOB_QUEUED
-
-	def update(self):
-		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"
@@ -110,7 +106,6 @@
 		frames = []
 		for f in self.frames:
 			if f.status == QUEUED:
-				self.credits -= 1 # cost of one frame
 				self.last_dispatched = time.time()
 				frames.append(f)
 				if len(frames) >= self.chunks:
@@ -150,30 +145,24 @@
 		self.end_headers()
 
 	def do_HEAD(self):
-		print(self.path)
 	
 		if self.path == "/status":
 			job_id = self.headers.get('job-id', "")
 			job_frame = int(self.headers.get('job-frame', -1))
 			
-			if job_id:
-				print("status:", job_id, "\n")
+			job = self.server.getJobID(job_id)
+			if job:
+				frame = job[job_frame]
 				
-				job = self.server.getJobByID(job_id)
-				if job:
-					if job_frame != -1:
-						frame = job[frame]
-						
-						if not frame:
-							# no such frame
-							self.send_heat(http.client.NO_CONTENT)
-							return
+				
+				if frame:
+					self.send_head(http.client.OK)
 				else:
-					# no such job id
+					# no such frame
 					self.send_head(http.client.NO_CONTENT)
-					return
-			
-			self.send_head()
+			else:
+				# no such job id
+				self.send_head(http.client.NO_CONTENT)
 	
 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -182,19 +171,17 @@
 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 	
 	def do_GET(self):
-		print(self.path)
 		
 		if self.path == "/version":
 			self.send_head()
-			self.server.stats("", "New client connection")
+			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'])
-			print("render:", job_id, job_frame)
 			
-			job = self.server.getJobByID(job_id)
+			job = self.server.getJobID(job_id)
 			
 			if job:
 				frame = job[job_frame]
@@ -203,7 +190,7 @@
 					if frame.status in (QUEUED, DISPATCHED):
 						self.send_head(http.client.ACCEPTED)
 					elif frame.status == DONE:
-						self.server.stats("", "Sending result back to client")
+						self.server.stats("", "Sending result to client")
 						f = open(job.save_path + "%04d" % job_frame + ".exr", 'rb')
 						
 						self.send_head()
@@ -223,9 +210,8 @@
 		elif self.path == "/log":
 			job_id = self.headers['job-id']
 			job_frame = int(self.headers['job-frame'])
-			print("log:", job_id, job_frame)
 			
-			job = self.server.getJobByID(job_id)
+			job = self.server.getJobID(job_id)
 			
 			if job:
 				frame = job[job_frame]
@@ -234,7 +220,7 @@
 					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")
+						self.server.stats("", "Sending log to client")
 						f = open(frame.log_path, 'rb')
 						
 						self.send_head()
@@ -254,9 +240,8 @@
 			job_frame = int(self.headers.get('job-frame', -1))
 			
 			if job_id:
-				print("status:", job_id, "\n")
 				
-				job = self.server.getJobByID(job_id)
+				job = self.server.getJobID(job_id)
 				if job:
 					if job_frame != -1:
 						frame = job[frame]
@@ -279,21 +264,21 @@
 				for job in self.server:
 					message.append(job.serialize())
 			
+			
+			self.server.stats("", "Sending status")
 			self.send_head()
 			self.wfile.write(bytes(repr(message), encoding='utf8'))
 			
 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 		elif self.path == "/job":
-			self.server.update()
+			self.server.balance()
 			
 			slave_id = self.headers['slave-id']
 			
-			print("slave-id", slave_id)
+			slave = self.server.getSeenSlave(slave_id)
 			
-			slave = self.server.updateSlave(slave_id)
-			
 			if slave: # only if slave id is valid
-				job, frames = self.server.getNewJob(slave_id)
+				job, frames = self.server.newDispatch(slave_id)
 				
 				if job and frames:
 					for f in frames:
@@ -310,9 +295,12 @@
 					
 					self.wfile.write(bytes(repr(message), encoding='utf8'))
 					
-					self.server.stats("", "Sending job frame to render node")
+					self.server.stats("", "Sending job to slave")
 				else:
 					# no job available, return error code
+					slave.job = None
+					slave.job_frames = []
+					
 					self.send_head(http.client.ACCEPTED)
 			else: # invalid slave id
 				self.send_head(http.client.NO_CONTENT)
@@ -320,21 +308,19 @@
 		elif self.path == "/file":
 			slave_id = self.headers['slave-id']
 			
-			slave = self.server.updateSlave(slave_id)
+			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']
-				print("job:", job_id, "\n")
-				print("file:", job_file, "\n")
 				
-				job = self.server.getJobByID(job_id)
+				job = self.server.getJobID(job_id)
 				
 				if job:
 					render_file = job.files_map.get(job_file, None)
 					
 					if render_file:
-						self.server.stats("", "Sending file to render node")
+						self.server.stats("", "Sending file to slave")
 						f = open(render_file.filepath, 'rb')
 						
 						self.send_head()
@@ -350,9 +336,11 @@
 			else: # invalid slave id
 				self.send_head(http.client.NO_CONTENT)
 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-		elif self.path == "/slave":
+		elif self.path == "/slaves":
 			message = []
 			
+			self.server.stats("", "Sending slaves status")
+			
 			for slave in self.server.slaves:
 				message.append(slave.serialize())
 			
@@ -370,12 +358,9 @@
 	# -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 	# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 	def do_POST(self):
-		print(self.path)
 	
 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 		if self.path == "/job":
-			print("posting job info")
-			self.server.stats("", "Receiving job")
 			
 			length = int(self.headers['content-length'])
 			
@@ -383,8 +368,6 @@
 			
 			job_id = self.server.nextJobID()
 			
-			print(job_info.files)
-			
 			job = MRenderJob(job_id, job_info.name, job_info.files, chunks = job_info.chunks, priority = job_info.priority, blacklist = job_info.blacklist)
 			
 			for frame in job_info.frames:
@@ -395,18 +378,31 @@
 			headers={"job-id": job_id}
 			
 			if job.testStart():
+				self.server.stats("", "New job, missing files")
 				self.send_head(headers=headers)
 			else:
+				self.server.stats("", "New job, started")
 				self.send_head(http.client.ACCEPTED, headers=headers)
 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 		elif self.path == "/cancel":
 			job_id = self.headers.get('job-id', "")
-			if job_id:
-				print("cancel:", job_id, "\n")
-				self.server.removeJob(job_id)
-			else: # cancel all jobs
-				self.server.clear()
+			
+			job = self.server.getJobID(job_id)
+			
+			if job:
+				self.server.stats("", "Cancelling job")
+				self.server.removeJob(job)
+				self.send_head()
+			else: 
+				# no such job id
+				self.send_head(http.client.NO_CONTENT)
 				
+		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+		elif self.path == "/clear":
+			# cancel all jobs
+			self.server.stats("", "Clearing jobs")
+			self.server.clear()
+				
 			self.send_head()
 		# =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
 		elif self.path == "/reset":
@@ -414,15 +410,25 @@
 			job_frame = int(self.headers.get('job-frame', "-1"))
 			all = bool(self.headers.get('reset-all', "False"))
 			
-			job = self.server.getJobByID(job_id)
+			job = self.server.getJobID(job_id)
 			
 			if job:
 				if job_frame != -1:
-					job[job_frame].reset(all)
+					
+					frame = job[job_frame]
+					if frame:
+						self.server.stats("", "Reset job frame")
+						frame.reset(all)
+						self.send_head()
+					else:
+						# no such frame
+						self.send_head(http.client.NO_CONTENT)
+						
 				else:
+					self.server.stats("", "Reset job")
 					job.reset(all)
+					self.send_head()
 					
-				self.send_head()
 			else: # job not found
 				self.send_head(http.client.NO_CONTENT)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list