[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29583] trunk/blender/release/scripts/io/ netrender: netrender

Martin Poirier theeth at yahoo.com
Sun Jun 20 22:34:00 CEST 2010


Revision: 29583
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29583
Author:   theeth
Date:     2010-06-20 22:33:59 +0200 (Sun, 20 Jun 2010)

Log Message:
-----------
netrender

Save and Restore master from disk.

When the "clear on exit" option is off, write a data file (blender_master.data) in the master's path on exit and reads it back on load.

Note: Jobs and Slaves lists are restored, but not balancer settings (problem with the pickle module).

Modified Paths:
--------------
    trunk/blender/release/scripts/io/netrender/master.py
    trunk/blender/release/scripts/io/netrender/repath.py

Modified: trunk/blender/release/scripts/io/netrender/master.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/master.py	2010-06-20 19:21:41 UTC (rev 29582)
+++ trunk/blender/release/scripts/io/netrender/master.py	2010-06-20 20:33:59 UTC (rev 29583)
@@ -19,6 +19,7 @@
 import sys, os
 import http, http.client, http.server, urllib, socket, socketserver, threading
 import subprocess, shutil, time, hashlib
+import pickle
 import select # for select.error
 
 from netrender.utils import *
@@ -870,15 +871,19 @@
                 self.send_head(http.client.NO_CONTENT)
 
 class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
-    def __init__(self, address, handler_class, path):
+    def __init__(self, address, handler_class, path, subdir=True):
         super().__init__(address, handler_class)
         self.jobs = []
         self.jobs_map = {}
         self.slaves = []
         self.slaves_map = {}
         self.job_id = 0
-        self.path = path + "master_" + str(os.getpid()) + os.sep
 
+        if subdir:
+            self.path = path + "master_" + str(os.getpid()) + os.sep
+        else:
+            self.path = path
+
         self.slave_timeout = 5 # 5 mins: need a parameter for that
 
         self.balancer = netrender.balancing.Balancer()
@@ -892,6 +897,22 @@
         if not os.path.exists(self.path):
             os.mkdir(self.path)
 
+    def restore(self, jobs, slaves, balancer = None):
+        self.jobs = jobs
+        self.jobs_map = {}
+        
+        for job in self.jobs:
+            self.jobs_map[job.id] = job
+            self.job_id = max(self.job_id, int(job.id))
+
+        self.slaves = slaves
+        for slave in self.slaves:
+            self.slaves_map[slave.id] = slave
+        
+        if balancer:
+            self.balancer = balancer
+        
+
     def nextJobID(self):
         self.job_id += 1
         return str(self.job_id)
@@ -1010,8 +1031,29 @@
 def clearMaster(path):
     shutil.rmtree(path)
 
+def createMaster(address, clear, path):
+    filepath = os.path.join(path, "blender_master.data")
+
+    if not clear and os.path.exists(filepath):
+        print("loading saved master:", filepath)
+        with open(filepath, 'rb') as f:
+            path, jobs, slaves = pickle.load(f)
+            
+            httpd = RenderMasterServer(address, RenderHandler, path, subdir=False)
+            httpd.restore(jobs, slaves)
+            
+            return httpd
+
+    return RenderMasterServer(address, RenderHandler, path)
+
+def saveMaster(path, httpd):
+    filepath = os.path.join(path, "blender_master.data")
+    
+    with open(filepath, 'wb') as f:
+        pickle.dump((httpd.path, httpd.jobs, httpd.slaves), f, pickle.HIGHEST_PROTOCOL)
+
 def runMaster(address, broadcast, clear, path, update_stats, test_break):
-        httpd = RenderMasterServer(address, RenderHandler, path)
+        httpd = createMaster(address, clear, path)
         httpd.timeout = 1
         httpd.stats = update_stats
 
@@ -1040,4 +1082,6 @@
         httpd.server_close()
         if clear:
             clearMaster(httpd.path)
+        else:
+            saveMaster(path, httpd)
 

Modified: trunk/blender/release/scripts/io/netrender/repath.py
===================================================================
--- trunk/blender/release/scripts/io/netrender/repath.py	2010-06-20 19:21:41 UTC (rev 29582)
+++ trunk/blender/release/scripts/io/netrender/repath.py	2010-06-20 20:33:59 UTC (rev 29583)
@@ -47,7 +47,9 @@
     
     new_path = path + ".remap" + ext 
     
-    all = main_file.filepath == main_file.original_path 
+    # Disable for now. Partial repath should work anyway
+    #all = main_file.filepath != main_file.original_path
+    all = False 
     
     for rfile in job.files[1:]:
         if all or rfile.original_path != rfile.filepath:





More information about the Bf-blender-cvs mailing list