@@ -14,6 +14,11 @@ import (
1414 "time"
1515)
1616
17+ type IService interface {
18+ BaseService
19+ Stop ()
20+ }
21+
1722type SupervisorConfigs struct {
1823 BaseConfigs
1924 Services []SupervisedService
@@ -164,13 +169,12 @@ func (s *Supervisor) Serve() error {
164169 if err != nil {
165170 s .Logger .Error ("Service failed to restart" , "error" , err )
166171 }
172+ continue
167173 case <- s .sigShutdown :
168- s .Stop (false ) // Graceful shutdown; errors are logged by Stop.
169- return
170174 case <- s .context .Done ():
171- s .Stop (true ) // Stop logs errors internally.
172- return
173175 }
176+ s .Stop ()
177+ return
174178 }
175179 }()
176180
@@ -188,7 +192,7 @@ func (s *Supervisor) Serve() error {
188192 "service" , svc .String (),
189193 "error" , err ,
190194 )
191- s .Stop (false )
195+ s .Stop ()
192196 case s .stopped .Load ():
193197 s .Logger .Info ("Service stopped" ,
194198 "service" , svc .String (),
@@ -209,19 +213,19 @@ func (s *Supervisor) Serve() error {
209213 }
210214 }
211215
212- go s .Stop (true )
216+ go s .Stop ()
213217 <- s .stoppedChan
214218
215219 return errors .Join (allErrs ... )
216220}
217221
218- func (s * Supervisor ) Stop (force bool ) error {
222+ func (s * Supervisor ) Stop () {
219223 // CAS achieves once-semantics: the second caller returns immediately
220224 // (fire-and-forget) rather than blocking like sync.Once. This is safe
221225 // because the orchestrator calls Cancel() after Stop() and waits for
222226 // the Serve goroutine to exit.
223227 if ! s .stopped .CompareAndSwap (false , true ) {
224- return nil // already stopped
228+ return // already stopped
225229 }
226230
227231 if s .sigShutdown != nil {
@@ -231,29 +235,19 @@ func (s *Supervisor) Stop(force bool) error {
231235 signal .Stop (s .sigHangUp )
232236 }
233237
234- var err error
235238 for i := len (s .services ) - 1 ; i >= 0 ; i -- {
236239 svc := s .services [i ]
237240 start := time .Now ()
238- svcErr := svc .Stop (force )
241+ err := svc .Stop ()
239242 elapsed := time .Since (start )
240243
241- if svcErr != nil {
242- s .Logger .Error ("Stop" ,
243- "force" , force ,
244- "duration" , elapsed ,
245- "error" , svcErr )
244+ if err != nil {
245+ s .Logger .Error ("Stop" , "duration" , elapsed , "error" , err )
246246 } else {
247- s .Logger .Info ("Stop" ,
248- "force" , force ,
249- "duration" , elapsed )
247+ s .Logger .Info ("Stop" , "duration" , elapsed )
250248 }
251-
252- err = errors .Join (err , svcErr )
253249 }
254250
255251 s .cancelContext ()
256252 close (s .stoppedChan )
257-
258- return err
259253}
0 commit comments