fix(lua): wait for SchedulerLoop exit before closing LState; lock cleanupResources

This commit is contained in:
xfy 2026-06-05 13:48:04 +08:00
parent 4789265ca8
commit 93c0c151d0
2 changed files with 26 additions and 1 deletions

View File

@ -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

View File

@ -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 {