[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25641] trunk/blender/release/scripts/io/ netrender: netrender: edit balancing rules limits and enable/ disable them from the web interface

Martin Poirier theeth at yahoo.com
Thu Dec 31 20:11:46 CET 2009


Revision: 25641
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25641
Author:   theeth
Date:     2009-12-31 20:11:46 +0100 (Thu, 31 Dec 2009)

Log Message:
-----------
netrender: edit balancing rules limits and enable/disable them from the web interface

Modified Paths:
--------------
    trunk/blender/release/scripts/io/netrender/balancing.py
    trunk/blender/release/scripts/io/netrender/master.py
    trunk/blender/release/scripts/io/netrender/master_html.py
    trunk/blender/release/scripts/io/netrender/netrender.js

Modified: trunk/blender/release/scripts/io/netrender/balancing.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/balancing.py	2009-12-31 18:52:06 UTC (rev 25640)
+++ trunk/blender/release/scripts/io/netrender/balancing.py	2009-12-31 19:11:46 UTC (rev 25641)
@@ -22,14 +22,23 @@
 import netrender.model
 
 class RatingRule:
+    def __init__(self):
+        self.enabled = True
+        
     def rate(self, job):
         return 0
 
 class ExclusionRule:
+    def __init__(self):
+        self.enabled = True
+
     def test(self, job):
         return False
 
 class PriorityRule:
+    def __init__(self):
+        self.enabled = True
+
     def test(self, job):
         return False
 
@@ -39,6 +48,19 @@
         self.priorities = []
         self.exceptions = []
 
+    def ruleByID(self, rule_id):
+        for rule in self.rules:
+            if id(rule) == rule_id:
+                return rule
+        for rule in self.priorities:
+            if id(rule) == rule_id:
+                return rule
+        for rule in self.exceptions:
+            if id(rule) == rule_id:
+                return rule
+        
+        return None
+
     def addRule(self, rule):
         self.rules.append(rule)
 
@@ -49,18 +71,18 @@
         self.exceptions.append(exception)
 
     def applyRules(self, job):
-        return sum((rule.rate(job) for rule in self.rules))
+        return sum((rule.rate(job) for rule in self.rules if rule.enabled))
 
     def applyPriorities(self, job):
         for priority in self.priorities:
-            if priority.test(job):
+            if priority.enabled and priority.test(job):
                 return True # priorities are first
 
         return False
 
     def applyExceptions(self, job):
         for exception in self.exceptions:
-            if exception.test(job):
+            if exception.enabled and exception.test(job):
                 return True # exceptions are last
 
         return False
@@ -82,18 +104,20 @@
 
 class RatingUsage(RatingRule):
     def __str__(self):
-        return "Usage rating"
+        return "Usage per job"
 
     def rate(self, job):
         # less usage is better
         return job.usage / job.priority
 
 class RatingUsageByCategory(RatingRule):
+    def __init__(self, get_jobs):
+        super().__init__()
+        self.getJobs = get_jobs
+
     def __str__(self):
-        return "Usage per category rating"
+        return "Usage per category"
 
-    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])
@@ -102,28 +126,36 @@
         return total_category_usage / maximum_priority
 
 class NewJobPriority(PriorityRule):
+    def __init__(self, limit = 1):
+        super().__init__()
+        self.limit = limit
+    
+    def setLimit(self, value):
+        self.limit = int(value)
+
     def str_limit(self):
         return "less than %i frame%s done" % (self.limit, "s" if self.limit > 1 else "")
 
     def __str__(self):
         return "Priority to new jobs"
 
-    def __init__(self, limit = 1):
-        self.limit = limit
-
     def test(self, job):
         return job.countFrames(status = DONE) < self.limit
 
 class MinimumTimeBetweenDispatchPriority(PriorityRule):
+    def __init__(self, limit = 10):
+        super().__init__()
+        self.limit = limit
+
+    def setLimit(self, value):
+        self.limit = int(value)
+
     def str_limit(self):
         return "more than %i minute%s since last" % (self.limit, "s" if self.limit > 1 else "")
 
     def __str__(self):
         return "Priority to jobs that haven't been dispatched recently"
 
-    def __init__(self, limit = 10):
-        self.limit = limit
-
     def test(self, job):
         return job.countFrames(status = DISPATCHED) == 0 and (time.time() - job.last_dispatched) / 60 > self.limit
 
@@ -135,16 +167,20 @@
         return job.status != JOB_QUEUED or job.countFrames(status = QUEUED) == 0
 
 class ExcludeSlavesLimit(ExclusionRule):
