Added support for profiling. Removed the pkg module altogether. Everything except old sync is now using code generated by sqlc.
81 lines
1.9 KiB
Go
81 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"music-server/internal/db"
|
|
"music-server/internal/server"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"runtime/pprof"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
// @title Swagger Example API
|
|
// @version 0.5
|
|
// @description This is a sample server Petstore server.
|
|
// @termsOfService http://swagger.io/terms/
|
|
|
|
// @contact.name Sebastian Olsson
|
|
// @contact.email zarnor91@gmail.com
|
|
|
|
// @license.name Apache 2.0
|
|
// @license.url http://www.apache.org/licenses/LICENSE-2.0.html
|
|
|
|
// @host localhost:8080
|
|
|
|
func main() {
|
|
f, perr := os.Create("cpu.pprof")
|
|
if perr != nil {
|
|
log.Fatal(perr)
|
|
}
|
|
pprof.StartCPUProfile(f)
|
|
defer pprof.StopCPUProfile()
|
|
|
|
server := server.NewServer()
|
|
|
|
// Create a done channel to signal when the shutdown is complete
|
|
done := make(chan bool, 1)
|
|
|
|
// Run graceful shutdown in a separate goroutine
|
|
go gracefulShutdown(server, done)
|
|
|
|
log.Printf("Open http://localhost%s in the browser", server.Addr)
|
|
err := server.ListenAndServe()
|
|
if err != nil && err != http.ErrServerClosed {
|
|
panic(fmt.Sprintf("http server error: %s", err))
|
|
}
|
|
|
|
// Wait for the graceful shutdown to complete
|
|
<-done
|
|
log.Println("Graceful shutdown complete.")
|
|
}
|
|
|
|
func gracefulShutdown(apiServer *http.Server, done chan bool) {
|
|
// Create context that listens for the interrupt signal from the OS.
|
|
ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
|
|
defer stop()
|
|
|
|
// Listen for the interrupt signal.
|
|
<-ctx.Done()
|
|
|
|
log.Println("shutting down gracefully, press Ctrl+C again to force")
|
|
db.CloseDb()
|
|
|
|
// The context is used to inform the server it has 5 seconds to finish
|
|
// the request it is currently handling
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
if err := apiServer.Shutdown(ctx); err != nil {
|
|
log.Printf("Server forced to shutdown with error: %v", err)
|
|
}
|
|
|
|
log.Println("Server exiting")
|
|
|
|
// Notify the main goroutine that the shutdown is complete
|
|
done <- true
|
|
}
|