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>
This commit is contained in:
backport-actions-token[bot] 2023-12-29 10:24:21 -07:00 committed by GitHub
parent 33b4662187
commit 15ebb4dba2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 311 additions and 48 deletions

38
pkg/grpcutil/serve.go Normal file
View file

@ -0,0 +1,38 @@
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)
}