文章

Bug:插入重复oid时报错

Bug:插入重复oid时报错

现象

OSS-Mongo 版本进行了改动:当因为有重复 oid 而导致插入失败时,返回的 ec 报错改为kInsertMongo_DuplicateId,与普通插入失败的报错 ec(kInsertMongoDocError)进行区分。

目的是为了保证该种类型的插入失败不需要消息恢复机制(否则会因为消息恢复机制一直尝试重复插入)。

该 ec 也会从 OSS 返回给外部,而其它可以消息恢复的 ec 会在返回之前赋值为 kOK。

这会导致 Store 的异步队列收到一个ec!=kOK,然后直接 reture FALSE;,这会导致 Store 的异步框架在收到 FALSE 后不停地重复尝试发送。形成死循环。

结局方案

  1. OSS 新建一个函数专门用来区分需要对外屏蔽的 ec,其中包含了上文中提到的两个 ec;
  2. 考虑过但是没有执行的方案:(Store 中负责双跑 MongoDB 的异步函数中不返回 FALSE?但这样下游 OSS-Mongo 热更新的时候,Store 双跑侧会有大量消息丢失。)
本文由作者按照 CC BY 4.0 进行授权