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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to