diff --git a/pool.go b/pool.go index 66aca67..6205e13 100644 --- a/pool.go +++ b/pool.go @@ -236,16 +236,15 @@ func (b *BaseClient) refreshConnectionPool() { // StopPoolMonitor gracefully stops the pool health monitor // Call this when shutting down the application +// Uses sync.Once to ensure it only executes once, preventing race conditions func (b *BaseClient) StopPoolMonitor() { if b.pool_warmup_enabled { - b.Logger.Info(&libpack_logger.LogMessage{ - Message: "Stopping pool monitor", - Pairs: nil, + b.pool_stop_once.Do(func() { + b.Logger.Info(&libpack_logger.LogMessage{ + Message: "Stopping pool monitor", + Pairs: nil, + }) + b.pool_stop <- true }) - select { - case b.pool_stop <- true: - default: - // Channel already has a value or monitor already stopped - } } } diff --git a/structs.go b/structs.go index 6bec523..5ba4efd 100644 --- a/structs.go +++ b/structs.go @@ -2,6 +2,7 @@ package gql import ( "net/http" + "sync" "time" cache "github.com/lukaszraczylo/go-simple-graphql/cache" @@ -22,6 +23,7 @@ type BaseClient struct { pool_warmup_query string // Query to use for warming up connections pool_health_interval time.Duration // Interval for pool health checks pool_stop chan bool // Channel to stop pool monitor + pool_stop_once sync.Once // Ensures StopPoolMonitor is called only once MaxGoRoutines int cache_global bool retries_enable bool