summaryrefslogtreecommitdiff
path: root/grpc/tools/run_tests/python_utils/jobset.py
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/tools/run_tests/python_utils/jobset.py')
-rwxr-xr-xgrpc/tools/run_tests/python_utils/jobset.py40
1 files changed, 27 insertions, 13 deletions
diff --git a/grpc/tools/run_tests/python_utils/jobset.py b/grpc/tools/run_tests/python_utils/jobset.py
index d9ae0620..552d16cc 100755
--- a/grpc/tools/run_tests/python_utils/jobset.py
+++ b/grpc/tools/run_tests/python_utils/jobset.py
@@ -130,15 +130,15 @@ def message(tag, msg, explanatory_text=None, do_newline=False):
try:
if platform_string() == 'windows' or not sys.stdout.isatty():
if explanatory_text:
- logging.info(explanatory_text)
+ logging.info(explanatory_text.decode('utf8'))
logging.info('%s: %s', tag, msg)
else:
sys.stdout.write(
'%s%s%s\x1b[%d;%dm%s\x1b[0m: %s%s' %
(_BEGINNING_OF_LINE, _CLEAR_LINE, '\n%s' %
- explanatory_text if explanatory_text is not None else '',
- _COLORS[_TAG_COLOR[tag]][1], _COLORS[_TAG_COLOR[tag]][0],
- tag, msg, '\n'
+ explanatory_text.decode('utf8') if explanatory_text
+ is not None else '', _COLORS[_TAG_COLOR[tag]][1],
+ _COLORS[_TAG_COLOR[tag]][0], tag, msg, '\n'
if do_newline or explanatory_text is not None else ''))
sys.stdout.flush()
return
@@ -212,6 +212,9 @@ class JobSpec(object):
def __cmp__(self, other):
return self.identity() == other.identity()
+ def __lt__(self, other):
+ return self.identity() < other.identity()
+
def __repr__(self):
return 'JobSpec(shortname=%s, cmdline=%s)' % (self.shortname,
self.cmdline)
@@ -274,7 +277,10 @@ class Job(object):
os.makedirs(logfile_dir)
self._logfile = open(self._spec.logfilename, 'w+')
else:
- self._logfile = tempfile.TemporaryFile()
+ # macOS: a series of quick os.unlink invocation might cause OS
+ # error during the creation of temporary file. By using
+ # NamedTemporaryFile, we defer the removal of file and directory.
+ self._logfile = tempfile.NamedTemporaryFile()
env = dict(os.environ)
env.update(self._spec.environ)
env.update(self._add_env)
@@ -456,14 +462,17 @@ class Jobset(object):
message('SKIPPED', spec.shortname, do_newline=True)
self.resultset[spec.shortname] = [skipped_job_result]
return True
- if self.cancelled(): return False
+ if self.cancelled():
+ return False
current_cpu_cost = self.cpu_cost()
- if current_cpu_cost == 0: break
+ if current_cpu_cost == 0:
+ break
if current_cpu_cost + spec.cpu_cost <= self._maxjobs:
if len(self._running) < self._maxjobs_cpu_agnostic:
break
self.reap(spec.shortname, spec.cpu_cost)
- if self.cancelled(): return False
+ if self.cancelled():
+ return False
job = Job(spec, self._newline_on_success, self._travis, self._add_env,
self._quiet_success)
self._running.add(job)
@@ -477,7 +486,8 @@ class Jobset(object):
dead = set()
for job in self._running:
st = eintr_be_gone(lambda: job.state())
- if st == _RUNNING: continue
+ if st == _RUNNING:
+ continue
if st == _FAILURE or st == _KILLED:
self._failures += 1
if self._stop_on_failure:
@@ -491,7 +501,8 @@ class Jobset(object):
if not self._quiet_success or job.result.state != 'PASSED':
self.resultset[job.GetSpec().shortname].append(job.result)
self._running.remove(job)
- if dead: return
+ if dead:
+ return
if not self._travis and platform_string() != 'windows':
rstr = '' if self._remaining is None else '%d queued, ' % self._remaining
if self._remaining is not None and self._completed > 0:
@@ -518,8 +529,10 @@ class Jobset(object):
def cancelled(self):
"""Poll for cancellation."""
- if self._cancelled: return True
- if not self._check_cancelled(): return False
+ if self._cancelled:
+ return True
+ if not self._check_cancelled():
+ return False
for job in self._running:
job.kill()
self._cancelled = True
@@ -527,7 +540,8 @@ class Jobset(object):
def finish(self):
while self._running:
- if self.cancelled(): pass # poll cancellation
+ if self.cancelled():
+ pass # poll cancellation
self.reap()
if platform_string() != 'windows':
signal.alarm(0)