diff --git a/api/kubernetes/cli/client.go b/api/kubernetes/cli/client.go index 9ce5366c7..70c114e54 100644 --- a/api/kubernetes/cli/client.go +++ b/api/kubernetes/cli/client.go @@ -81,21 +81,30 @@ func (factory *ClientFactory) RemoveKubeClient(endpointID portainer.EndpointID) // If no client is registered, it will create a new client, register it, and returns it. func (factory *ClientFactory) GetKubeClient(endpoint *portainer.Endpoint) (*KubeClient, error) { factory.mu.Lock() - defer factory.mu.Unlock() - key := strconv.Itoa(int(endpoint.ID)) - client, ok := factory.endpointClients[key] - if !ok { - var err error + if client, ok := factory.endpointClients[key]; ok { + factory.mu.Unlock() + return client, nil + } + factory.mu.Unlock() - client, err = factory.createCachedAdminKubeClient(endpoint) - if err != nil { - return nil, err - } + // EE-6901: Do not lock + client, err := factory.createCachedAdminKubeClient(endpoint) + if err != nil { + return nil, err + } - factory.endpointClients[key] = client + factory.mu.Lock() + defer factory.mu.Unlock() + + // The lock was released before the client was created, + // so we need to check again + if c, ok := factory.endpointClients[key]; ok { + return c, nil } + factory.endpointClients[key] = client + return client, nil }