+    def __init__(self, count_jobs, count_slaves, limit = 0.75):
+        super().__init__()
+        self.count_jobs = count_jobs
+        self.count_slaves = count_slaves
+        self.limit = limit
+
+    def setLimit(self, value):
+        self.limit = float(value)
+        
     def str_limit(self):
         return "more than %.0f%% of all slaves" % (self.limit * 100)
 
     def __str__(self):
         return "Exclude jobs that would use too many slaves"
 
-    def __init__(self, count_jobs, count_slaves, limit = 0.75):
-        self.count_jobs = count_jobs
-        self.count_slaves = count_slaves
-        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 )

Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py	2009-12-31 18:52:06 UTC (rev 25640)
+++ trunk/blender/release/scripts/io/netrender/master.py	2009-12-31 19:11:46 UTC (rev 25641)
@@ -456,6 +456,29 @@
                 # invalid url
                 self.send_head(http.client.NO_CONTENT)
         # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+        elif self.path == "/balance_limit":
+            length = int(self.headers['content-length'])
+            info_map = eval(str(self.rfile.read(length), encoding='utf8'))
+            for rule_id, limit in info_map.items():
+                try:
+                    rule = self.server.balancer.ruleByID(rule_id)
+                    if rule:
+                        rule.setLimit(limit)
+                except:
+                    pass # invalid type
+                        
+            self.send_head()
+        # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+        elif self.path == "/balance_enable":
+            length = int(self.headers['content-length'])
+            info_map = eval(str(self.rfile.read(length), encoding='utf8'))
+            for rule_id, enabled in info_map.items():
+                rule = self.server.balancer.ruleByID(rule_id)
+                if rule:
+                    rule.enabled = enabled
+                        
+            self.send_head()
+        # =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
         elif self.path.startswith("/cancel"):
             match = cancel_pattern.match(self.path)
 

Modified: trunk/blender/release/scripts/io/netrender/master_html.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master_html.py	2009-12-31 18:52:06 UTC (rev 25640)
+++ trunk/blender/release/scripts/io/netrender/master_html.py	2009-12-31 19:11:46 UTC (rev 25641)
@@ -80,6 +80,9 @@
 
     def endTable():
         output("</table>")
+        
+    def checkbox(title, value, script=""):
+        return """<input type="checkbox" title="%s" %s %s>""" % (title, "checked" if value else "", ("onclick=\"%s\"" % script) if script else "")
 
     if handler.path == "/html/netrender.js":
         f = open(os.path.join(src_folder, "netrender.js"), 'rb')
@@ -105,16 +108,34 @@
 
         startTable(caption = "Rules", class_style = "rules")
 
-        headerTable("type", "description", "limit")
+        headerTable("type", "enabled", "description", "limit")
 
         for rule in handler.server.balancer.rules:
-            rowTable("rating", rule, rule.str_limit() if hasattr(rule, "limit") else " ")
+            rowTable(   
+                        "rating",
+                        checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))),
+                        rule,
+                        rule.str_limit() + 
+                        """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " "
+                    )
 
         for rule in handler.server.balancer.priorities:
-            rowTable("priority", rule, rule.str_limit() if hasattr(rule, "limit") else " ")
+            rowTable(   
+                        "priority",
+                        checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))),
+                        rule,
+                        rule.str_limit() + 
+                        """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " "
+                    )
 
         for rule in handler.server.balancer.exceptions:
-            rowTable("exception", rule, rule.str_limit() if hasattr(rule, "limit") else " ")
+            rowTable(   
+                        "exception",
+                        checkbox("", rule.enabled, "balance_enable('%i', '%s')" % (id(rule), str(not rule.enabled))),
+                        rule,
+                        rule.str_limit() + 
+                        """<button title="edit limit" onclick="balance_edit('%i', '%s');">edit</button>""" % (id(rule), str(rule.limit)) if hasattr(rule, "limit") else " "
+                    )
 
         endTable()
 
@@ -132,49 +153,49 @@
 
         startTable()
         headerTable(
-                                    " ",
-                                    "id",
-                                    "name",
-                                    "category",
-                                    "chunks",
-                                    "priority",
-                                    "usage",
-                                    "wait",
-                                    "status",
-                                    "length",
-                                    "done",
-                                    "dispatched",
-                                    "error",
-                                    "first",
-                                    "exception"
-                                )
+                        " ",
+                        "id",

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list