diff options
author | Martin Poirier <theeth@yahoo.com> | 2010-06-21 00:33:59 +0400 |
---|---|---|
committer | Martin Poirier <theeth@yahoo.com> | 2010-06-21 00:33:59 +0400 |
commit | 78d3793d31b380fcddbdcb3cc1ee932d68f60937 (patch) | |
tree | f0b4630f3c1718c138b249f15d6ff42a9d93b99d /release | |
parent | be8a2de393780e550c5d0c1c884e2d32e71f32f1 (diff) |
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).
Diffstat (limited to 'release')
-rw-r--r-- | release/scripts/io/netrender/master.py | 50 | ||||
-rwxr-xr-x | release/scripts/io/netrender/repath.py | 4 |
2 files changed, 50 insertions, 4 deletions
diff --git a/release/scripts/io/netrender/master.py b/release/scripts/io/netrender/master.py index 324d046e00f..f227f61a536 100644 --- a/release/scripts/io/netrender/master.py +++ b/release/scripts/io/netrender/master.py @@ -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,14 +871,18 @@ class RenderHandler(http.server.BaseHTTPRequestHandler): 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 @@ -892,6 +897,22 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer): 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 @@ class RenderMasterServer(socketserver.ThreadingMixIn, http.server.HTTPServer): 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 @@ def runMaster(address, broadcast, clear, path, update_stats, test_break): httpd.server_close() if clear: clearMaster(httpd.path) + else: + saveMaster(path, httpd) diff --git a/release/scripts/io/netrender/repath.py b/release/scripts/io/netrender/repath.py index 7d399172906..7f9befd34fb 100755 --- a/release/scripts/io/netrender/repath.py +++ b/release/scripts/io/netrender/repath.py @@ -47,7 +47,9 @@ def update(job): 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: |