package components import ( "context" "os" "time" "github.com/cockroachdb/errors" "github.com/milvus-io/milvus/pkg/util/conc" ) var errStopTimeout = errors.New("stop timeout") // exitWhenStopTimeout stops a component with timeout and exit progress when timeout. func exitWhenStopTimeout(stop func() error, timeout time.Duration) error { err := stopWithTimeout(stop, timeout) if errors.Is(err, errStopTimeout) { os.Exit(1) } return err } // stopWithTimeout stops a component with timeout. func stopWithTimeout(stop func() error, timeout time.Duration) error { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() future := conc.Go(func() (struct{}, error) { return struct{}{}, stop() }) select { case <-future.Inner(): return errors.Wrap(future.Err(), "failed to stop component") case <-ctx.Done(): return errStopTimeout } }