From 012acad32ed2022ced713d4c734d505d08a2c770 Mon Sep 17 00:00:00 2001 From: Minhan Xia Date: Tue, 14 Feb 2017 11:13:29 -0800 Subject: [PATCH] add CheckpointNotFound error --- pkg/kubelet/dockershim/checkpoint_store.go | 9 +++++++- .../dockershim/checkpoint_store_test.go | 3 ++- pkg/kubelet/dockershim/docker_checkpoint.go | 7 +++--- pkg/kubelet/dockershim/docker_sandbox.go | 3 ++- pkg/kubelet/dockershim/docker_service.go | 9 +++++++- pkg/kubelet/dockershim/errors/errors.go | 22 +++++++++++++++++++ pkg/kubelet/dockershim/testing/util.go | 5 +++-- 7 files changed, 48 insertions(+), 10 deletions(-) create mode 100644 pkg/kubelet/dockershim/errors/errors.go diff --git a/pkg/kubelet/dockershim/checkpoint_store.go b/pkg/kubelet/dockershim/checkpoint_store.go index 32215174906..51e2b5a72cc 100644 --- a/pkg/kubelet/dockershim/checkpoint_store.go +++ b/pkg/kubelet/dockershim/checkpoint_store.go @@ -23,6 +23,8 @@ import ( "path/filepath" "regexp" "strings" + + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" ) const ( @@ -40,6 +42,7 @@ type CheckpointStore interface { // Write persists a checkpoint with key Write(key string, data []byte) error // Read retrieves a checkpoint with key + // Read must return CheckpointNotFoundError if checkpoint is not found Read(key string) ([]byte, error) // Delete deletes a checkpoint with key // Delete must not return error if checkpoint does not exist @@ -75,7 +78,11 @@ func (fstore *FileStore) Read(key string) ([]byte, error) { if err := validateKey(key); err != nil { return nil, err } - return ioutil.ReadFile(fstore.getCheckpointPath(key)) + bytes, err := ioutil.ReadFile(fstore.getCheckpointPath(key)) + if os.IsNotExist(err) { + return bytes, errors.CheckpointNotFoundError + } + return bytes, err } func (fstore *FileStore) Delete(key string) error { diff --git a/pkg/kubelet/dockershim/checkpoint_store_test.go b/pkg/kubelet/dockershim/checkpoint_store_test.go index 44731bc26c8..c0d6e4cbf2b 100644 --- a/pkg/kubelet/dockershim/checkpoint_store_test.go +++ b/pkg/kubelet/dockershim/checkpoint_store_test.go @@ -23,6 +23,7 @@ import ( "testing" "github.com/stretchr/testify/assert" + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" ) func TestFileStore(t *testing.T) { @@ -102,7 +103,7 @@ func TestFileStore(t *testing.T) { err = store.Delete(c.key) assert.NoError(t, err) _, err = store.Read(c.key) - assert.Error(t, err) + assert.EqualValues(t, errors.CheckpointNotFoundError, err) } // Test delete non existed checkpoint diff --git a/pkg/kubelet/dockershim/docker_checkpoint.go b/pkg/kubelet/dockershim/docker_checkpoint.go index 16f95f06259..78a5b6d41d0 100644 --- a/pkg/kubelet/dockershim/docker_checkpoint.go +++ b/pkg/kubelet/dockershim/docker_checkpoint.go @@ -23,6 +23,7 @@ import ( "path/filepath" "github.com/golang/glog" + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" hashutil "k8s.io/kubernetes/pkg/util/hash" ) @@ -34,8 +35,6 @@ const ( schemaVersion = "v1" ) -var CorruptCheckpointError = fmt.Errorf("checkpoint is corrupted.") - type Protocol string // PortMapping is the port mapping configurations of a sandbox. @@ -108,11 +107,11 @@ func (handler *PersistentCheckpointHandler) GetCheckpoint(podSandboxID string) ( err = json.Unmarshal(blob, &checkpoint) if err != nil { glog.Errorf("Failed to unmarshal checkpoint %q. Checkpoint content: %q. ErrMsg: %v", podSandboxID, string(blob), err) - return &checkpoint, CorruptCheckpointError + return &checkpoint, errors.CorruptCheckpointError } if checkpoint.CheckSum != calculateChecksum(checkpoint) { glog.Errorf("Checksum of checkpoint %q is not valid", podSandboxID) - return &checkpoint, CorruptCheckpointError + return &checkpoint, errors.CorruptCheckpointError } return &checkpoint, nil } diff --git a/pkg/kubelet/dockershim/docker_sandbox.go b/pkg/kubelet/dockershim/docker_sandbox.go index 40689d6ff52..42098bd4ad9 100644 --- a/pkg/kubelet/dockershim/docker_sandbox.go +++ b/pkg/kubelet/dockershim/docker_sandbox.go @@ -27,6 +27,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" runtimeapi "k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" "k8s.io/kubernetes/pkg/kubelet/dockertools" "k8s.io/kubernetes/pkg/kubelet/qos" "k8s.io/kubernetes/pkg/kubelet/types" @@ -355,7 +356,7 @@ func (ds *dockerService) ListPodSandbox(filter *runtimeapi.PodSandboxFilter) ([] if err != nil { glog.Errorf("Failed to retrieve checkpoint for sandbox %q: %v", id, err) - if err == CorruptCheckpointError { + if err == errors.CorruptCheckpointError { glog.V(2).Info("Removing corrupted checkpoint %q: %+v", id, *checkpoint) ds.checkpointHandler.RemoveCheckpoint(id) } diff --git a/pkg/kubelet/dockershim/docker_service.go b/pkg/kubelet/dockershim/docker_service.go index f271bb3a3b0..1bb60131889 100644 --- a/pkg/kubelet/dockershim/docker_service.go +++ b/pkg/kubelet/dockershim/docker_service.go @@ -32,6 +32,7 @@ import ( kubecm "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/dockershim/cm" + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" "k8s.io/kubernetes/pkg/kubelet/dockertools" "k8s.io/kubernetes/pkg/kubelet/network" "k8s.io/kubernetes/pkg/kubelet/network/cni" @@ -292,8 +293,14 @@ func (ds *dockerService) GetNetNS(podSandboxID string) (string, error) { func (ds *dockerService) GetPodPortMappings(podSandboxID string) ([]*hostport.PortMapping, error) { // TODO: get portmappings from docker labels for backward compatibility checkpoint, err := ds.checkpointHandler.GetCheckpoint(podSandboxID) + // Return empty portMappings if checkpoint is not found if err != nil { - return nil, err + if err == errors.CheckpointNotFoundError { + glog.Warningf("Failed to retrieve checkpoint for sandbox %q: %v", err) + return nil, nil + } else { + return nil, err + } } portMappings := []*hostport.PortMapping{} diff --git a/pkg/kubelet/dockershim/errors/errors.go b/pkg/kubelet/dockershim/errors/errors.go new file mode 100644 index 00000000000..25462ffd9c8 --- /dev/null +++ b/pkg/kubelet/dockershim/errors/errors.go @@ -0,0 +1,22 @@ +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package errors + +import "fmt" + +var CorruptCheckpointError = fmt.Errorf("checkpoint is corrupted.") +var CheckpointNotFoundError = fmt.Errorf("checkpoint is not found.") diff --git a/pkg/kubelet/dockershim/testing/util.go b/pkg/kubelet/dockershim/testing/util.go index cf870a99e7a..02195b0266a 100644 --- a/pkg/kubelet/dockershim/testing/util.go +++ b/pkg/kubelet/dockershim/testing/util.go @@ -17,8 +17,9 @@ limitations under the License. package testing import ( - "fmt" "sync" + + "k8s.io/kubernetes/pkg/kubelet/dockershim/errors" ) // MemStore is an implementation of CheckpointStore interface which stores checkpoint in memory. @@ -43,7 +44,7 @@ func (mstore *MemStore) Read(key string) ([]byte, error) { defer mstore.Unlock() data, ok := mstore.mem[key] if !ok { - return nil, fmt.Errorf("checkpoint %q could not be found", key) + return nil, errors.CheckpointNotFoundError } return data, nil }