Newer
Older
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)
def addSlave(self, slave_info):
slave = MRenderSlave(slave_info)
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
self.slaves.append(slave)
self.slaves_map[slave.id] = slave
return slave.id
def removeSlave(self, slave):
self.slaves.remove(slave)
self.slaves_map.pop(slave.id)
def getSlave(self, slave_id):
return self.slaves_map.get(slave_id)
def getSeenSlave(self, slave_id):
slave = self.getSlave(slave_id)
if slave:
slave.seen()
return slave
def timeoutSlaves(self):
removed = []
t = time.time()
for slave in self.slaves:
if (t - slave.last_seen) / 60 > self.slave_timeout:
removed.append(slave)
if slave.job:
for f in slave.job_frames:
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
for slave in removed:
self.removeSlave(slave)
def updateUsage(self):
blend = 0.5
for job in self.jobs:
job.usage *= (1 - blend)
if self.slaves:
slave_usage = blend / self.countSlaves()
for slave in self.slaves:
if slave.job:
slave.job.usage += slave_usage
def clear(self, clear_files = False):
removed = self.jobs[:]
for job in removed:
self.removeJob(job, clear_files)
def balance(self):
self.balancer.balance(self.jobs)
def getJobs(self):
return self.jobs
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
total = 0
for j in self.jobs:
if j.status == status:
total += 1
return total
def countSlaves(self):
return len(self.slaves)
def removeJob(self, job, clear_files = False):
self.jobs.remove(job)
self.jobs_map.pop(job.id)
if clear_files:
shutil.rmtree(job.save_path)
for slave in self.slaves:
if slave.job == job:
slave.job = None
slave.job_frames = []
def addJob(self, job):
self.jobs.append(job)
self.jobs_map[job.id] = job
# create job directory
job.save_path = os.path.join(self.path, "job_" + job.id)
verifyCreateDir(job.save_path)
job.save()
def getJobID(self, id):
return self.jobs_map.get(id)
def __iter__(self):
for job in self.jobs:
yield job
if (
not self.balancer.applyExceptions(job) # No exceptions
and slave.id not in job.blacklist # slave is not blacklisted
and (not slave.tags or job.tags.issubset(slave.tags)) # slave doesn't use tags or slave has all job tags
):
return job, job.getFrames()
return None, None
def clearMaster(path):
shutil.rmtree(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, force=force, subdir=False)
httpd.restore(jobs, slaves)
return httpd
return RenderMasterServer(address, RenderHandler, path, force=force)
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, force, path, update_stats, test_break,use_ssl=False,cert_path="",key_path=""):
Campbell Barton
committed
httpd.timeout = 1
httpd.stats = update_stats
if use_ssl:
import ssl
httpd.socket=ssl.wrap_socket(httpd.socket,certfile=cert_path,server_side=True,keyfile=key_path,ciphers="ALL",ssl_version=ssl.PROTOCOL_SSLv3)
Campbell Barton
committed
if broadcast:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
Campbell Barton
committed
start_time = time.time() - 2
Campbell Barton
committed
while not test_break():
try:
httpd.handle_request()
except select.error:
pass
Campbell Barton
committed
if time.time() - start_time >= 2: # need constant here
httpd.timeoutSlaves()
Campbell Barton
committed
httpd.updateUsage()
Campbell Barton
committed
if broadcast:
print("broadcasting address")
s.sendto(bytes("%i" % address[1], encoding='utf8'), 0, ('<broadcast>', 8000))
start_time = time.time()
Campbell Barton
committed
httpd.server_close()
if clear:
clearMaster(httpd.path)
else:
saveMaster(path, httpd)