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
|
||||
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'])
|
||||
|
||||
thread_map[event['id']] = build_thread(
|
||||
|
|
|
@ -152,6 +152,17 @@ class TestWatchEvents(object):
|
|||
*thread_args)
|
||||
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):
|
||||
container_id = 'abcd'
|
||||
event_stream = [{'action': 'create', 'id': container_id}]
|
||||
|
|
Loading…
Reference in New Issue