[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