MCPcopy
hub / github.com/containerd/containerd / startContainerExitMonitor

Method startContainerExitMonitor

internal/cri/server/events.go:122–170  ·  view source on GitHub ↗

startContainerExitMonitor starts an exit monitor for a given container.

(ctx context.Context, id string, pid uint32, exitCh <-chan containerd.ExitStatus)

Source from the content-addressed store, hash-verified

120
121// startContainerExitMonitor starts an exit monitor for a given container.
122func (c *criService) startContainerExitMonitor(ctx context.Context, id string, pid uint32, exitCh <-chan containerd.ExitStatus) <-chan struct{} {
123 stopCh := make(chan struct{})
124 go func() {
125 defer close(stopCh)
126 select {
127 case exitRes := <-exitCh:
128 exitStatus, exitedAt, err := exitRes.Result()
129 if err != nil {
130 log.L.WithError(err).Errorf("failed to get task exit status for %q", id)
131 exitStatus = unknownExitCode
132 exitedAt = time.Now()
133 }
134
135 e := &eventtypes.TaskExit{
136 ContainerID: id,
137 ID: id,
138 Pid: pid,
139 ExitStatus: exitStatus,
140 ExitedAt: protobuf.ToTimestamp(exitedAt),
141 }
142
143 log.L.Infof("received container exit event %+v", e)
144
145 err = func() error {
146 dctx := ctrdutil.NamespacedContext()
147 dctx, dcancel := context.WithTimeout(dctx, handleEventTimeout)
148 defer dcancel()
149
150 cntr, err := c.containerStore.Get(e.ID)
151 if err == nil {
152 if err := c.handleContainerExit(dctx, e, cntr, cntr.SandboxID); err != nil {
153 return err
154 }
155 return nil
156 } else if !errdefs.IsNotFound(err) {
157 return fmt.Errorf("failed to get container %s: %w", e.ID, err)
158 }
159 return nil
160 }()
161 if err != nil {
162 log.L.WithError(err).Errorf("failed to handle container TaskExit event %+v", e)
163 c.eventMonitor.Backoff(id, e)
164 }
165 return
166 case <-ctx.Done():
167 }
168 }()
169 return stopCh
170}
171
172// handleContainerExit handles TaskExit event for container.
173func (c *criService) handleContainerExit(ctx context.Context, e *eventtypes.TaskExit, cntr containerstore.Container, sandboxID string) error {

Callers 3

recoverMethod · 0.95
stopContainerMethod · 0.95
StartContainerMethod · 0.95

Implementers 1

criServiceinternal/cri/server/service.go

Calls 6

handleContainerExitMethod · 0.95
ToTimestampFunction · 0.92
ResultMethod · 0.80
BackoffMethod · 0.80
GetMethod · 0.65
DoneMethod · 0.65

Tested by

no test coverage detected