github.com/0chain/gosdk@v1.17.11/zmagmacore/shutdown/shutdown.go (about) 1 // DEPRECATED: This package is deprecated and will be removed in a future release. 2 package shutdown 3 4 import ( 5 "context" 6 "net/http" 7 "os" 8 "os/signal" 9 "syscall" 10 "time" 11 12 "go.uber.org/zap" 13 "google.golang.org/grpc" 14 15 "github.com/0chain/gosdk/zmagmacore/log" 16 ) 17 18 type ( 19 // Closable represents interface for types that might be closed. 20 Closable interface { 21 Close() error 22 } 23 ) 24 25 // Handle handles various shutdown signals. 26 func Handle(ctx context.Context, server *http.Server, grpcServer *grpc.Server, closable ...Closable) { 27 c := make(chan os.Signal, 1) 28 signal.Notify(c, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) 29 30 // wait for signals or app context done 31 select { 32 case <-ctx.Done(): 33 case <-c: 34 } 35 shutdown(server, grpcServer, closable...) 36 } 37 38 func shutdown(server *http.Server, grpcServer *grpc.Server, closable ...Closable) { 39 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) 40 defer cancel() 41 if err := server.Shutdown(ctx); err != nil { 42 log.Logger.Warn("Server failed to gracefully shuts down", zap.Error(err)) 43 } 44 log.Logger.Debug("Server is shut down.") 45 46 grpcServer.GracefulStop() 47 log.Logger.Debug("GRPC server is shut down.") 48 49 log.Logger.Debug("Closing rest ...") 50 for _, cl := range closable { 51 if err := cl.Close(); err != nil { 52 log.Logger.Warn("Can not close.", zap.String("err", err.Error())) 53 } 54 } 55 }