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  }