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/collection"
|
||||||
"github.com/kercylan98/minotaur/utils/log"
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
"github.com/kercylan98/minotaur/utils/super"
|
"github.com/kercylan98/minotaur/utils/super"
|
||||||
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -87,6 +88,7 @@ type Message struct {
|
||||||
producer string
|
producer string
|
||||||
name string
|
name string
|
||||||
t MessageType
|
t MessageType
|
||||||
|
l *sync.RWMutex
|
||||||
}
|
}
|
||||||
|
|
||||||
// bindDispatcher 绑定分发器
|
// bindDispatcher 绑定分发器
|
||||||
|
@ -101,6 +103,10 @@ func (slf *Message) GetProducer() string {
|
||||||
|
|
||||||
// reset 重置消息结构体
|
// reset 重置消息结构体
|
||||||
func (slf *Message) reset() {
|
func (slf *Message) reset() {
|
||||||
|
if slf.l != nil {
|
||||||
|
slf.l.Lock()
|
||||||
|
defer slf.l.Unlock()
|
||||||
|
}
|
||||||
slf.conn = nil
|
slf.conn = nil
|
||||||
slf.ordinaryHandler = nil
|
slf.ordinaryHandler = nil
|
||||||
slf.exceptionHandler = nil
|
slf.exceptionHandler = nil
|
||||||
|
|
|
@ -22,6 +22,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
@ -437,13 +438,16 @@ func (srv *Server) dispatchMessage(dispatcherIns *dispatcher.Dispatcher[string,
|
||||||
cancel context.CancelFunc
|
cancel context.CancelFunc
|
||||||
)
|
)
|
||||||
if srv.deadlockDetect > 0 {
|
if srv.deadlockDetect > 0 {
|
||||||
|
msg.l = new(sync.RWMutex)
|
||||||
ctx, cancel = context.WithTimeout(context.Background(), srv.deadlockDetect)
|
ctx, cancel = context.WithTimeout(context.Background(), srv.deadlockDetect)
|
||||||
go func(ctx context.Context, srv *Server, msg *Message) {
|
go func(ctx context.Context, srv *Server, msg *Message) {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
if err := ctx.Err(); errors.Is(err, context.DeadlineExceeded) {
|
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)
|
srv.OnDeadlockDetectEvent(msg)
|
||||||
|
msg.l.RUnlock()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}(ctx, srv, msg)
|
}(ctx, srv, msg)
|
||||||
|
|
Loading…
Reference in New Issue