feat: server 新增 DeadlockDetectEvent,以便于发生疑似死锁时刻能够执行通知等行为
This commit is contained in:
parent
ad60e797f4
commit
b4ade2c003
|
@ -31,6 +31,7 @@ type ShuntChannelClosedEventHandler func(srv *Server, guid int64)
|
||||||
type ConnectionPacketPreprocessEventHandler func(srv *Server, conn *Conn, packet []byte, abort func(), usePacket func(newPacket []byte))
|
type ConnectionPacketPreprocessEventHandler func(srv *Server, conn *Conn, packet []byte, abort func(), usePacket func(newPacket []byte))
|
||||||
type MessageExecBeforeEventHandler func(srv *Server, message *Message) bool
|
type MessageExecBeforeEventHandler func(srv *Server, message *Message) bool
|
||||||
type MessageReadyEventHandler func(srv *Server)
|
type MessageReadyEventHandler func(srv *Server)
|
||||||
|
type OnDeadlockDetectEventHandler func(srv *Server, message *Message)
|
||||||
|
|
||||||
func newEvent(srv *Server) *event {
|
func newEvent(srv *Server) *event {
|
||||||
return &event{
|
return &event{
|
||||||
|
@ -50,6 +51,7 @@ func newEvent(srv *Server) *event {
|
||||||
connectionPacketPreprocessEventHandlers: slice.NewPriority[ConnectionPacketPreprocessEventHandler](),
|
connectionPacketPreprocessEventHandlers: slice.NewPriority[ConnectionPacketPreprocessEventHandler](),
|
||||||
messageExecBeforeEventHandlers: slice.NewPriority[MessageExecBeforeEventHandler](),
|
messageExecBeforeEventHandlers: slice.NewPriority[MessageExecBeforeEventHandler](),
|
||||||
messageReadyEventHandlers: slice.NewPriority[MessageReadyEventHandler](),
|
messageReadyEventHandlers: slice.NewPriority[MessageReadyEventHandler](),
|
||||||
|
dedeadlockDetectEventHandlers: slice.NewPriority[OnDeadlockDetectEventHandler](),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,6 +72,7 @@ type event struct {
|
||||||
connectionPacketPreprocessEventHandlers *slice.Priority[ConnectionPacketPreprocessEventHandler]
|
connectionPacketPreprocessEventHandlers *slice.Priority[ConnectionPacketPreprocessEventHandler]
|
||||||
messageExecBeforeEventHandlers *slice.Priority[MessageExecBeforeEventHandler]
|
messageExecBeforeEventHandlers *slice.Priority[MessageExecBeforeEventHandler]
|
||||||
messageReadyEventHandlers *slice.Priority[MessageReadyEventHandler]
|
messageReadyEventHandlers *slice.Priority[MessageReadyEventHandler]
|
||||||
|
dedeadlockDetectEventHandlers *slice.Priority[OnDeadlockDetectEventHandler]
|
||||||
|
|
||||||
consoleCommandEventHandlers map[string]*slice.Priority[ConsoleCommandEventHandler]
|
consoleCommandEventHandlers map[string]*slice.Priority[ConsoleCommandEventHandler]
|
||||||
consoleCommandEventHandlerInitOnce sync.Once
|
consoleCommandEventHandlerInitOnce sync.Once
|
||||||
|
@ -435,6 +438,27 @@ func (slf *event) OnMessageReadyEvent() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RegDeadlockDetectEvent 在死锁检测触发时立即执行被注册的事件处理函数
|
||||||
|
func (slf *event) RegDeadlockDetectEvent(handler OnDeadlockDetectEventHandler, priority ...int) {
|
||||||
|
slf.dedeadlockDetectEventHandlers.Append(handler, slice.GetValue(priority, 0))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (slf *event) OnDeadlockDetectEvent(message *Message) {
|
||||||
|
if slf.dedeadlockDetectEventHandlers.Len() == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
log.Error("Server", log.String("OnDeadlockDetectEvent", fmt.Sprintf("%v", err)))
|
||||||
|
debug.PrintStack()
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
slf.dedeadlockDetectEventHandlers.RangeValue(func(index int, value OnDeadlockDetectEventHandler) bool {
|
||||||
|
value(slf.Server, message)
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (slf *event) check() {
|
func (slf *event) check() {
|
||||||
switch slf.network {
|
switch slf.network {
|
||||||
case NetworkHttp, NetworkGRPC, NetworkNone:
|
case NetworkHttp, NetworkGRPC, NetworkNone:
|
||||||
|
|
|
@ -695,6 +695,7 @@ func (slf *Server) dispatchMessage(dispatcher *dispatcher, msg *Message) {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
if err := ctx.Err(); err == context.DeadlineExceeded {
|
if err := ctx.Err(); err == context.DeadlineExceeded {
|
||||||
log.Warn("Server", log.String("MessageType", messageNames[msg.t]), log.String("Info", msg.String()), log.Any("SuspectedDeadlock", msg))
|
log.Warn("Server", log.String("MessageType", messageNames[msg.t]), log.String("Info", msg.String()), log.Any("SuspectedDeadlock", msg))
|
||||||
|
slf.OnDeadlockDetectEvent(msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}(ctx, msg)
|
}(ctx, msg)
|
||||||
|
|
Loading…
Reference in New Issue