@@ -288,34 +288,46 @@ type Manager struct {
288288 logger * zap.Logger
289289}
290290
291- // Start starts all configured services.
292- func (m * Manager ) Start (ctx context.Context ) error {
291+ // Run starts all services. If any service fails to start, it stops all running services
292+ // and returns false. On success, it blocks until the context is canceled, and then stops
293+ // all services. It returns true if no errors were encountered.
294+ func (m * Manager ) Run (ctx context.Context ) bool {
295+ ctx , cancel := context .WithCancel (ctx )
296+ defer cancel ()
297+
293298 m .notifyReload .start ()
299+
300+ ok := true
301+ runningSvcs := make ([]shadowsocks.Service , 0 , len (m .services ))
302+
294303 for _ , s := range m .services {
295304 if err := s .Start (ctx ); err != nil {
296- kv := s .ZapField ()
297- return fmt .Errorf ("failed to start %s=%q: %w" , kv .Key , kv .String , err )
305+ m .logger .Error ("Failed to start service" , s .ZapField (), zap .Error (err ))
306+ ok = false
307+ break
298308 }
309+ runningSvcs = append (runningSvcs , s )
299310 }
300- return nil
301- }
302311
303- // Stop stops all running services.
304- func (m * Manager ) Stop () {
305- for _ , s := range m .services {
306- kv := s .ZapField ()
312+ if ok {
313+ <- ctx .Done ()
314+ } else {
315+ cancel ()
316+ }
317+
318+ for _ , s := range runningSvcs {
307319 if err := s .Stop (); err != nil {
308- m .logger .Warn ("Failed to stop service" , kv , zap .Error (err ))
309- continue
320+ m .logger .Error ("Failed to stop service" , s .ZapField (), zap .Error (err ))
310321 }
311- m .logger .Info ("Stopped service" , kv )
312322 }
323+
313324 m .notifyReload .stop ()
325+ return ok
314326}
315327
316328// Close closes the manager.
317329func (m * Manager ) Close () {
318330 if err := m .router .Close (); err != nil {
319- m .logger .Warn ("Failed to close router" , zap .Error (err ))
331+ m .logger .Error ("Failed to close router" , zap .Error (err ))
320332 }
321333}
0 commit comments