mirror of
https://gitee.com/milvus-io/milvus.git
synced 2024-12-12 13:15:09 +08:00
39 lines
884 B
Go
39 lines
884 B
Go
|
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
|
||
|
}
|
||
|
}
|