containerd/patch/0097-containerd-fix-journald-stop-container-shim-log-stuc.patch

110 lines
3.3 KiB
Diff

From c7b346f1196e7e99be5d0fd3ef82e221681820ee Mon Sep 17 00:00:00 2001
From: zhongjiawei <zhongjiawei1@huawei.com>
Date: Thu, 11 May 2023 09:47:51 +0800
Subject: [PATCH] containerd: fix journald stop container shim log stuck bug
---
runtime/v1/linux/runtime.go | 36 +++++++++++++++++++-------------
runtime/v1/shim/client/client.go | 16 ++++++++------
2 files changed, 32 insertions(+), 20 deletions(-)
diff --git a/runtime/v1/linux/runtime.go b/runtime/v1/linux/runtime.go
index eb39273..f8ddd7f 100644
--- a/runtime/v1/linux/runtime.go
+++ b/runtime/v1/linux/runtime.go
@@ -428,6 +428,18 @@ func (r *Runtime) loadTasks(ctx context.Context, ns string) ([]*Task, error) {
logDirPath := filepath.Join(r.root, ns, id)
+ copyAndClose := func(dst io.Writer, src io.ReadWriteCloser) {
+ copyDone := make(chan struct{})
+ go func() {
+ io.Copy(dst, src)
+ close(copyDone)
+ }()
+ select {
+ case <-shimExit:
+ case <-copyDone:
+ }
+ src.Close()
+ }
shimStdoutLog, err := v1.OpenShimStdoutLog(ctx, logDirPath)
if err != nil {
log.G(ctx).WithError(err).WithFields(logrus.Fields{
@@ -437,7 +449,11 @@ func (r *Runtime) loadTasks(ctx context.Context, ns string) ([]*Task, error) {
}).Error("opening shim stdout log pipe")
continue
}
- go io.Copy(os.Stdout, shimStdoutLog)
+ if r.config.ShimDebug {
+ go copyAndClose(os.Stdout, shimStdoutLog)
+ } else {
+ go copyAndClose(io.Discard, shimStdoutLog)
+ }
shimStderrLog, err := v1.OpenShimStderrLog(ctx, logDirPath)
if err != nil {
@@ -448,19 +464,11 @@ func (r *Runtime) loadTasks(ctx context.Context, ns string) ([]*Task, error) {
}).Error("opening shim stderr log pipe")
continue
}
- go io.Copy(os.Stderr, shimStderrLog)
-
- go func() {
- select {
- case <-shimExit:
- if shimStdoutLog != nil {
- shimStdoutLog.Close()
- }
- if shimStderrLog != nil {
- shimStderrLog.Close()
- }
- }
- }()
+ if r.config.ShimDebug {
+ go copyAndClose(os.Stderr, shimStderrLog)
+ } else {
+ go copyAndClose(io.Discard, shimStderrLog)
+ }
t, err := newTask(id, ns, pid, s, r.events, r.tasks, bundle)
if err != nil {
diff --git a/runtime/v1/shim/client/client.go b/runtime/v1/shim/client/client.go
index 6861df0..c5a9bba 100644
--- a/runtime/v1/shim/client/client.go
+++ b/runtime/v1/shim/client/client.go
@@ -75,20 +75,24 @@ func WithStart(binary, address, daemonAddress, cgroup string, debug bool, exitHa
}
defer f.Close()
- var stdoutLog io.ReadWriteCloser
- var stderrLog io.ReadWriteCloser
- stdoutLog, err = v1.OpenShimStdoutLog(ctx, config.WorkDir)
+ stdoutCopy := io.Discard
+ stderrCopy := io.Discard
+ stdoutLog, err := v1.OpenShimStdoutLog(ctx, config.WorkDir)
if err != nil {
return nil, nil, errors.Wrapf(err, "failed to create stdout log")
}
- stderrLog, err = v1.OpenShimStderrLog(ctx, config.WorkDir)
+ stderrLog, err := v1.OpenShimStderrLog(ctx, config.WorkDir)
if err != nil {
return nil, nil, errors.Wrapf(err, "failed to create stderr log")
}
+ if debug {
+ stdoutCopy = os.Stdout
+ stderrCopy = os.Stderr
+ }
- go io.Copy(os.Stdout, stdoutLog)
- go io.Copy(os.Stderr, stderrLog)
+ go io.Copy(stdoutCopy, stdoutLog)
+ go io.Copy(stderrCopy, stderrLog)
if err := writeFile(filepath.Join(config.Path, "address"), address); err != nil {
return nil, nil, err
--
2.33.0