最近在阅读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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
原代码设计上是对的,ackMemSize.addAndGet(memsize)只会在满足条件的位点上执行一次,之后就会退出循环
原回答者GitHub用户agapple