Skip to content

Commit 16f3726

Browse files
committed
Generate sandbox exit events from CRI
Signed-off-by: Maksym Pavlenko <[email protected]>
1 parent 0c8cfb1 commit 16f3726

2 files changed

Lines changed: 30 additions & 20 deletions

File tree

pkg/cri/sbserver/events.go

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,10 @@ func (em *eventMonitor) startSandboxExitMonitor(ctx context.Context, id string,
120120
exitedAt = time.Now()
121121
}
122122

123-
e := &eventtypes.TaskExit{
124-
ContainerID: id,
125-
ID: id,
126-
Pid: pid,
127-
ExitStatus: exitStatus,
128-
ExitedAt: protobuf.ToTimestamp(exitedAt),
123+
e := &eventtypes.SandboxExit{
124+
SandboxID: id,
125+
ExitStatus: exitStatus,
126+
ExitedAt: protobuf.ToTimestamp(exitedAt),
129127
}
130128

131129
logrus.Debugf("received exit event %+v", e)
@@ -135,14 +133,14 @@ func (em *eventMonitor) startSandboxExitMonitor(ctx context.Context, id string,
135133
dctx, dcancel := context.WithTimeout(dctx, handleEventTimeout)
136134
defer dcancel()
137135

138-
sb, err := em.c.sandboxStore.Get(e.ID)
136+
sb, err := em.c.sandboxStore.Get(e.GetSandboxID())
139137
if err == nil {
140-
if err := handleSandboxExit(dctx, e, sb, em.c); err != nil {
138+
if err := handleSandboxExit(dctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
141139
return err
142140
}
143141
return nil
144142
} else if !errdefs.IsNotFound(err) {
145-
return fmt.Errorf("failed to get sandbox %s: %w", e.ID, err)
143+
return fmt.Errorf("failed to get sandbox %s: %w", e.SandboxID, err)
146144
}
147145
return nil
148146
}()
@@ -218,6 +216,8 @@ func convertEvent(e typeurl.Any) (string, interface{}, error) {
218216
switch e := evt.(type) {
219217
case *eventtypes.TaskOOM:
220218
id = e.ContainerID
219+
case *eventtypes.SandboxExit:
220+
id = e.SandboxID
221221
case *eventtypes.ImageCreate:
222222
id = e.Name
223223
case *eventtypes.ImageUpdate:
@@ -323,7 +323,19 @@ func (em *eventMonitor) handleEvent(any interface{}) error {
323323
}
324324
sb, err := em.c.sandboxStore.Get(e.ID)
325325
if err == nil {
326-
if err := handleSandboxExit(ctx, e, sb, em.c); err != nil {
326+
if err := handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
327+
return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err)
328+
}
329+
return nil
330+
} else if !errdefs.IsNotFound(err) {
331+
return fmt.Errorf("can't find sandbox for TaskExit event: %w", err)
332+
}
333+
return nil
334+
case *eventtypes.SandboxExit:
335+
log.L.Infof("SandboxExit event %+v", e)
336+
sb, err := em.c.sandboxStore.Get(e.GetSandboxID())
337+
if err == nil {
338+
if err := handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime(), em.c); err != nil {
327339
return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err)
328340
}
329341
return nil
@@ -416,13 +428,13 @@ func handleContainerExit(ctx context.Context, e *eventtypes.TaskExit, cntr conta
416428
return nil
417429
}
418430

419-
// handleSandboxExit handles TaskExit event for sandbox.
420-
func handleSandboxExit(ctx context.Context, e *eventtypes.TaskExit, sb sandboxstore.Sandbox, c *criService) error {
431+
// handleSandboxExit handles sandbox exit event.
432+
func handleSandboxExit(ctx context.Context, sb sandboxstore.Sandbox, exitStatus uint32, exitTime time.Time, c *criService) error {
421433
if err := sb.Status.Update(func(status sandboxstore.Status) (sandboxstore.Status, error) {
422434
status.State = sandboxstore.StateNotReady
423435
status.Pid = 0
424-
status.ExitStatus = e.ExitStatus
425-
status.ExitedAt = e.ExitedAt.AsTime()
436+
status.ExitStatus = exitStatus
437+
status.ExitedAt = exitTime
426438
return status, nil
427439
}); err != nil {
428440
return fmt.Errorf("failed to update sandbox state: %w", err)

pkg/cri/sbserver/podsandbox/sandbox_stop.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,10 @@ func (c *Controller) stopSandboxContainer(ctx context.Context, sandbox sandboxst
9393
defer close(stopCh)
9494
exitStatus, exitedAt, err := c.waitSandboxExit(exitCtx, id, exitCh)
9595
if err != nil && err != context.Canceled && err != context.DeadlineExceeded {
96-
e := &eventtypes.TaskExit{
97-
ContainerID: id,
98-
ID: id,
99-
Pid: task.Pid(),
100-
ExitStatus: exitStatus,
101-
ExitedAt: protobuf.ToTimestamp(exitedAt),
96+
e := &eventtypes.SandboxExit{
97+
SandboxID: id,
98+
ExitStatus: exitStatus,
99+
ExitedAt: protobuf.ToTimestamp(exitedAt),
102100
}
103101
logrus.WithError(err).Errorf("Failed to wait sandbox exit %+v", e)
104102
// TODO: how to backoff

0 commit comments

Comments
 (0)