diff --git a/pkg/kubelet/dockershim/checkpoint_store.go b/pkg/kubelet/dockershim/checkpoint_store.go index 51e2b5a72cc..0447d6623ff 100644 --- a/pkg/kubelet/dockershim/checkpoint_store.go +++ b/pkg/kubelet/dockershim/checkpoint_store.go @@ -57,15 +57,19 @@ type FileStore struct { path string } +func NewFileStore(path string) (CheckpointStore, error) { + if err := ensurePath(path); err != nil { + return nil, err + } + return &FileStore{path: path}, nil +} + func (fstore *FileStore) Write(key string, data []byte) error { if err := validateKey(key); err != nil { return err } - if _, err := os.Stat(fstore.path); err != nil { - // if directory already exists, proceed - if err = os.MkdirAll(fstore.path, 0755); err != nil && !os.IsExist(err) { - return err - } + if err := ensurePath(fstore.path); err != nil { + return err } tmpfile := filepath.Join(fstore.path, fmt.Sprintf("%s%s%s", tmpPrefix, key, tmpSuffix)) if err := ioutil.WriteFile(tmpfile, data, 0644); err != nil { @@ -113,6 +117,15 @@ func (fstore *FileStore) getCheckpointPath(key string) string { return filepath.Join(fstore.path, key) } +// ensurePath creates input directory if it does not exist +func ensurePath(path string) error { + if _, err := os.Stat(path); err != nil { + // MkdirAll returns nil if directory already exists + return os.MkdirAll(path, 0755) + } + return nil +} + func validateKey(key string) error { if len(key) <= keyMaxLength && keyRegex.MatchString(key) { return nil diff --git a/pkg/kubelet/dockershim/checkpoint_store_test.go b/pkg/kubelet/dockershim/checkpoint_store_test.go index c0d6e4cbf2b..97d7a5a239d 100644 --- a/pkg/kubelet/dockershim/checkpoint_store_test.go +++ b/pkg/kubelet/dockershim/checkpoint_store_test.go @@ -30,7 +30,8 @@ func TestFileStore(t *testing.T) { path, err := ioutil.TempDir("", "FileStore") assert.NoError(t, err) defer cleanUpTestPath(t, path) - store := &FileStore{path: path} + store, err := NewFileStore(path) + assert.NoError(t, err) Checkpoints := []struct { key string diff --git a/pkg/kubelet/dockershim/docker_checkpoint.go b/pkg/kubelet/dockershim/docker_checkpoint.go index 78a5b6d41d0..713b349212f 100644 --- a/pkg/kubelet/dockershim/docker_checkpoint.go +++ b/pkg/kubelet/dockershim/docker_checkpoint.go @@ -84,8 +84,12 @@ type PersistentCheckpointHandler struct { store CheckpointStore } -func NewPersistentCheckpointHandler() CheckpointHandler { - return &PersistentCheckpointHandler{store: &FileStore{path: filepath.Join(dockershimRootDir, sandboxCheckpointDir)}} +func NewPersistentCheckpointHandler() (CheckpointHandler, error) { + fstore, err := NewFileStore(filepath.Join(dockershimRootDir, sandboxCheckpointDir)) + if err != nil { + return nil, err + } + return &PersistentCheckpointHandler{store: fstore}, nil } func (handler *PersistentCheckpointHandler) CreateCheckpoint(podSandboxID string, checkpoint *PodSandboxCheckpoint) error { diff --git a/pkg/kubelet/dockershim/docker_service.go b/pkg/kubelet/dockershim/docker_service.go index db7e8568eae..2551b6f58f6 100644 --- a/pkg/kubelet/dockershim/docker_service.go +++ b/pkg/kubelet/dockershim/docker_service.go @@ -147,6 +147,10 @@ var internalLabelKeys []string = []string{containerTypeLabelKey, containerLogPat func NewDockerService(client dockertools.DockerInterface, seccompProfileRoot string, podSandboxImage string, streamingConfig *streaming.Config, pluginSettings *NetworkPluginSettings, cgroupsName string, kubeCgroupDriver string, execHandler dockertools.ExecHandler) (DockerService, error) { c := dockertools.NewInstrumentedDockerInterface(client) + checkpointHandler, err := NewPersistentCheckpointHandler() + if err != nil { + return nil, err + } ds := &dockerService{ seccompProfileRoot: seccompProfileRoot, client: c, @@ -157,7 +161,7 @@ func NewDockerService(client dockertools.DockerInterface, seccompProfileRoot str execHandler: execHandler, }, containerManager: cm.NewContainerManager(cgroupsName, client), - checkpointHandler: NewPersistentCheckpointHandler(), + checkpointHandler: checkpointHandler, } if streamingConfig != nil { var err error