add 5 minute timeout on binary patch construction

When making bsdiff/imgdiff patches, give up after 5 minutes.  (On
certain large files it can take hours to build a patch, if it ever
even completes.)

Change-Id: I123c06f8194f85f6f4e640f7eb31c7746f76ba4d
This commit is contained in:
Doug Zongker
2014-08-05 10:39:37 -07:00
parent 56d91dd07f
commit f83400896d
2 changed files with 50 additions and 24 deletions

View File

@@ -900,10 +900,26 @@ class Difference(object):
cmd.append(ttemp.name)
cmd.append(ptemp.name)
p = Run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
_, err = p.communicate()
err = []
def run():
_, e = p.communicate()
if e: err.append(e)
th = threading.Thread(target=run)
th.start()
th.join(timeout=300) # 5 mins
if th.is_alive():
print "WARNING: diff command timed out"
p.terminate()
th.join(5)
if th.is_alive():
p.kill()
th.join()
if err or p.returncode != 0:
print "WARNING: failure running %s:\n%s\n" % (diff_program, err)
return None
print "WARNING: failure running %s:\n%s\n" % (
diff_program, "".join(err))
self.patch = None
return None, None, None
diff = ptemp.read()
finally:
ptemp.close()