fix(lua): wait for SchedulerLoop exit before closing LState; lock cleanupResources
This commit is contained in:
parent
4789265ca8
commit
93c0c151d0
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user