Generate sandbox exit events from CRI
Signed-off-by: Maksym Pavlenko <pavlenko.maksym@gmail.com>
This commit is contained in:
parent
cf56054594
commit
fc50334ca9
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user