diff --git a/pkg/server/events.go b/pkg/server/events.go index 665fb2021..1ff70c788 100644 --- a/pkg/server/events.go +++ b/pkg/server/events.go @@ -120,6 +120,13 @@ func (c *criContainerdService) handleEvent(e *task.Event) { return } case task.Event_OOM: - // TODO(random-liu): [P1] Handle OOM event. + err := c.containerStore.Update(e.ID, func(meta metadata.ContainerMetadata) (metadata.ContainerMetadata, error) { + meta.Reason = oomExitReason + return meta, nil + }) + if err != nil && !metadata.IsNotExistError(err) { + glog.Errorf("Failed to update container %q oom: %v", e.ID, err) + return + } } } diff --git a/pkg/server/events_test.go b/pkg/server/events_test.go index b56ed1b0e..b3ed3a83a 100644 --- a/pkg/server/events_test.go +++ b/pkg/server/events_test.go @@ -100,13 +100,11 @@ func TestHandleEvent(t *testing.T) { containerdErr: fmt.Errorf("random error"), expected: &testMetadata, }, - "should not update state for non-exited events": { + "should not update state for irrelevant events": { event: &task.Event{ - ID: testID, - Type: task.Event_OOM, - Pid: testPid, - ExitStatus: 1, - ExitedAt: testExitedAt, + ID: testID, + Type: task.Event_PAUSED, + Pid: testPid, }, metadata: &testMetadata, containerdContainer: &testContainerdContainer, @@ -123,6 +121,22 @@ func TestHandleEvent(t *testing.T) { containerdContainer: &testContainerdContainer, expected: &testFinishedMetadata, }, + "should update exit reason when container is oom killed": { + event: &task.Event{ + ID: testID, + Type: task.Event_OOM, + }, + metadata: &testMetadata, + expected: &metadata.ContainerMetadata{ + ID: testID, + Name: "test-name", + SandboxID: "test-sandbox-id", + Pid: testPid, + CreatedAt: testCreatedAt, + StartedAt: testStartedAt, + Reason: oomExitReason, + }, + }, } { t.Logf("TestCase %q", desc) c := newTestCRIContainerdService() diff --git a/pkg/server/helpers.go b/pkg/server/helpers.go index dca23130d..546bc638b 100644 --- a/pkg/server/helpers.go +++ b/pkg/server/helpers.go @@ -50,6 +50,8 @@ const ( completeExitReason = "Completed" // errorExitReason is the exit reason when container exits with code non-zero. errorExitReason = "Error" + // oomExitReason is the exit reason when process in container is oom killed. + oomExitReason = "OOMKilled" // unknownExitCode is the exit code when exit reason is unknown. unknownExitCode = 255 )