diff --git a/internal/lua/engine.go b/internal/lua/engine.go index cdf5f2a..a0889f4 100644 --- a/internal/lua/engine.go +++ b/internal/lua/engine.go @@ -89,7 +89,8 @@ type LuaEngine struct { // 引擎统计 stats EngineStats - schedulerMu sync.RWMutex + schedulerMu sync.RWMutex + schedulerDone chan struct{} } // EngineStats 引擎统计信息。 @@ -439,9 +440,12 @@ func (e *LuaEngine) InitSchedulerLState() error { q := make(chan *CallbackEntry, 1024) + done := make(chan struct{}) + e.schedulerMu.Lock() e.schedulerLState = L e.callbackQueue = q + e.schedulerDone = done e.schedulerMu.Unlock() go e.SchedulerLoop() @@ -457,6 +461,15 @@ func (e *LuaEngine) InitSchedulerLState() error { // // 注意:该方法由 InitSchedulerLState 自动启动,不应手动调用。 func (e *LuaEngine) SchedulerLoop() { + defer func() { + e.schedulerMu.RLock() + d := e.schedulerDone + e.schedulerMu.RUnlock() + if d != nil { + close(d) + } + }() + for { e.schedulerMu.RLock() q := e.callbackQueue @@ -557,6 +570,14 @@ func (e *LuaEngine) CloseScheduler() { close(e.callbackQueue) e.callbackQueue = nil } + done := e.schedulerDone + e.schedulerMu.Unlock() + + if done != nil { + <-done + } + + e.schedulerMu.Lock() if e.schedulerLState != nil { e.schedulerLState.Close() e.schedulerLState = nil diff --git a/internal/server/lifecycle.go b/internal/server/lifecycle.go index 8daab4b..18f9601 100644 --- a/internal/server/lifecycle.go +++ b/internal/server/lifecycle.go @@ -27,9 +27,11 @@ func (s *Server) cleanupResources() { } // 停止健康检查器 + s.proxiesMu.Lock() for _, hc := range s.healthCheckers { hc.Stop() } + s.proxiesMu.Unlock() // 关闭访问日志 if s.accessLogMiddleware != nil { @@ -42,11 +44,13 @@ func (s *Server) cleanupResources() { } // 关闭 AccessControl (释放 GeoIP 资源) + s.accessControlsMu.Lock() for _, ac := range s.accessControls { if err := ac.Close(); err != nil { logging.Warn().Err(err).Msg("Failed to close AccessControl") } } + s.accessControlsMu.Unlock() // 关闭 Lua 引擎 if s.luaEngine != nil {