HandleEvent handles a containerd event.
(any any)
| 320 | |
| 321 | // HandleEvent handles a containerd event. |
| 322 | func (ce *criEventHandler) HandleEvent(any any) error { |
| 323 | ctx := ctrdutil.NamespacedContext() |
| 324 | ctx, cancel := context.WithTimeout(ctx, handleEventTimeout) |
| 325 | defer cancel() |
| 326 | |
| 327 | switch e := any.(type) { |
| 328 | case *eventtypes.TaskExit: |
| 329 | log.L.Infof("TaskExit event %+v", e) |
| 330 | // Use ID instead of ContainerID to rule out TaskExit event for exec. |
| 331 | cntr, err := ce.c.containerStore.Get(e.ID) |
| 332 | if err == nil { |
| 333 | if err := ce.c.handleContainerExit(ctx, e, cntr, cntr.SandboxID); err != nil { |
| 334 | return fmt.Errorf("failed to handle container TaskExit event: %w", err) |
| 335 | } |
| 336 | return nil |
| 337 | } else if !errdefs.IsNotFound(err) { |
| 338 | return fmt.Errorf("can't find container for TaskExit event: %w", err) |
| 339 | } |
| 340 | sb, err := ce.c.sandboxStore.Get(e.ID) |
| 341 | if err == nil { |
| 342 | if err := ce.c.handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime()); err != nil { |
| 343 | return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err) |
| 344 | } |
| 345 | return nil |
| 346 | } else if !errdefs.IsNotFound(err) { |
| 347 | return fmt.Errorf("can't find sandbox for TaskExit event: %w", err) |
| 348 | } |
| 349 | return nil |
| 350 | case *eventtypes.SandboxExit: |
| 351 | log.L.Infof("SandboxExit event %+v", e) |
| 352 | sb, err := ce.c.sandboxStore.Get(e.GetSandboxID()) |
| 353 | if err == nil { |
| 354 | if err := ce.c.handleSandboxExit(ctx, sb, e.ExitStatus, e.ExitedAt.AsTime()); err != nil { |
| 355 | return fmt.Errorf("failed to handle sandbox TaskExit event: %w", err) |
| 356 | } |
| 357 | return nil |
| 358 | } else if !errdefs.IsNotFound(err) { |
| 359 | return fmt.Errorf("can't find sandbox for TaskExit event: %w", err) |
| 360 | } |
| 361 | return nil |
| 362 | case *eventtypes.TaskOOM: |
| 363 | log.L.Infof("TaskOOM event %+v", e) |
| 364 | // For TaskOOM, we only care which container it belongs to. |
| 365 | cntr, err := ce.c.containerStore.Get(e.ContainerID) |
| 366 | if err != nil { |
| 367 | if !errdefs.IsNotFound(err) { |
| 368 | return fmt.Errorf("can't find container for TaskOOM event: %w", err) |
| 369 | } |
| 370 | return nil |
| 371 | } |
| 372 | |
| 373 | if cntr.Status.Get().Reason == oomExitReason { |
| 374 | return nil |
| 375 | } |
| 376 | |
| 377 | err = cntr.Status.UpdateSync(func(status containerstore.Status) (containerstore.Status, error) { |
| 378 | status.Reason = oomExitReason |
| 379 | return status, nil |
nothing calls this directly
no test coverage detected