From fcc77c654bed6578596782442a02d092c397d01c Mon Sep 17 00:00:00 2001 From: Mikhail Shaverdo Date: Wed, 29 Aug 2018 23:06:28 +0300 Subject: [PATCH] Get rid of lock during list containers (#2024) * Get rid of lock during list containers --- manager/manager.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/manager/manager.go b/manager/manager.go index 59216b60..0fb6d5dc 100644 --- a/manager/manager.go +++ b/manager/manager.go @@ -1086,22 +1086,25 @@ 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) } allContainers, err := cont.handler.ListContainers(container.ListRecursive) + 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 {