diff --git a/cmd/demo/main.go b/cmd/demo/main.go index bccbe75..5ba4a91 100644 --- a/cmd/demo/main.go +++ b/cmd/demo/main.go @@ -566,7 +566,7 @@ func main() { go func() { sigch := make(chan os.Signal, 1) signal.Notify(sigch, syscall.SIGINT, syscall.SIGTERM) - log.Printf("signal: %v", <-sigch) + <-sigch cancel() }() diff --git a/hedge.go b/hedge.go index 0b8457f..75bddf8 100644 --- a/hedge.go +++ b/hedge.go @@ -291,17 +291,25 @@ func (op *Op) Run(ctx context.Context, done ...chan error) error { return err } + var exitedTCP atomic.Int32 + doneTCP := make(chan error, 1) + + // This connection will be closed upon context termination. tl, err := net.ListenTCP("tcp", addr) if err != nil { return err } - defer tl.Close() op.logger.Printf("tcp: listen on %v", op.hostPort) go func() { + defer func() { doneTCP <- nil }() for { conn, err := tl.Accept() + if exitedTCP.Load() == 1 { + return + } + if err != nil { op.logger.Printf("Accept failed: %v", err) return @@ -499,6 +507,9 @@ func (op *Op) Run(ctx context.Context, done ...chan error) error { <-ctx.Done() // wait for termination + exitedTCP.Store(1) // don't print err in tl.Accept + tl.Close() // will cause tl.Accept to fail + gs.GracefulStop() // stop grpc server if op.ensureOn.Load() == 1 { op.ensureCancel() // stop semaphore checker;