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