runtime: add logs around sandbox monitor

For debugging purposes, add some logs.

Fixes: #3815

Signed-off-by: bin <bin@hyper.sh>
This commit is contained in:
bin 2022-03-29 16:59:12 +08:00
parent fb8be96194
commit 5e1c30d484
2 changed files with 13 additions and 3 deletions

View File

@ -67,6 +67,7 @@ func wait(ctx context.Context, s *service, c *container, execID string) (int32,
if c.cType.IsSandbox() { if c.cType.IsSandbox() {
// cancel watcher // cancel watcher
if s.monitor != nil { if s.monitor != nil {
shimLog.WithField("sandbox", s.sandbox.ID()).Info("cancel watcher")
s.monitor <- nil s.monitor <- nil
} }
if err = s.sandbox.Stop(ctx, true); err != nil { if err = s.sandbox.Stop(ctx, true); err != nil {
@ -110,6 +111,7 @@ func watchSandbox(ctx context.Context, s *service) {
return return
} }
err := <-s.monitor err := <-s.monitor
shimLog.WithError(err).WithField("sandbox", s.sandbox.ID()).Info("watchSandbox gets an error or stop signal")
if err == nil { if err == nil {
return return
} }

View File

@ -18,6 +18,8 @@ const (
watcherChannelSize = 128 watcherChannelSize = 128
) )
var monitorLog = virtLog.WithField("subsystem", "virtcontainers/monitor")
// nolint: govet // nolint: govet
type monitor struct { type monitor struct {
watchers []chan error watchers []chan error
@ -33,6 +35,9 @@ type monitor struct {
} }
func newMonitor(s *Sandbox) *monitor { func newMonitor(s *Sandbox) *monitor {
// there should only be one monitor for one sandbox,
// so it's safe to let monitorLog as a global variable.
monitorLog = monitorLog.WithField("sandbox", s.ID())
return &monitor{ return &monitor{
sandbox: s, sandbox: s,
checkInterval: defaultCheckInterval, checkInterval: defaultCheckInterval,
@ -72,6 +77,7 @@ func (m *monitor) newWatcher(ctx context.Context) (chan error, error) {
} }
func (m *monitor) notify(ctx context.Context, err error) { func (m *monitor) notify(ctx context.Context, err error) {
monitorLog.WithError(err).Warn("notify on errors")
m.sandbox.agent.markDead(ctx) m.sandbox.agent.markDead(ctx)
m.Lock() m.Lock()
@ -85,18 +91,19 @@ func (m *monitor) notify(ctx context.Context, err error) {
// but just in case... // but just in case...
defer func() { defer func() {
if x := recover(); x != nil { if x := recover(); x != nil {
virtLog.Warnf("watcher closed channel: %v", x) monitorLog.Warnf("watcher closed channel: %v", x)
} }
}() }()
for _, c := range m.watchers { for _, c := range m.watchers {
monitorLog.WithError(err).Warn("write error to watcher")
// throw away message can not write to channel // throw away message can not write to channel
// make it not stuck, the first error is useful. // make it not stuck, the first error is useful.
select { select {
case c <- err: case c <- err:
default: default:
virtLog.WithField("channel-size", watcherChannelSize).Warnf("watcher channel is full, throw notify message") monitorLog.WithField("channel-size", watcherChannelSize).Warnf("watcher channel is full, throw notify message")
} }
} }
} }
@ -104,6 +111,7 @@ func (m *monitor) notify(ctx context.Context, err error) {
func (m *monitor) stop() { func (m *monitor) stop() {
// wait outside of monitor lock for the watcher channel to exit. // wait outside of monitor lock for the watcher channel to exit.
defer m.wg.Wait() defer m.wg.Wait()
monitorLog.Info("stopping monitor")
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
@ -122,7 +130,7 @@ func (m *monitor) stop() {
// but just in case... // but just in case...
defer func() { defer func() {
if x := recover(); x != nil { if x := recover(); x != nil {
virtLog.Warnf("watcher closed channel: %v", x) monitorLog.Warnf("watcher closed channel: %v", x)
} }
}() }()