Fix T56938, T54222: network render broken pipe errors.
Always put content-length in the header when sending files now. Also deduplicates file sending code into one function. Patch by A K (campino). Differential Revision: https://developer.blender.org/D3741
This commit is contained in:
parent
bbf44f7484
commit
f975292b1e
Notes:
blender-bot
2023-02-14 19:31:02 +01:00
Referenced by issue #56938, Netrender: errno 32: Broken pipe Referenced by issue #54222, [netrender] Broken pipe when sending result frame
|
@ -243,14 +243,8 @@ def sendJobBaking(conn, scene, can_save = True):
|
|||
# if not ACCEPTED (but not processed), send files
|
||||
if response.status == http.client.ACCEPTED:
|
||||
for rfile in job.files:
|
||||
f = open(rfile.filepath, "rb")
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", fileURL(job_id, rfile.index), f)
|
||||
f.close()
|
||||
response = conn.getresponse()
|
||||
response.read()
|
||||
|
||||
# server will reply with ACCEPTED until all files are found
|
||||
sendFile(conn, fileURL(job_id, rfile.index), rfile.filepath)
|
||||
# server will reply with ACCEPTED until all files are found
|
||||
|
||||
return job_id
|
||||
|
||||
|
@ -333,14 +327,8 @@ def sendJobBlender(conn, scene, anim = False, can_save = True):
|
|||
# if not ACCEPTED (but not processed), send files
|
||||
if response.status == http.client.ACCEPTED:
|
||||
for rfile in job.files:
|
||||
f = open(rfile.filepath, "rb")
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", fileURL(job_id, rfile.index), f)
|
||||
f.close()
|
||||
response = conn.getresponse()
|
||||
response.read()
|
||||
|
||||
# server will reply with ACCEPTED until all files are found
|
||||
sendFile(conn, fileURL(job_id, rfile.index), rfile.filepath)
|
||||
# server will reply with ACCEPTED until all files are found
|
||||
|
||||
return job_id
|
||||
|
||||
|
|
|
@ -377,19 +377,11 @@ def render_slave(engine, netsettings, threads):
|
|||
# thumbnail first
|
||||
if netsettings.use_slave_thumb:
|
||||
thumbname = thumbnail.generate(filename)
|
||||
|
||||
if thumbname:
|
||||
f = open(thumbname, 'rb')
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", "/thumb", f, headers=headers)
|
||||
f.close()
|
||||
responseStatus(conn)
|
||||
sendFile(conn, "/thumb", thumbname, headers=headers)
|
||||
|
||||
f = open(filename, 'rb')
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", "/render", f, headers=headers)
|
||||
f.close()
|
||||
if responseStatus(conn) == http.client.NO_CONTENT:
|
||||
reponse_status = sendFile(conn, "/render", filename, headers=headers)
|
||||
if reponse_status == http.client.NO_CONTENT:
|
||||
continue
|
||||
|
||||
elif job.subtype == netrender.model.JOB_SUB_BAKING:
|
||||
|
@ -402,11 +394,8 @@ def render_slave(engine, netsettings, threads):
|
|||
headers["result-filename"] = result_filename
|
||||
headers["job-finished"] = str(result_filepath == frame_results[-1])
|
||||
|
||||
f = open(result_filepath, 'rb')
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", "/result", f, headers=headers)
|
||||
f.close()
|
||||
if responseStatus(conn) == http.client.NO_CONTENT:
|
||||
response_status = sendFile(conn, "/result", result_filepath, headers=headers)
|
||||
if response_status == http.client.NO_CONTENT:
|
||||
continue
|
||||
|
||||
elif job.type == netrender.model.JOB_PROCESS:
|
||||
|
|
|
@ -447,6 +447,16 @@ def getFileInfo(filepath, infos):
|
|||
return values
|
||||
|
||||
|
||||
def sendFile(conn, url, filepath, headers={}):
|
||||
file_size = os.path.getsize(filepath)
|
||||
if not 'content-length' in headers:
|
||||
headers['content-length'] = file_size
|
||||
with open(filepath, "rb") as f:
|
||||
with ConnectionContext():
|
||||
conn.request("PUT", url, f, headers=headers)
|
||||
return responseStatus(conn)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
try:
|
||||
start = sys.argv.index("--") + 1
|
||||
|
|
Loading…
Reference in New Issue