From 1fdff28e0a4bfc754e3e50a8c8359adb24cf38d1 Mon Sep 17 00:00:00 2001 From: Mikhail Shaverdo Date: Fri, 17 Aug 2018 19:03:24 +0300 Subject: [PATCH 1/4] Get rid of lock during list containers --- manager/manager.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/manager/manager.go b/manager/manager.go index 59216b6071..10dd907b1f 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -1096,7 +1096,11 @@ func (m *manager) getContainersDiff(containerName string) (added []info.Containe if !ok { return nil, nil, fmt.Errorf("failed to find container %q while checking for new containers", containerName) } - allContainers, err := cont.handler.ListContainers(container.ListRecursive) + contHandler := cont.handler + m.containersLock.RUnlock() + allContainers, err := contHandler.ListContainers(container.ListRecursive) + m.containersLock.RLock() + if err != nil { return nil, nil, err } From f20027e40216141c267a4f5df65957b974d45ba2 Mon Sep 17 00:00:00 2001 From: Mikhail Shaverdo Date: Mon, 27 Aug 2018 18:16:26 +0300 Subject: [PATCH 2/4] Fix manager/manager.go formatting --- manager/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manager/manager.go b/manager/manager.go index 10dd907b1f..65689590d6 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -1100,7 +1100,7 @@ func (m *manager) getContainersDiff(containerName string) (added []info.Containe m.containersLock.RUnlock() allContainers, err := contHandler.ListContainers(container.ListRecursive) m.containersLock.RLock() - + if err != nil { return nil, nil, err } From 76c980124bd1c3dd8c515e220904f300f09203b0 Mon Sep 17 00:00:00 2001 From: Mikhail Shaverdo Date: Tue, 28 Aug 2018 21:20:59 +0300 Subject: [PATCH 3/4] Improve locks layout --- manager/manager.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/manager/manager.go b/manager/manager.go index 65689590d6..a422b9021e 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -1086,26 +1086,26 @@ func (m *manager) destroyContainerLocked(containerName string) error { // Detect all containers that have been added or deleted from the specified container. func (m *manager) getContainersDiff(containerName string) (added []info.ContainerReference, removed []info.ContainerReference, err error) { - m.containersLock.RLock() - defer m.containersLock.RUnlock() - // Get all subcontainers recursively. + m.containersLock.RLock() cont, ok := m.containers[namespacedContainerName{ Name: containerName, }] + m.containersLock.RUnlock() if !ok { return nil, nil, fmt.Errorf("failed to find container %q while checking for new containers", containerName) } contHandler := cont.handler - m.containersLock.RUnlock() allContainers, err := contHandler.ListContainers(container.ListRecursive) - m.containersLock.RLock() if err != nil { return nil, nil, err } allContainers = append(allContainers, info.ContainerReference{Name: containerName}) + m.containersLock.RLock() + defer m.containersLock.RUnlock() + // Determine which were added and which were removed. allContainersSet := make(map[string]*containerData) for name, d := range m.containers { From c78a961ff7eb278efaf8d30f30fb9248d801810c Mon Sep 17 00:00:00 2001 From: Mikhail Shaverdo Date: Wed, 29 Aug 2018 22:20:42 +0300 Subject: [PATCH 4/4] Remove surplus assignation --- manager/manager.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/manager/manager.go b/manager/manager.go index a422b9021e..0fb6d5dced 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -1095,8 +1095,7 @@ func (m *manager) getContainersDiff(containerName string) (added []info.Containe if !ok { return nil, nil, fmt.Errorf("failed to find container %q while checking for new containers", containerName) } - contHandler := cont.handler - allContainers, err := contHandler.ListContainers(container.ListRecursive) + allContainers, err := cont.handler.ListContainers(container.ListRecursive) if err != nil { return nil, nil, err