fix: 修复 server 包死锁检测中 Message 读写的竞态问题
This commit is contained in:
parent
6846c9dfc7
commit
b81f972fda
|
@ -5,6 +5,7 @@ import (
|
|||
"github.com/kercylan98/minotaur/utils/collection"
|
||||
"github.com/kercylan98/minotaur/utils/log"
|
||||
"github.com/kercylan98/minotaur/utils/super"
|
||||
"sync"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -87,6 +88,7 @@ type Message struct {
|
|||
producer string
|
||||
name string
|
||||
t MessageType
|
||||
l *sync.RWMutex
|
||||
}
|
||||
|
||||
// bindDispatcher 绑定分发器
|
||||
|
@ -101,6 +103,10 @@ func (slf *Message) GetProducer() string {
|
|||
|
||||
// reset 重置消息结构体
|
||||
func (slf *Message) reset() {
|
||||
if slf.l != nil {
|
||||
slf.l.Lock()
|
||||
defer slf.l.Unlock()
|
||||
}
|
||||
slf.conn = nil
|
||||
slf.ordinaryHandler = nil
|
||||
slf.exceptionHandler = nil
|
||||
|
|
|
@ -22,6 +22,7 @@ import (
|
|||
"os"
|
||||
"os/signal"
|
||||
"runtime/debug"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"syscall"
|
||||
"time"
|
||||
|
@ -437,13 +438,16 @@ func (srv *Server) dispatchMessage(dispatcherIns *dispatcher.Dispatcher[string,
|
|||
cancel context.CancelFunc
|
||||
)
|
||||
if srv.deadlockDetect > 0 {
|
||||
msg.l = new(sync.RWMutex)
|
||||
ctx, cancel = context.WithTimeout(context.Background(), srv.deadlockDetect)
|
||||
go func(ctx context.Context, srv *Server, msg *Message) {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
|
||||
log.Warn("Server", log.String("MessageType", messageNames[msg.t]), log.String("Info", msg.String()), log.Any("SuspectedDeadlock", msg))
|
||||
msg.l.RLock()
|
||||
log.Warn("Server", log.String("SuspectedDeadlock", msg.String()))
|
||||
srv.OnDeadlockDetectEvent(msg)
|
||||
msg.l.RUnlock()
|
||||
}
|
||||
}
|
||||
}(ctx, srv, msg)
|
||||
|
|
Loading…
Reference in New Issue