Revision: 23460
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23460
Author:   theeth
Date:     2009-09-24 21:52:32 +0200 (Thu, 24 Sep 2009)

Log Message:
-----------
netrender: draft code for cluster usage per job calculations. Eventually, this 
will be used for load balancing

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/ui.py

Modified: trunk/blender/release/io/netrender/balancing.py
===================================================================
--- trunk/blender/release/io/netrender/balancing.py     2009-09-24 19:50:15 UTC 
(rev 23459)
+++ trunk/blender/release/io/netrender/balancing.py     2009-09-24 19:52:32 UTC 
(rev 23460)
@@ -91,4 +91,4 @@
                self.limit = limit
                
        def test(self, job):
-               return not ( self.count_jobs() == 1 or self.count_slaves() == 1 
or float(job.countSlaves() + 1) / self.count_slaves() <= self.limit )
+               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-24 19:50:15 UTC 
(rev 23459)
+++ trunk/blender/release/io/netrender/master.py        2009-09-24 19:52:32 UTC 
(rev 23460)
@@ -29,7 +29,7 @@
                self.last_seen = time.time()
                
                self.job = None
-               self.frame = None
+               self.job_frames = []
                
                netrender.model.RenderSlave._slave_map[self.id] = self
 
@@ -50,6 +50,7 @@
                self.last_dispatched = time.time()
        
                # special server properties
+               self.usage = 0.0
                self.last_update = 0
                self.save_path = ""
                self.files_map = {path: MRenderFile(path, start, end) for path, 
start, end in files}
@@ -300,6 +301,9 @@
                                                f.status = DISPATCHED
                                                f.slave = slave
                                        
+                                       slave.job = job
+                                       slave.job_frames = [f.number for f in 
frames]
+                                       
                                        self.send_head(headers={"job-id": 
job.id})
                                        
                                        message = job.serialize(frames)
@@ -536,7 +540,11 @@
                                        elif job_result == ERROR:
                                                # blacklist slave on this job 
on error
                                                job.blacklist.append(slave.id)
-                                               
+                                       
+                                       slave.job_frames.remove(job_frame)
+                                       if not slave.job_frames:
+                                               slave.job = None
+                                       
                                        frame.status = job_result
                                        frame.time = job_time
 
@@ -590,6 +598,10 @@
                self.job_id = 0
                self.path = path + "master_" + str(os.getpid()) + os.sep
                
+               self.slave_timeout = 2
+               
+               self.first_usage = True
+               
                self.balancer = netrender.balancing.Balancer()
                self.balancer.addRule(netrender.balancing.RatingCredit())
                
self.balancer.addException(netrender.balancing.ExcludeQueuedEmptyJob())
@@ -611,6 +623,10 @@
                
                return slave.id
        
+       def removeSlave(self, slave):
+               self.slaves.remove(slave)
+               self.slaves_map.pop(slave.id)
+       
        def getSlave(self, slave_id):
                return self.slaves_map.get(slave_id, None)
        
@@ -621,9 +637,46 @@
                        
                return slave
        
+       def timeoutSlaves(self):
+               removed = []
+               
+               t = time.time()
+               
+               for slave in self.slaves:
+                       if (t - slave.last_seen) / 60 > self.slave_timeout:
+                               removed.append(slave)
+                               
+                               if slave.job:
+                                       for f in slave.job_frames:
+                                               slave.job[f].status = ERROR
+                               
+               for slave in removed:
+                       self.removeSlave(slave)
+       
+       def updateUsage(self):
+               m = 1.0
+               
+               if not self.first_usage:
+                       for job in self.jobs:
+                               job.usage *= 0.5
+                       
+                       m = 0.5
+               else:
+                       self.first_usage = False
+                       
+               if self.slaves:
+                       slave_usage = m / self.countSlaves()
+                       
+                       for slave in self.slaves:
+                               if slave.job:
+                                       slave.job.usage += slave_usage
+               
+       
        def clear(self):
-               self.jobs_map = {}
-               self.jobs = []
+               removed = self.jobs[:]
+               
+               for job in removed:
+                       self.removeJob(job)
        
        def update(self):
                for job in self.jobs:
@@ -646,6 +699,11 @@
 
                if job:
                        self.jobs.remove(job)
+                       
+                       for slave in self.slaves:
+                               if slave.job == job:
+                                       slave.job = None
+                                       slave.job_frames = []
        
        def addJob(self, job):
                self.jobs.append(job)
@@ -687,8 +745,12 @@
                while not test_break():
                        httpd.handle_request()
                        
-                       if broadcast:
-                               if time.time() - start_time >= 10: # need 
constant here
-                                       print("broadcasting address")
-                                       s.sendto(bytes("%i" % address[1], 
encoding='utf8'), 0, ('<broadcast>', 8000))
-                                       start_time = time.time()
+                       if time.time() - start_time >= 10: # need constant here
+                               httpd.timeoutSlaves()
+                               
+                               httpd.updateUsage()
+                               
+                               if broadcast:
+                                               print("broadcasting address")
+                                               s.sendto(bytes("%i" % 
address[1], encoding='utf8'), 0, ('<broadcast>', 8000))
+                                               start_time = time.time()

Modified: trunk/blender/release/io/netrender/master_html.py
===================================================================
--- trunk/blender/release/io/netrender/master_html.py   2009-09-24 19:50:15 UTC 
(rev 23459)
+++ trunk/blender/release/io/netrender/master_html.py   2009-09-24 19:52:32 UTC 
(rev 23460)
@@ -42,23 +42,32 @@
                output("<h2>Slaves</h2>")
                
                startTable()
-               headerTable("id", "name", "address", "stats")
+               headerTable("name", "address", "last seen", "stats", "job")
                
                for slave in handler.server.slaves:
-                       rowTable(slave.id, slave.name, slave.address[0], 
slave.stats)
+                       rowTable(slave.name, slave.address[0], 
time.ctime(slave.last_seen), slave.stats, link(slave.job.name, "/html/job" + 
slave.job.id) if slave.job else "None")
                
                endTable()
                
                output("<h2>Jobs</h2>")
                
                startTable()
-               headerTable("id", "name", "credits", "time since last", 
"length", "done", "dispatched", "error", "priority", "exception")
+               headerTable("name", "credits", "usage", "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, 
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))
+                       rowTable(       link(job.name, "/html/job" + job.id),
+                                                               
round(job.credits, 1),
+                                                               "%0.1f%%" % 
(job.usage * 100),
+                                                               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/ui.py
===================================================================
--- trunk/blender/release/io/netrender/ui.py    2009-09-24 19:50:15 UTC (rev 
23459)
+++ trunk/blender/release/io/netrender/ui.py    2009-09-24 19:52:32 UTC (rev 
23460)
@@ -165,7 +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.netclientcancelall", 
icon="ICON_PANEL_CLOSE", text="")
                subcol.itemO("render.netclientdownload", 
icon='ICON_RENDER_ANIMATION', text="")
 
                if len(bpy.data.netrender_jobs) == 0 and len(netsettings.jobs) 
> 0:


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to