@@ -158,10 +158,10 @@ func (c *Controller) Wait(ctx context.Context, sandboxID string) (sandbox.ExitSt
158158
159159}
160160
161- func (c * Controller ) waitSandboxExit (ctx context.Context , p * types.PodSandbox , exitCh <- chan containerd.ExitStatus ) ( exitStatus uint32 , exitedAt time. Time , err error ) {
161+ func (c * Controller ) waitSandboxExit (ctx context.Context , p * types.PodSandbox , exitCh <- chan containerd.ExitStatus ) error {
162162 select {
163163 case e := <- exitCh :
164- exitStatus , exitedAt , err = e .Result ()
164+ exitStatus , exitedAt , err : = e .Result ()
165165 if err != nil {
166166 log .G (ctx ).WithError (err ).Errorf ("failed to get task exit status for %q" , p .ID )
167167 exitStatus = unknownExitCode
@@ -171,12 +171,16 @@ func (c *Controller) waitSandboxExit(ctx context.Context, p *types.PodSandbox, e
171171 dctx , dcancel := context .WithTimeout (dctx , handleEventTimeout )
172172 defer dcancel ()
173173 event := & eventtypes.TaskExit {ExitStatus : exitStatus , ExitedAt : protobuf .ToTimestamp (exitedAt )}
174- if cleanErr := handleSandboxTaskExit (dctx , p , event ); cleanErr != nil {
174+ if err := handleSandboxTaskExit (dctx , p , event ); err != nil {
175+ // TODO will backoff the event to the controller's own EventMonitor, but not cri's,
176+ // because we should call handleSandboxTaskExit again the next time
177+ // eventMonitor handle this event. but now it goes into cri's EventMonitor,
178+ // the handleSandboxTaskExit will not be called anymore
175179 c .cri .BackOffEvent (p .ID , e )
176180 }
177- return
181+ return nil
178182 case <- ctx .Done ():
179- return unknownExitCode , time . Now (), ctx .Err ()
183+ return ctx .Err ()
180184 }
181185}
182186
@@ -196,5 +200,8 @@ func handleSandboxTaskExit(ctx context.Context, sb *types.PodSandbox, e *eventty
196200 }
197201 }
198202 }
203+ if err := sb .Exit (e .ExitStatus , protobuf .FromTimestamp (e .ExitedAt )); err != nil {
204+ return err
205+ }
199206 return nil
200207}
0 commit comments