mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-04 21:17:37 +03:00
Use signal.NotifyContext
This commit is contained in:
parent
31fcab07d2
commit
3d9fff36f7
3 changed files with 36 additions and 79 deletions
37
cmd/root.go
37
cmd/root.go
|
@ -5,7 +5,9 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"os/signal"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-chi/chi/v5/middleware"
|
"github.com/go-chi/chi/v5/middleware"
|
||||||
|
@ -70,7 +72,15 @@ func runNavidrome() {
|
||||||
log.Info("Navidrome stopped, bye.")
|
log.Info("Navidrome stopped, bye.")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
g, ctx := errgroup.WithContext(context.Background())
|
ctx, cancel := signal.NotifyContext(context.Background(),
|
||||||
|
os.Interrupt,
|
||||||
|
syscall.SIGHUP,
|
||||||
|
syscall.SIGTERM,
|
||||||
|
syscall.SIGABRT,
|
||||||
|
)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
g, ctx := errgroup.WithContext(ctx)
|
||||||
g.Go(startServer(ctx))
|
g.Go(startServer(ctx))
|
||||||
g.Go(startSignaler(ctx))
|
g.Go(startSignaler(ctx))
|
||||||
g.Go(startScheduler(ctx))
|
g.Go(startScheduler(ctx))
|
||||||
|
@ -112,6 +122,31 @@ func startServer(ctx context.Context) func() error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func startSignaler(ctx context.Context) func() error {
|
||||||
|
log.Info("Starting signaler")
|
||||||
|
scanner := GetScanner()
|
||||||
|
|
||||||
|
return func() error {
|
||||||
|
var sigChan = make(chan os.Signal, 1)
|
||||||
|
signal.Notify(sigChan, syscall.SIGUSR1)
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case sig := <-sigChan:
|
||||||
|
log.Info("Received signal, triggering a new scan", "signal", sig)
|
||||||
|
start := time.Now()
|
||||||
|
err := scanner.RescanAll(ctx, false)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Error scanning", err)
|
||||||
|
}
|
||||||
|
log.Info("Triggered scan complete", "elapsed", time.Since(start).Round(100*time.Millisecond))
|
||||||
|
case <-ctx.Done():
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func schedulePeriodicScan(ctx context.Context) func() error {
|
func schedulePeriodicScan(ctx context.Context) func() error {
|
||||||
return func() error {
|
return func() error {
|
||||||
schedule := conf.Server.ScanSchedule
|
schedule := conf.Server.ScanSchedule
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
//go:build windows || plan9
|
|
||||||
|
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
|
|
||||||
"github.com/navidrome/navidrome/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func startSignaler(ctx context.Context) func() error {
|
|
||||||
log.Info(ctx, "Starting signaler")
|
|
||||||
|
|
||||||
return func() error {
|
|
||||||
var sigChan = make(chan os.Signal, 1)
|
|
||||||
signal.Notify(sigChan, os.Interrupt)
|
|
||||||
select {
|
|
||||||
case sig := <-sigChan:
|
|
||||||
log.Info(ctx, "Received termination signal", "signal", sig)
|
|
||||||
return interrupted
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,51 +0,0 @@
|
||||||
//go:build !windows && !plan9
|
|
||||||
|
|
||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"os/signal"
|
|
||||||
"syscall"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/navidrome/navidrome/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
const triggerScanSignal = syscall.SIGUSR1
|
|
||||||
|
|
||||||
func startSignaler(ctx context.Context) func() error {
|
|
||||||
log.Info(ctx, "Starting signaler")
|
|
||||||
scanner := GetScanner()
|
|
||||||
|
|
||||||
return func() error {
|
|
||||||
var sigChan = make(chan os.Signal, 1)
|
|
||||||
signal.Notify(
|
|
||||||
sigChan,
|
|
||||||
os.Interrupt,
|
|
||||||
triggerScanSignal,
|
|
||||||
syscall.SIGHUP,
|
|
||||||
syscall.SIGTERM,
|
|
||||||
syscall.SIGABRT,
|
|
||||||
)
|
|
||||||
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case sig := <-sigChan:
|
|
||||||
if sig != triggerScanSignal {
|
|
||||||
log.Info(ctx, "Received termination signal", "signal", sig)
|
|
||||||
return interrupted
|
|
||||||
}
|
|
||||||
log.Info(ctx, "Received signal, triggering a new scan", "signal", sig)
|
|
||||||
start := time.Now()
|
|
||||||
err := scanner.RescanAll(ctx, false)
|
|
||||||
if err != nil {
|
|
||||||
log.Error(ctx, "Error scanning", err)
|
|
||||||
}
|
|
||||||
log.Info(ctx, "Triggered scan complete", "elapsed", time.Since(start).Round(100*time.Millisecond))
|
|
||||||
case <-ctx.Done():
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Add table
Add a link
Reference in a new issue