[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