[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