fix(kubernetes): avoid a deadlock EE-6901 (#11447)

pull/11464/head
andres-portainer 8 months ago committed by GitHub
parent 08643ed872
commit 2443a0f568
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -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
}

Loading…
Cancel
Save