[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32745] trunk/blender/release/scripts/io/ netrender: netrender
Martin Poirier
theeth at yahoo.com
Wed Oct 27 20:24:59 CEST 2010
Revision: 32745
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32745
Author: theeth
Date: 2010-10-27 20:24:58 +0200 (Wed, 27 Oct 2010)
Log Message:
-----------
netrender
New Feature:
VCS job type
Render a file (with dependencies) from a version control system (currently only supports subversion, but system is already generic).
On client, working path, server path and current revision can be guessed from data on disk or entered manually.
On slave, a working copy is created (if needed) where specified by the job and updated to the proper revision.
On master web page, job types now appear in the job lists. The job page shows the list of dependencies for "normal" jobs or versioning information for VCS jobs.
Limitations: Need to have command line tools "svn" and "svnversion". Working copy path must be the same on client and slaves (the client gets the job path relative to the working copy). When guessing, working copy path is set to the folder where the current file is (this can be changed manually after). On the slave, it will update the working copy AS SPECIFIED to the revision, so if that path is too deep, some dependencies will not be updated properly. Doesn't support mixed revisions (and will not give any warnings for that), it will always use the first revision specified by "svnversion"
Bugfix:
Thumbnail generation doesn't chew down memory anymore and always gives correct result (thumbnail on master especially could mess up between jobs with the name result filename)
Modified Paths:
--------------
trunk/blender/release/scripts/io/netrender/__init__.py
trunk/blender/release/scripts/io/netrender/client.py
trunk/blender/release/scripts/io/netrender/master.py
trunk/blender/release/scripts/io/netrender/master_html.py
trunk/blender/release/scripts/io/netrender/model.py
trunk/blender/release/scripts/io/netrender/operators.py
trunk/blender/release/scripts/io/netrender/slave.py
trunk/blender/release/scripts/io/netrender/ui.py
trunk/blender/release/scripts/io/netrender/utils.py
Added Paths:
-----------
trunk/blender/release/scripts/io/netrender/versioning.py
Modified: trunk/blender/release/scripts/io/netrender/__init__.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/__init__.py 2010-10-27 16:47:25 UTC (rev 32744)
+++ trunk/blender/release/scripts/io/netrender/__init__.py 2010-10-27 18:24:58 UTC (rev 32745)
@@ -30,6 +30,7 @@
reload(balancing)
reload(ui)
reload(repath)
+ reload(versioning)
else:
from netrender import model
from netrender import operators
@@ -41,6 +42,7 @@
from netrender import balancing
from netrender import ui
from netrender import repath
+ from netrender import versioning
jobs = []
slaves = []
Modified: trunk/blender/release/scripts/io/netrender/client.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/client.py 2010-10-27 16:47:25 UTC (rev 32744)
+++ trunk/blender/release/scripts/io/netrender/client.py 2010-10-27 18:24:58 UTC (rev 32745)
@@ -92,8 +92,32 @@
previous_frame = previous_item[0]
job.addFile(cache_path + current_file, previous_frame + 1, next_frame - 1)
+def fillCommonJobSettings(job, job_name, netsettings):
+ job.name = job_name
+ job.category = netsettings.job_category
+
+ for slave in netrender.blacklist:
+ job.blacklist.append(slave.id)
+
+ job.chunks = netsettings.chunks
+ job.priority = netsettings.priority
+
+ if netsettings.job_type == "JOB_BLENDER":
+ job.type = netrender.model.JOB_BLENDER
+ elif netsettings.job_type == "JOB_PROCESS":
+ job.type = netrender.model.JOB_PROCESS
+ elif netsettings.job_type == "JOB_VCS":
+ job.type = netrender.model.JOB_VCS
+
def clientSendJob(conn, scene, anim = False):
netsettings = scene.network_render
+ if netsettings.job_type == "JOB_BLENDER":
+ return clientSendJobBlender(conn, scene, anim)
+ elif netsettings.job_type == "JOB_VCS":
+ return clientSendJobVCS(conn, scene, anim)
+
+def clientSendJobVCS(conn, scene, anim = False):
+ netsettings = scene.network_render
job = netrender.model.RenderJob()
if anim:
@@ -103,6 +127,57 @@
job.addFrame(scene.frame_current)
filename = bpy.data.filepath
+
+ if not filename.startswith(netsettings.vcs_wpath):
+ # this is an error, need better way to handle this
+ return
+
+ filename = filename[len(netsettings.vcs_wpath):]
+
+ if filename[0] in (os.sep, os.altsep):
+ filename = filename[1:]
+
+ print("CREATING VCS JOB", filename)
+
+ job.addFile(filename, signed=False)
+
+ job_name = netsettings.job_name
+ path, name = os.path.split(filename)
+ if job_name == "[default]":
+ job_name = name
+
+
+ fillCommonJobSettings(job, job_name, netsettings)
+
+ # VCS Specific code
+ job.version_info = netrender.model.VersioningInfo()
+ job.version_info.system = netsettings.vcs_system
+ job.version_info.wpath = netsettings.vcs_wpath
+ job.version_info.rpath = netsettings.vcs_rpath
+ job.version_info.revision = netsettings.vcs_revision
+
+ # try to send path first
+ conn.request("POST", "/job", json.dumps(job.serialize()))
+ response = conn.getresponse()
+ response.read()
+
+ job_id = response.getheader("job-id")
+
+ # a VCS job is always good right now, need error handling
+
+ return job_id
+
+def clientSendJobBlender(conn, scene, anim = False):
+ netsettings = scene.network_render
+ job = netrender.model.RenderJob()
+
+ if anim:
+ for f in range(scene.frame_start, scene.frame_end + 1):
+ job.addFrame(f)
+ else:
+ job.addFrame(scene.frame_current)
+
+ filename = bpy.data.filepath
job.addFile(filename)
job_name = netsettings.job_name
@@ -160,15 +235,8 @@
#print(job.files)
- job.name = job_name
- job.category = netsettings.job_category
+ fillCommonJobSettings(job, job_name, netsettings)
- for slave in netrender.blacklist:
- job.blacklist.append(slave.id)
-
- job.chunks = netsettings.chunks
- job.priority = netsettings.priority
-
# try to send path first
conn.request("POST", "/job", json.dumps(job.serialize()))
response = conn.getresponse()
Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py 2010-10-27 16:47:25 UTC (rev 32744)
+++ trunk/blender/release/scripts/io/netrender/master.py 2010-10-27 18:24:58 UTC (rev 32745)
@@ -35,7 +35,7 @@
def test(self):
self.found = os.path.exists(self.filepath)
- if self.found:
+ if self.found and self.signature != None:
found_signature = hashFile(self.filepath)
self.found = self.signature == found_signature
@@ -105,9 +105,11 @@
self.chunks = info_map["chunks"]
def testStart(self):
- for f in self.files:
- if not f.test():
- return False
+ # Don't test files for versionned jobs
+ if not self.version_info:
+ for f in self.files:
+ if not f.test():
+ return False
self.start()
self.initInfo()
@@ -769,7 +771,7 @@
frame = job[job_frame]
if frame:
- if job.type == netrender.model.JOB_BLENDER:
+ if job.hasRenderResult():
if job_result == DONE:
length = int(self.headers['content-length'])
buf = self.rfile.read(length)
@@ -820,7 +822,7 @@
frame = job[job_frame]
if frame:
- if job.type == netrender.model.JOB_BLENDER:
+ if job.hasRenderResult():
length = int(self.headers['content-length'])
buf = self.rfile.read(length)
f = open(os.path.join(job.save_path, "%06d.jpg" % job_frame), 'wb')
Modified: trunk/blender/release/scripts/io/netrender/master_html.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master_html.py 2010-10-27 16:47:25 UTC (rev 32744)
+++ trunk/blender/release/scripts/io/netrender/master_html.py 2010-10-27 18:24:58 UTC (rev 32745)
@@ -20,6 +20,7 @@
import re
import shutil
from netrender.utils import *
+import netrender.model
src_folder = os.path.split(__file__)[0]
@@ -115,6 +116,7 @@
"id",
"name",
"category",
+ "type",
"chunks",
"priority",
"usage",
@@ -139,6 +141,7 @@
job.id,
link(job.name, "/html/job" + job.id),
job.category if job.category else "<i>None</i>",
+ netrender.model.JOB_TYPES[job.type],
str(job.chunks) +
"""<button title="increase chunks size" onclick="request('/edit_%s', "{'chunks': %i}");">+</button>""" % (job.id, job.chunks + 1) +
"""<button title="decrease chunks size" onclick="request('/edit_%s', "{'chunks': %i}");" %s>-</button>""" % (job.id, job.chunks - 1, "disabled=True" if job.chunks == 1 else ""),
@@ -228,40 +231,53 @@
endTable()
- output("<h2>Files</h2>")
-
- startTable()
- headerTable("path")
-
- tot_cache = 0
- tot_fluid = 0
-
- rowTable(job.files[0].filepath)
- rowTable("Other Files", class_style = "toggle", extra = "onclick='toggleDisplay(".other", "none", "table-row")'")
-
- for file in job.files:
- if file.filepath.endswith(".bphys"):
- tot_cache += 1
- elif file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"):
- tot_fluid += 1
- else:
- if file != job.files[0]:
- rowTable(file.filepath, class_style = "other")
-
- if tot_cache > 0:
- rowTable("%i physic cache files" % tot_cache, class_style = "toggle", extra = "onclick='toggleDisplay(".cache", "none", "table-row")'")
+ if job.type == netrender.model.JOB_BLENDER:
+ output("<h2>Files</h2>")
+
+ startTable()
+ headerTable("path")
+
+ tot_cache = 0
+ tot_fluid = 0
+
+ rowTable(job.files[0].filepath)
+ rowTable("Other Files", class_style = "toggle", extra = "onclick='toggleDisplay(".other", "none", "table-row")'")
+
for file in job.files:
if file.filepath.endswith(".bphys"):
- rowTable(os.path.split(file.filepath)[1], class_style = "cache")
+ tot_cache += 1
+ elif file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"):
+ tot_fluid += 1
+ else:
+ if file != job.files[0]:
+ rowTable(file.filepath, class_style = "other")
+
+ if tot_cache > 0:
+ rowTable("%i physic cache files" % tot_cache, class_style = "toggle", extra = "onclick='toggleDisplay(".cache", "none", "table-row")'")
+ for file in job.files:
+ if file.filepath.endswith(".bphys"):
+ rowTable(os.path.split(file.filepath)[1], class_style = "cache")
+
+ if tot_fluid > 0:
+ rowTable("%i fluid bake files" % tot_fluid, class_style = "toggle", extra = "onclick='toggleDisplay(".fluid", "none", "table-row")'")
+ for file in job.files:
+ if file.filepath.endswith(".bobj.gz") or file.filepath.endswith(".bvel.gz"):
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list