Fix P2P message duplicate seq retry
This commit is contained in:
+32
-4
@@ -3351,9 +3351,6 @@ func (messagesMapper) PersistPrepared(tenantID types.TenantID, msg *types.Messag
|
||||
err = tenantAdp.TenantGroupMessageSave(tenantID, msg)
|
||||
} else {
|
||||
err = tenantAdp.TenantMessageSave(tenantID, msg)
|
||||
if err == types.ErrDuplicate && clientMsgID == "" {
|
||||
err = retryTenantMessageSaveAfterSeqConflict(tenantAdp, tenantID, msg)
|
||||
}
|
||||
}
|
||||
if err != nil {
|
||||
if isGroupMessage && err == types.ErrDuplicate && clientMsgID != "" {
|
||||
@@ -3369,10 +3366,28 @@ func (messagesMapper) PersistPrepared(tenantID types.TenantID, msg *types.Messag
|
||||
return &types.MessageSaveResult{SeqId: duplicate.SeqId, Duplicate: true}, nil
|
||||
}
|
||||
}
|
||||
if !isGroupMessage && err == types.ErrDuplicate {
|
||||
if clientMsgID != "" {
|
||||
duplicate, dupErr := tenantAdp.TenantMessageGetByClientID(tenantID, fromUid, clientMsgID)
|
||||
if dupErr != nil {
|
||||
return nil, dupErr
|
||||
}
|
||||
if duplicate != nil {
|
||||
copyPersistedMessage(msg, duplicate)
|
||||
return &types.MessageSaveResult{SeqId: duplicate.SeqId, Duplicate: true}, nil
|
||||
}
|
||||
}
|
||||
if retryErr := retryTenantMessageSaveAfterSeqConflict(tenantAdp, tenantID, msg); retryErr != nil {
|
||||
return nil, retryErr
|
||||
}
|
||||
err = nil
|
||||
}
|
||||
if isGroupMessage && groupMsgRuntime != nil && clientMsgID != "" {
|
||||
_ = groupMsgRuntime.MarkFailed(tenantID, msg.Topic, fromUid, clientMsgID)
|
||||
}
|
||||
return nil, err
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
if err = tenantAdp.TenantTopicUpdateOnMessage(tenantID, msg.Topic, msg); err != nil {
|
||||
return nil, err
|
||||
@@ -3438,6 +3453,19 @@ func (messagesMapper) PersistPrepared(tenantID types.TenantID, msg *types.Messag
|
||||
return &types.MessageSaveResult{SeqId: msg.SeqId, MarkedReadBySender: markedReadBySender}, nil
|
||||
}
|
||||
|
||||
func copyPersistedMessage(dst, src *types.Message) {
|
||||
dst.ObjHeader = src.ObjHeader
|
||||
dst.DeletedAt = src.DeletedAt
|
||||
dst.DelId = src.DelId
|
||||
dst.DeletedFor = src.DeletedFor
|
||||
dst.SeqId = src.SeqId
|
||||
dst.Topic = src.Topic
|
||||
dst.From = src.From
|
||||
dst.ClientMsgID = src.ClientMsgID
|
||||
dst.Head = src.Head
|
||||
dst.Content = src.Content
|
||||
}
|
||||
|
||||
func PrepareMessagePersist(tenantID types.TenantID, msg *types.Message, attachmentURLs []string, readBySender bool) (*types.MessageSaveResult, error) {
|
||||
return Messages.PreparePersist(tenantID, msg, attachmentURLs, readBySender)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user