@@ -19,6 +19,7 @@ package server
1919import (
2020 "fmt"
2121 "io"
22+ "net/http"
2223 "path/filepath"
2324 "time"
2425
@@ -179,10 +180,7 @@ func (c *criService) Run() error {
179180
180181 // Start event handler.
181182 logrus .Info ("Start event monitor" )
182- eventMonitorCloseCh , err := c .eventMonitor .start ()
183- if err != nil {
184- return errors .Wrap (err , "failed to start event monitor" )
185- }
183+ eventMonitorErrCh := c .eventMonitor .start ()
186184
187185 // Start snapshot stats syncer, it doesn't need to be stopped.
188186 logrus .Info ("Start snapshots syncer" )
@@ -195,27 +193,32 @@ func (c *criService) Run() error {
195193
196194 // Start streaming server.
197195 logrus .Info ("Start streaming server" )
198- streamServerCloseCh := make (chan struct {} )
196+ streamServerErrCh := make (chan error )
199197 go func () {
200- if err := c .streamServer .Start (true ); err != nil {
198+ defer close (streamServerErrCh )
199+ if err := c .streamServer .Start (true ); err != nil && err != http .ErrServerClosed {
201200 logrus .WithError (err ).Error ("Failed to start streaming server" )
201+ streamServerErrCh <- err
202202 }
203- close (streamServerCloseCh )
204203 }()
205204
206205 // Set the server as initialized. GRPC services could start serving traffic.
207206 c .initialized .Set ()
208207
208+ var eventMonitorErr , streamServerErr error
209209 // Stop the whole CRI service if any of the critical service exits.
210210 select {
211- case <- eventMonitorCloseCh :
212- case <- streamServerCloseCh :
211+ case eventMonitorErr = <- eventMonitorErrCh :
212+ case streamServerErr = <- streamServerErrCh :
213213 }
214214 if err := c .Close (); err != nil {
215215 return errors .Wrap (err , "failed to stop cri service" )
216216 }
217-
218- <- eventMonitorCloseCh
217+ // If the error is set above, err from channel must be nil here, because
218+ // the channel is supposed to be closed. Or else, we wait and set it.
219+ if err := <- eventMonitorErrCh ; err != nil {
220+ eventMonitorErr = err
221+ }
219222 logrus .Info ("Event monitor stopped" )
220223 // There is a race condition with http.Server.Serve.
221224 // When `Close` is called at the same time with `Serve`, `Close`
@@ -227,18 +230,27 @@ func (c *criService) Run() error {
227230 // is fixed.
228231 const streamServerStopTimeout = 2 * time .Second
229232 select {
230- case <- streamServerCloseCh :
233+ case err := <- streamServerErrCh :
234+ if err != nil {
235+ streamServerErr = err
236+ }
231237 logrus .Info ("Stream server stopped" )
232238 case <- time .After (streamServerStopTimeout ):
233239 logrus .Errorf ("Stream server is not stopped in %q" , streamServerStopTimeout )
234240 }
241+ if eventMonitorErr != nil {
242+ return errors .Wrap (eventMonitorErr , "event monitor error" )
243+ }
244+ if streamServerErr != nil {
245+ return errors .Wrap (streamServerErr , "stream server error" )
246+ }
235247 return nil
236248}
237249
238- // Stop stops the CRI service.
250+ // Close stops the CRI service.
251+ // TODO(random-liu): Make close synchronous.
239252func (c * criService ) Close () error {
240253 logrus .Info ("Stop CRI service" )
241- // TODO(random-liu): Make event monitor stop synchronous.
242254 c .eventMonitor .stop ()
243255 if err := c .streamServer .Stop (); err != nil {
244256 return errors .Wrap (err , "failed to stop stream server" )
0 commit comments