From 989345281744013bbb32d415797952614ddccae6 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Thu, 24 Sep 2026 10:03:27 +0800 Subject: [PATCH] fix: reserve seq for p2p system messages --- server/im_http.go | 8 +++++++- server/store/store.go | 26 +++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/server/im_http.go b/server/im_http.go index 2e3e0b1..b945cd0 100644 --- a/server/im_http.go +++ b/server/im_http.go @@ -10726,11 +10726,17 @@ func publishIMConversationSystemNotice(tenantID types.TenantID, topic, msgType, }, Content: content, } - _, err = store.Messages.Save(tenantID, msg, nil, false) + saved, err := saveMessageMaybeKafka(context.Background(), tenantID, msg, nil, false) if err != nil && !errors.Is(err, types.ErrDuplicate) { logs.Warn.Printf("im system message: failed to save %s for topic %s: %v", template, topic, err) return } + if saved != nil && saved.SeqId > 0 { + msg.SeqId = saved.SeqId + } + if saved != nil && saved.Duplicate { + return + } broadcastIMConversationSystemMessage(tenantID, msg, now) sendPushForStoredGroupMessage(tenantID, msg) } diff --git a/server/store/store.go b/server/store/store.go index f9c20e1..4d51448 100644 --- a/server/store/store.go +++ b/server/store/store.go @@ -3397,18 +3397,20 @@ func (messagesMapper) PreparePersist(tenantID types.TenantID, msg *types.Message msg.InitTimes() fromUid := types.ParseUid(msg.From) isGroupMessage := types.GetTopicCat(msg.Topic) == types.TopicCatGrp - if isGroupMessage && groupMsgRuntime != nil { + if groupMsgRuntime != nil { if clientMsgID != "" { - claim, claimed, err := groupMsgRuntime.Claim(tenantID, msg.Topic, fromUid, clientMsgID) - if err != nil { - return nil, err - } - if !claimed { - if claim != nil && claim.Status == "done" && claim.Seq > 0 { - msg.SeqId = claim.Seq - return &types.MessageSaveResult{SeqId: claim.Seq, Duplicate: true}, nil + if isGroupMessage { + claim, claimed, err := groupMsgRuntime.Claim(tenantID, msg.Topic, fromUid, clientMsgID) + if err != nil { + return nil, err + } + if !claimed { + if claim != nil && claim.Status == "done" && claim.Seq > 0 { + msg.SeqId = claim.Seq + return &types.MessageSaveResult{SeqId: claim.Seq, Duplicate: true}, nil + } + return nil, types.ErrDuplicate } - return nil, types.ErrDuplicate } } seq, shardMonth, err := nextMessageSeqWithFloor(tenantID, msg.Topic, msg.SeqId-1, msg.CreatedAt.UTC().Format("200601")) @@ -3419,7 +3421,9 @@ func (messagesMapper) PreparePersist(tenantID types.TenantID, msg *types.Message return nil, err } msg.SeqId = seq - msg.ShardMonth = shardMonth + if isGroupMessage { + msg.ShardMonth = shardMonth + } } if isGroupMessage && msg.ShardMonth == "" { msg.ShardMonth = msg.CreatedAt.UTC().Format("200601")