kata-containers/runtime/patches/0008-kata-runtime-fix-kata-runtime-resource-left-problem.patch
holyfei c709612f2a kata-containers: modify kata-containers version
Fix #I4KI81
reason: modify kata-containers version and update
it to 1.11.1

Signed-off-by: holyfei <yangfeiyu20092010@163.com>
2021-11-30 20:08:25 +08:00

178 lines
6.3 KiB
Diff

From a1bf2e1c696b703935f4b81ca087a60cc2559464 Mon Sep 17 00:00:00 2001
From: jiangpengfei <jiangpengfei9@huawei.com>
Date: Mon, 27 Jul 2020 21:45:25 +0800
Subject: [PATCH 08/50] kata-runtime: fix kata-runtime resource left problem
reason: fix the following resource left problem
- sandbox stored files and directory are deleted before work container delete
- ignore StatusSandbox error, let stopSandbox function call be executed
Signed-off-by: jiangpengfei <jiangpengfei9@huawei.com>
---
cli/delete.go | 25 +++++++++++++++++++++++--
cli/delete_test.go | 15 +++++++++++++++
cli/state.go | 6 ++++++
virtcontainers/api.go | 4 +++-
4 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/cli/delete.go b/cli/delete.go
index 2f5586e5..871ac40d 100644
--- a/cli/delete.go
+++ b/cli/delete.go
@@ -10,6 +10,7 @@ import (
"context"
"fmt"
"os"
+ "strings"
"github.com/kata-containers/runtime/pkg/katautils"
vc "github.com/kata-containers/runtime/virtcontainers"
@@ -68,6 +69,12 @@ func delete(ctx context.Context, containerID string, force bool) error {
setExternalLoggers(ctx, kataLog)
span.SetTag("container", containerID)
+ // Remove the containerID to sandboxID mapping
+ // no matter what error return
+ defer func() {
+ _ = katautils.DelContainerIDMapping(ctx, containerID)
+ }()
+
// Checks the MUST and MUST NOT from OCI runtime specification
status, sandboxID, err := getExistingContainerInfo(ctx, containerID)
if err != nil {
@@ -75,6 +82,15 @@ func delete(ctx context.Context, containerID string, force bool) error {
kataLog.Warnf("Failed to get container, force will not fail: %s", err)
return nil
}
+
+ // If err info containers "no such file or directory, because pod_sandbox type
+ // container is deleted before pod_container type container, just return nil
+ // and let containerd delete container operations continue
+ if strings.Contains(err.Error(), "no such file or directory") {
+ kataLog.Warnf("pod_sandbox deleted before pod_container: %v", err)
+ return nil
+ }
+
return err
}
@@ -123,7 +139,12 @@ func delete(ctx context.Context, containerID string, force bool) error {
}
case vc.PodContainer:
if err := deleteContainer(ctx, sandboxID, containerID, forceStop); err != nil {
- return err
+ // If err info containers "no such file or directory, because pod_sandbox type
+ // container is deleted before pod_container type container, just return nil
+ // and let containerd delete container operations continue
+ if !strings.Contains(err.Error(), "no such file or directory") {
+ return err
+ }
}
default:
return fmt.Errorf("Invalid container type found")
@@ -134,7 +155,7 @@ func delete(ctx context.Context, containerID string, force bool) error {
return err
}
- return katautils.DelContainerIDMapping(ctx, containerID)
+ return nil
}
func deleteSandbox(ctx context.Context, sandboxID string, force bool) error {
diff --git a/cli/delete_test.go b/cli/delete_test.go
index a2455dee..ae421cd7 100644
--- a/cli/delete_test.go
+++ b/cli/delete_test.go
@@ -184,6 +184,9 @@ func TestDeleteSandbox(t *testing.T) {
assert.Error(err)
assert.True(vcmock.IsMockError(err))
+ path, err = createTempContainerIDMapping(sandbox.ID(), sandbox.ID())
+ assert.NoError(err)
+
testingImpl.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
return vc.SandboxStatus{
ID: sandbox.ID(),
@@ -201,6 +204,9 @@ func TestDeleteSandbox(t *testing.T) {
assert.Error(err)
assert.True(vcmock.IsMockError(err))
+ path, err = createTempContainerIDMapping(sandbox.ID(), sandbox.ID())
+ assert.NoError(err)
+
testingImpl.StopSandboxFunc = func(ctx context.Context, sandboxID string, force bool) (vc.VCSandbox, error) {
return sandbox, nil
}
@@ -213,6 +219,9 @@ func TestDeleteSandbox(t *testing.T) {
assert.Error(err)
assert.True(vcmock.IsMockError(err))
+ path, err = createTempContainerIDMapping(sandbox.ID(), sandbox.ID())
+ assert.NoError(err)
+
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
return sandbox, nil
}
@@ -302,6 +311,9 @@ func TestDeleteSandboxRunning(t *testing.T) {
assert.Error(err)
assert.False(vcmock.IsMockError(err))
+ path, err = createTempContainerIDMapping(sandbox.ID(), sandbox.ID())
+ assert.NoError(err)
+
testingImpl.StatusSandboxFunc = func(ctx context.Context, sandboxID string) (vc.SandboxStatus, error) {
return vc.SandboxStatus{
ID: sandbox.ID(),
@@ -325,6 +337,9 @@ func TestDeleteSandboxRunning(t *testing.T) {
assert.Error(err)
assert.True(vcmock.IsMockError(err))
+ path, err = createTempContainerIDMapping(sandbox.ID(), sandbox.ID())
+ assert.NoError(err)
+
testingImpl.DeleteSandboxFunc = func(ctx context.Context, sandboxID string) (vc.VCSandbox, error) {
return sandbox, nil
}
diff --git a/cli/state.go b/cli/state.go
index a2fcc12e..de843d34 100644
--- a/cli/state.go
+++ b/cli/state.go
@@ -11,6 +11,7 @@ import (
"encoding/json"
"fmt"
"os"
+ "strings"
"github.com/kata-containers/runtime/pkg/katautils"
"github.com/kata-containers/runtime/virtcontainers/pkg/oci"
@@ -52,6 +53,11 @@ func state(ctx context.Context, containerID string) error {
// Checks the MUST and MUST NOT from OCI runtime specification
status, _, err := getExistingContainerInfo(ctx, containerID)
if err != nil {
+ // If err info containers "no such file or directory, because pod_sandbox type
+ // container is deleted before pod_container type container, just return nil
+ if strings.Contains(err.Error(), "no such file or directory") {
+ return nil
+ }
return err
}
diff --git a/virtcontainers/api.go b/virtcontainers/api.go
index fa82d163..449a03e0 100644
--- a/virtcontainers/api.go
+++ b/virtcontainers/api.go
@@ -374,7 +374,9 @@ func StatusSandbox(ctx context.Context, sandboxID string) (SandboxStatus, error)
for _, container := range s.containers {
contStatus, err := statusContainer(s, container.id)
if err != nil {
- return SandboxStatus{}, err
+ // Since statusContainer may get error because of qemu process D or T,
+ // So just ignore this error and let StatusSandbox function return actually SandboxStatus
+ s.Logger().Warnf("Status container's status in sandbox get error: %v", contStatus)
}
contStatusList = append(contStatusList, contStatus)
--
2.14.3 (Apple Git-98)