From b81f972fdadb5fb1e5d13667f558ef4c58788036 Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Thu, 22 Feb 2024 10:31:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20server=20=E5=8C=85?= =?UTF-8?q?=E6=AD=BB=E9=94=81=E6=A3=80=E6=B5=8B=E4=B8=AD=20Message=20?= =?UTF-8?q?=E8=AF=BB=E5=86=99=E7=9A=84=E7=AB=9E=E6=80=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/message.go | 6 ++++++ server/server.go | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/server/message.go b/server/message.go index 05efd04..e4c2028 100644 --- a/server/message.go +++ b/server/message.go @@ -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 diff --git a/server/server.go b/server/server.go index 2379348..ad6cc94 100644 --- a/server/server.go +++ b/server/server.go @@ -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)