mirror of https://github.com/docker/compose.git
Fix race condition on watch_events
Avoid to attach to restarting containers and ignore race conditions when trying to attach to already dead containers Signed-off-by: Ulysses Souza <ulysses.souza@docker.com>
This commit is contained in:
parent
9973f051ba
commit
47d170b06a
|
@ -230,7 +230,13 @@ def watch_events(thread_map, event_stream, presenters, thread_args):
|
||||||
|
|
||||||
# Container crashed so we should reattach to it
|
# Container crashed so we should reattach to it
|
||||||
if event['id'] in crashed_containers:
|
if event['id'] in crashed_containers:
|
||||||
event['container'].attach_log_stream()
|
container = event['container']
|
||||||
|
if not container.is_restarting:
|
||||||
|
try:
|
||||||
|
container.attach_log_stream()
|
||||||
|
except APIError:
|
||||||
|
# Just ignore errors when reattaching to already crashed containers
|
||||||
|
pass
|
||||||
crashed_containers.remove(event['id'])
|
crashed_containers.remove(event['id'])
|
||||||
|
|
||||||
thread_map[event['id']] = build_thread(
|
thread_map[event['id']] = build_thread(
|
||||||
|
|
|
@ -152,6 +152,17 @@ class TestWatchEvents(object):
|
||||||
*thread_args)
|
*thread_args)
|
||||||
assert container_id in thread_map
|
assert container_id in thread_map
|
||||||
|
|
||||||
|
def test_container_attach_event(self, thread_map, mock_presenters):
|
||||||
|
container_id = 'abcd'
|
||||||
|
mock_container = mock.Mock(is_restarting=False)
|
||||||
|
mock_container.attach_log_stream.side_effect = APIError("race condition")
|
||||||
|
event_die = {'action': 'die', 'id': container_id}
|
||||||
|
event_start = {'action': 'start', 'id': container_id, 'container': mock_container}
|
||||||
|
event_stream = [event_die, event_start]
|
||||||
|
thread_args = 'foo', 'bar'
|
||||||
|
watch_events(thread_map, event_stream, mock_presenters, thread_args)
|
||||||
|
assert mock_container.attach_log_stream.called
|
||||||
|
|
||||||
def test_other_event(self, thread_map, mock_presenters):
|
def test_other_event(self, thread_map, mock_presenters):
|
||||||
container_id = 'abcd'
|
container_id = 'abcd'
|
||||||
event_stream = [{'action': 'create', 'id': container_id}]
|
event_stream = [{'action': 'create', 'id': container_id}]
|
||||||
|
|
Loading…
Reference in New Issue