Dup jobserver fd's for retry.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
Keith Rothman 2019-02-08 10:27:15 -08:00
parent e66cdef8a4
commit 1145e9a270
1 changed files with 19 additions and 3 deletions

View File

@ -372,6 +372,7 @@ def main(argv):
fuzzer_dir,
fuzzer_logdir,
logger,
will_retry=retry_count < (args.retries-1),
)
if exit_code <= 0:
break
@ -380,7 +381,7 @@ def main(argv):
return exit_code
def run_fuzzer(fuzzer_name, fuzzer_dir, fuzzer_logdir, logger):
def run_fuzzer(fuzzer_name, fuzzer_dir, fuzzer_logdir, logger, will_retry):
def log(msg, *a, **k):
logger.log(msg, a, k, flush=True)
@ -436,17 +437,22 @@ def run_fuzzer(fuzzer_name, fuzzer_dir, fuzzer_logdir, logger):
assert job_re, make_flags
job_rd, job_wr = job_re.groups()
# Make copies of jobserver FDs in case a retry is needed.
job_rd = int(job_rd)
job_wr = int(job_wr)
assert job_rd > 2, (job_rd, job_wr, make_flags)
assert job_wr > 2, (job_rd, job_wr, make_flags)
# Make sure the file descriptors exist..
job_rd_fd = os.fdopen(int(job_rd), 'rb', 0)
job_rd_fd = os.fdopen(job_rd, 'rb', 0)
assert job_rd_fd
job_wr_fd = os.fdopen(int(job_wr), 'rb', 0)
job_wr_fd = os.fdopen(job_wr, 'rb', 0)
assert job_wr_fd
job_rd_copy = os.dup(job_rd)
job_wr_copy = os.dup(job_wr)
p = None
try:
p = subprocess.Popen(
@ -554,6 +560,13 @@ Failed @ {time_end} with exit code: {retcode}
error_log=error_log,
time_end=time_end.isoformat())
if will_retry:
# Restore jobserver FD's
os.dup2(job_rd_copy, job_rd)
os.dup2(job_wr_copy, job_wr)
else:
os.close(job_rd_copy)
os.close(job_wr_copy)
else:
# Log the last 100 lines of a successful run
@ -566,6 +579,9 @@ Succeeded! @ {}
Succeeded! @ {}
""", time_end.isoformat(), success_log, time_end.isoformat())
os.close(job_rd_copy)
os.close(job_wr_copy)
logger.flush()
signal.signal(signal.SIGINT, old_sigint_handler)
return retcode