Generate sandbox exit events from CRI

Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>
This commit is contained in:
Maksym Pavlenko 2023-05-30 13:22:23 -07:00
parent cf56054594
commit fc50334ca9
2 changed files with 30 additions and 20 deletions

View File

@ -120,12 +120,10 @@ func (em *eventMonitor) startSandboxExitMonitor(ctx context.Context, id string,
exitedAt = time.Now() exitedAt = time.Now()
} }
e := &eventtypes.TaskExit{ e := &eventtypes.SandboxExit{
ContainerID: id, SandboxID: id,
ID: id, ExitStatus: exitStatus,
Pid: pid, ExitedAt: protobuf.ToTimestamp(exitedAt),
ExitStatus: exitStatus,
ExitedAt: protobuf.ToTimestamp(exitedAt),
} }
log.L.Debugf("received exit event %+v", e) log.L.Debugf("received exit event %+v", e)
@ -135,14 +133,14 @@ func (em *eventMonitor) startSandboxExitMonitor(ctx context.Context, id string,
dctx, dcancel := context.WithTimeout(dctx, handleEventTimeout) dctx, dcancel := context.WithTimeout(dctx, handleEventTimeout)
defer dcancel() defer dcancel()
sb, err := em.c.sandboxStore.Get(e.ID) sb, err := em.c.sandboxStore.Get(e.GetSandboxID())
if err == nil { if err == nil {
if err := handleSandboxExit(dctx, e, sb, em.c); err != nil { if err := handleSandboxExit(dctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
return err return err
} }
return nil return nil
} else if !errdefs.IsNotFound(err) { } else if !errdefs.IsNotFound(err) {
return fmt.Errorf("failed to get sandbox %s: %w", e.ID, err) return fmt.Errorf("failed to get sandbox %s: %w", e.SandboxID, err)
} }
return nil return nil
}() }()
@ -218,6 +216,8 @@ func convertEvent(e typeurl.Any) (string, interface{}, error) {
switch e := evt.(type) { switch e := evt.(type) {
case *eventtypes.TaskOOM: case *eventtypes.TaskOOM:
id = e.ContainerID id = e.ContainerID
case *eventtypes.SandboxExit:
id = e.SandboxID
case *eventtypes.ImageCreate: case *eventtypes.ImageCreate:
id = e.Name id = e.Name
case *eventtypes.ImageUpdate: case *eventtypes.ImageUpdate:
@ -323,7 +323,19 @@ func (em *eventMonitor) handleEvent(any interface{}) error {
} }
sb, err := em.c.sandboxStore.Get(e.ID) sb, err := em.c.sandboxStore.Get(e.ID)
if err == nil { if err == nil {
if err := handleSandboxExit(ctx, e, sb, em.c); err != nil { if err := handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err)
}
return nil
} else if !errdefs.IsNotFound(err) {
return fmt.Errorf("can't find sandbox for TaskExit event: %w", err)
}
return nil
case *eventtypes.SandboxExit:
log.L.Infof("SandboxExit event %+v", e)
sb, err := em.c.sandboxStore.Get(e.GetSandboxID())
if err == nil {
if err := handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err) return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err)
} }
return nil return nil
@ -416,13 +428,13 @@ func handleContainerExit(ctx context.Context, e *eventtypes.TaskExit, cntr conta
return nil return nil
} }
// handleSandboxExit handles TaskExit event for sandbox. // handleSandboxExit handles sandbox exit event.
func handleSandboxExit(ctx context.Context, e *eventtypes.TaskExit, sb sandboxstore.Sandbox, c *criService) error { func handleSandboxExit(ctx context.Context, sb sandboxstore.Sandbox, exitStatus uint32, exitTime time.Time, c *criService) error {
if err := sb.Status.Update(func(status sandboxstore.Status) (sandboxstore.Status, error) { if err := sb.Status.Update(func(status sandboxstore.Status) (sandboxstore.Status, error) {
status.State = sandboxstore.StateNotReady status.State = sandboxstore.StateNotReady
status.Pid = 0 status.Pid = 0
status.ExitStatus = e.ExitStatus status.ExitStatus = exitStatus
status.ExitedAt = e.ExitedAt.AsTime() status.ExitedAt = exitTime
return status, nil return status, nil
}); err != nil { }); err != nil {
return fmt.Errorf("failed to update sandbox state: %w", err) return fmt.Errorf("failed to update sandbox state: %w", err)

View File

@ -93,12 +93,10 @@ func (c *Controller) stopSandboxContainer(ctx context.Context, sandbox sandboxst
defer close(stopCh) defer close(stopCh)
exitStatus, exitedAt, err := c.waitSandboxExit(exitCtx, id, exitCh) exitStatus, exitedAt, err := c.waitSandboxExit(exitCtx, id, exitCh)
if err != nil && err != context.Canceled && err != context.DeadlineExceeded { if err != nil && err != context.Canceled && err != context.DeadlineExceeded {
e := &eventtypes.TaskExit{ e := &eventtypes.SandboxExit{
ContainerID: id, SandboxID: id,
ID: id, ExitStatus: exitStatus,
Pid: task.Pid(), ExitedAt: protobuf.ToTimestamp(exitedAt),
ExitStatus: exitStatus,
ExitedAt: protobuf.ToTimestamp(exitedAt),
} }
logrus.WithError(err).Errorf("Failed to wait sandbox exit %+v", e) logrus.WithError(err).Errorf("Failed to wait sandbox exit %+v", e)
// TODO: how to backoff // TODO: how to backoff