开发者社区 问答 正文

MemoryEventStoreWithBuffer#cleanUntil方法中ackMemSize

最近在阅读canal 1.1.5中MemoryEventStoreWithBuffer源码的时候,发现在累加ackMemSize的值时,累加出现问题;代码中,447行 memsize += calculateSize(event); 应该使用memsize = calculateSize(event),不然在453行使用ackMemSize.addAndGet(memsize);进行累加的时候,ackMemSize每次都会多加上了上一次累加过的值大小。

for (long next = sequence + 1; next <= maxSequence; next++) { Event event = entries[getIndex(next)]; if (localExecTime == 0 && event.getExecuteTime() > 0) { localExecTime = event.getExecuteTime(); } deltaRows += event.getRowsCount(); memsize += calculateSize(event); if ((seqId < 0 || next == seqId) && CanalEventUtils.checkPosition(event, (LogPosition) position)) { // 找到对应的position,更新ack seq hasMatch = true;

                if (batchMode.isMemSize()) {
                    ackMemSize.addAndGet(memsize);

原提问者GitHub用户411129516

展开
收起
Java工程师 2023-05-03 12:46:06 74 分享 版权
1 条回答
写回答
取消 提交回答
  • 原代码设计上是对的,ackMemSize.addAndGet(memsize)只会在满足条件的位点上执行一次,之后就会退出循环

    原回答者GitHub用户agapple

    2023-05-04 16:26:35
    赞同 展开评论
问答分类:
问答地址: