From be9c04e9a90be92437c12ce90c8ff6d4ec1d83b3 Mon Sep 17 00:00:00 2001
From: jiangpengfei <jiangpengfei9@huawei.com>
Date: Thu, 18 Jul 2019 07:57:52 -0400
Subject: [PATCH] containerd: fix containerd call runv delete directly
 use wrong --root parameters

reason: When containerd-shim process is killed abnormaly, containerd will exec runv
delete command directly, however it will use the wrong --root parameters which is not
compatible with runv runtime.

Signed-off-by: jiangpengfei <jiangpengfei9@huawei.com>
---
 runtime/v1/linux/proc/init.go |  4 ++--
 runtime/v1/linux/runtime.go   | 10 +++++++++-
 2 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/runtime/v1/linux/proc/init.go b/runtime/v1/linux/proc/init.go
index d464147..44d3f58 100644
--- a/runtime/v1/linux/proc/init.go
+++ b/runtime/v1/linux/proc/init.go
@@ -45,7 +45,7 @@ import (
 const InitPidFile = "init.pid"
 
 // Default runv runtime root dir
-const defaultRunvRoot = "/run/runv"
+const DefaultRunvRoot = "/run/runv"
 
 // Init represents an initial process for a container
 type Init struct {
@@ -89,7 +89,7 @@ func NewRunc(root, path, namespace, runtime, criu string, systemd bool) *runc.Ru
 
 	rootPath := filepath.Join(root, namespace)
 	if strings.Contains(runtime, "runv") {
-		rootPath = defaultRunvRoot
+		rootPath = DefaultRunvRoot
 	}
 
 	return &runc.Runc{
diff --git a/runtime/v1/linux/runtime.go b/runtime/v1/linux/runtime.go
index 66914fe..f8e3074 100644
--- a/runtime/v1/linux/runtime.go
+++ b/runtime/v1/linux/runtime.go
@@ -25,6 +25,7 @@ import (
 	"io/ioutil"
 	"os"
 	"path/filepath"
+	"strings"
 	"time"
 
 	eventstypes "github.com/containerd/containerd/api/events"
@@ -506,6 +507,7 @@ func (r *Runtime) terminate(ctx context.Context, bundle *bundle, ns, id string)
 	if err != nil {
 		return err
 	}
+
 	if err := rt.Delete(ctx, id, &runc.DeleteOpts{
 		Force: true,
 	}); err != nil {
@@ -539,11 +541,17 @@ func (r *Runtime) getRuntime(ctx context.Context, ns, id string) (*runc.Runc, er
 		}
 	}
 
+	rootPath := filepath.Join(root, ns)
+
+	if strings.Contains(cmd, "runv") {
+		rootPath = proc.DefaultRunvRoot
+	}
+
 	return &runc.Runc{
 		Command:      cmd,
 		LogFormat:    runc.JSON,
 		PdeathSignal: unix.SIGKILL,
-		Root:         filepath.Join(root, ns),
+		Root:         rootPath,
 		Debug:        r.config.ShimDebug,
 	}, nil
 }
-- 
1.8.3.1

