pomerium/pkg/grpcutil/serve.go
backport-actions-token[bot] 15ebb4dba2
core: fix graceful stop (#4866)
core: fix graceful stop (#4865)

* core/grpc: fix graceful stop

* core/http: add graceful stop serve

Co-authored-by: Caleb Doxsey <cdoxsey@pomerium.com>
2023-12-29 10:24:21 -07:00

38 lines
747 B
Go

package grpcutil
import (
"context"
"net"
"time"
"google.golang.org/grpc"
)
// ServeWithGracefulStop serves the gRPC listener until ctx.Done(), and then gracefully stops and waits for gracefulTimeout
// before definitively stopping.
func ServeWithGracefulStop(ctx context.Context, srv *grpc.Server, li net.Listener, gracefulTimeout time.Duration) error {
go func() {
// wait for the context to complete
<-ctx.Done()
sctx, stopped := context.WithCancel(context.Background())
go func() {
srv.GracefulStop()
stopped()
}()
wait := time.NewTimer(gracefulTimeout)
defer wait.Stop()
select {
case <-wait.C:
case <-sctx.Done():
return
}
// finally stop it completely
srv.Stop()
}()
return srv.Serve(li)
}