Fix flaky partial_change state test.

Signed-off-by: Daniel Nephin <dnephin@docker.com>
This commit is contained in:
Daniel Nephin 2016-03-21 19:07:50 -04:00
parent be1476f24b
commit 5c968f9e15
2 changed files with 9 additions and 13 deletions

View File

@ -32,8 +32,8 @@ def parallel_execute(objects, func, get_name, msg, get_deps=None):
done = 0 done = 0
errors = {} errors = {}
results = []
error_to_reraise = None error_to_reraise = None
returned = [None] * len(objects)
while done < len(objects): while done < len(objects):
try: try:
@ -46,14 +46,13 @@ def parallel_execute(objects, func, get_name, msg, get_deps=None):
if exception is None: if exception is None:
writer.write(get_name(obj), 'done') writer.write(get_name(obj), 'done')
returned[objects.index(obj)] = result results.append(result)
elif isinstance(exception, APIError): elif isinstance(exception, APIError):
errors[get_name(obj)] = exception.explanation errors[get_name(obj)] = exception.explanation
writer.write(get_name(obj), 'error') writer.write(get_name(obj), 'error')
else: else:
errors[get_name(obj)] = exception errors[get_name(obj)] = exception
error_to_reraise = exception error_to_reraise = exception
done += 1 done += 1
for obj_name, error in errors.items(): for obj_name, error in errors.items():
@ -62,7 +61,7 @@ def parallel_execute(objects, func, get_name, msg, get_deps=None):
if error_to_reraise: if error_to_reraise:
raise error_to_reraise raise error_to_reraise
return returned return results
def _no_deps(x): def _no_deps(x):
@ -74,9 +73,8 @@ def setup_queue(objects, func, get_deps, get_name):
get_deps = _no_deps get_deps = _no_deps
results = Queue() results = Queue()
started = set() # objects being processed
started = set() # objects, threads were started for finished = set() # objects which have been processed
finished = set() # already finished objects
def do_op(obj): def do_op(obj):
try: try:
@ -96,11 +94,9 @@ def setup_queue(objects, func, get_deps, get_name):
) )
def feed(): def feed():
ready_objects = [o for o in objects if ready(o)] for obj in filter(ready, objects):
for obj in ready_objects:
started.add(obj) started.add(obj)
t = Thread(target=do_op, t = Thread(target=do_op, args=(obj,))
args=(obj,))
t.daemon = True t.daemon = True
t.start() t.start()

View File

@ -38,8 +38,8 @@ class BasicProjectTest(ProjectTestCase):
super(BasicProjectTest, self).setUp() super(BasicProjectTest, self).setUp()
self.cfg = { self.cfg = {
'db': {'image': 'busybox:latest'}, 'db': {'image': 'busybox:latest', 'command': 'top'},
'web': {'image': 'busybox:latest'}, 'web': {'image': 'busybox:latest', 'command': 'top'},
} }
def test_no_change(self): def test_no_change(self):