mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-09-15 06:01:50 +00:00
fix(kubelet): protect containerCleanupInfos
from concurrent map writes
Signed-off-by: knight42 <anonymousknight96@gmail.com>
This commit is contained in:
@@ -83,6 +83,25 @@ func (ds *dockerService) ListContainers(_ context.Context, r *runtimeapi.ListCon
|
|||||||
return &runtimeapi.ListContainersResponse{Containers: result}, nil
|
return &runtimeapi.ListContainersResponse{Containers: result}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ds *dockerService) getContainerCleanupInfo(containerID string) (*containerCleanupInfo, bool) {
|
||||||
|
ds.cleanupInfosLock.RLock()
|
||||||
|
defer ds.cleanupInfosLock.RUnlock()
|
||||||
|
info, ok := ds.containerCleanupInfos[containerID]
|
||||||
|
return info, ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ds *dockerService) setContainerCleanupInfo(containerID string, info *containerCleanupInfo) {
|
||||||
|
ds.cleanupInfosLock.Lock()
|
||||||
|
defer ds.cleanupInfosLock.Unlock()
|
||||||
|
ds.containerCleanupInfos[containerID] = info
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ds *dockerService) clearContainerCleanupInfo(containerID string) {
|
||||||
|
ds.cleanupInfosLock.Lock()
|
||||||
|
defer ds.cleanupInfosLock.Unlock()
|
||||||
|
delete(ds.containerCleanupInfos, containerID)
|
||||||
|
}
|
||||||
|
|
||||||
// CreateContainer creates a new container in the given PodSandbox
|
// CreateContainer creates a new container in the given PodSandbox
|
||||||
// Docker cannot store the log to an arbitrary location (yet), so we create an
|
// Docker cannot store the log to an arbitrary location (yet), so we create an
|
||||||
// symlink at LogPath, linking to the actual path of the log.
|
// symlink at LogPath, linking to the actual path of the log.
|
||||||
@@ -185,7 +204,7 @@ func (ds *dockerService) CreateContainer(_ context.Context, r *runtimeapi.Create
|
|||||||
// we don't perform the clean up just yet at that could destroy information
|
// we don't perform the clean up just yet at that could destroy information
|
||||||
// needed for the container to start (e.g. Windows credentials stored in
|
// needed for the container to start (e.g. Windows credentials stored in
|
||||||
// registry keys); instead, we'll clean up when the container gets removed
|
// registry keys); instead, we'll clean up when the container gets removed
|
||||||
ds.containerCleanupInfos[containerID] = cleanupInfo
|
ds.setContainerCleanupInfo(containerID, cleanupInfo)
|
||||||
}
|
}
|
||||||
return &runtimeapi.CreateContainerResponse{ContainerId: containerID}, nil
|
return &runtimeapi.CreateContainerResponse{ContainerId: containerID}, nil
|
||||||
}
|
}
|
||||||
@@ -461,11 +480,11 @@ func (ds *dockerService) UpdateContainerResources(_ context.Context, r *runtimea
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ds *dockerService) performPlatformSpecificContainerForContainer(containerID string) (errors []error) {
|
func (ds *dockerService) performPlatformSpecificContainerForContainer(containerID string) (errors []error) {
|
||||||
if cleanupInfo, present := ds.containerCleanupInfos[containerID]; present {
|
if cleanupInfo, present := ds.getContainerCleanupInfo(containerID); present {
|
||||||
errors = ds.performPlatformSpecificContainerCleanupAndLogErrors(containerID, cleanupInfo)
|
errors = ds.performPlatformSpecificContainerCleanupAndLogErrors(containerID, cleanupInfo)
|
||||||
|
|
||||||
if len(errors) == 0 {
|
if len(errors) == 0 {
|
||||||
delete(ds.containerCleanupInfos, containerID)
|
ds.clearContainerCleanupInfo(containerID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -31,7 +31,7 @@ import (
|
|||||||
dockertypes "github.com/docker/docker/api/types"
|
dockertypes "github.com/docker/docker/api/types"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
|
|
||||||
"k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
|
runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
|
||||||
kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
|
kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config"
|
||||||
"k8s.io/kubernetes/pkg/kubelet/checkpointmanager"
|
"k8s.io/kubernetes/pkg/kubelet/checkpointmanager"
|
||||||
@@ -316,6 +316,7 @@ type dockerService struct {
|
|||||||
// (see `applyPlatformSpecificDockerConfig` and `performPlatformSpecificContainerCleanup`
|
// (see `applyPlatformSpecificDockerConfig` and `performPlatformSpecificContainerCleanup`
|
||||||
// methods for more info).
|
// methods for more info).
|
||||||
containerCleanupInfos map[string]*containerCleanupInfo
|
containerCleanupInfos map[string]*containerCleanupInfo
|
||||||
|
cleanupInfosLock sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: handle context.
|
// TODO: handle context.
|
||||||
|
Reference in New Issue
Block a user