alternative heartbeat implementation

This commit is contained in:
NotAShelf 2023-06-03 23:14:31 +03:00
parent 18babf7f6c
commit 6f231ad51a
No known key found for this signature in database
GPG key ID: F0D14CCB5ED5AA22
3 changed files with 51 additions and 4 deletions

1
go.mod
View file

@ -5,4 +5,5 @@ go 1.20
require ( require (
github.com/sirupsen/logrus v1.9.2 // indirect github.com/sirupsen/logrus v1.9.2 // indirect
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
golang.org/x/time v0.3.0 // indirect
) )

2
go.sum
View file

@ -7,5 +7,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

50
main.go
View file

@ -1,6 +1,7 @@
package main package main
import ( import (
"context"
"encoding/json" "encoding/json"
"flag" "flag"
"fmt" "fmt"
@ -8,7 +9,9 @@ import (
"log" "log"
"net/http" "net/http"
"os" "os"
"os/signal"
"path/filepath" "path/filepath"
"syscall"
"time" "time"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
@ -181,14 +184,27 @@ func main() {
go func() { go func() {
for range time.Tick(time.Duration(config.Heartbeat)) { for range time.Tick(time.Duration(config.Heartbeat)) {
logger.Info("Server heartbeat") logger.Info("Server heartbeat")
os.Exit(0) server := startServer(&config, logger)
stopServer(server, logger)
} }
}() }()
} }
// Start the initial server
server := startServer(&config, logger)
// Wait for termination signal
waitForTerminationSignal()
// Stop the server before exiting
stopServer(server, logger)
}
// startServer creates and starts the HTTP server
func startServer(config *Config, logger *logrus.Logger) *http.Server {
// Create a new CDNHandler with the configuration // Create a new CDNHandler with the configuration
cdnHandler := &CDNHandler{ cdnHandler := &CDNHandler{
Config: config, Config: *config,
Logger: logger, Logger: logger,
} }
@ -201,6 +217,34 @@ func main() {
WriteTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second,
} }
// Start the server in a separate goroutine
go func() {
logger.Infof("Starting CDN server on port %s", config.Port) logger.Infof("Starting CDN server on port %s", config.Port)
log.Fatal(server.ListenAndServe()) if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
logger.Fatalf("Server error: %v", err)
}
}()
return server
}
// stopServer stops the HTTP server
func stopServer(server *http.Server, logger *logrus.Logger) {
logger.Info("Stopping CDN server")
// Set a deadline for gracefully shutting down the server
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
// Shut down the server with the given context
if err := server.Shutdown(ctx); err != nil {
logger.Errorf("Server shutdown error: %v", err)
}
}
// waitForTerminationSignal waits for termination signals to gracefully shut down the server
func waitForTerminationSignal() {
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt, syscall.SIGTERM)
<-quit
} }