版本:4.3.4.4.0 当奴隶的机器坏了几天时,在机器修好后启动奴隶在这种情况下,master无法将commitLog数据发送到slave,这导致SYNC_master在向该代理发送消息时返回slave_NOT_AVAIABLE在master的broker.log中搜索,可以找到“Slave fall落后于master:xxx”
经过分析,我发现从方的commitLog偏移量在主方的commit Log中不存在,这导致主方getCommitLogData的偏移量超出范围返回null,然后只发送心跳
一些资源代码如下:
SelectMappedBufferResult selectResult = HAConnection.this.haService.getDefaultMessageStore().getCommitLogData(this.nextTransferFromWhere); if (selectResult != null) { int size = selectResult.getSize(); if (size > HAConnection.this.haService.getDefaultMessageStore().getMessageStoreConfig().getHaTransferBatchSize()) { size = HAConnection.this.haService.getDefaultMessageStore().getMessageStoreConfig().getHaTransferBatchSize(); }
long thisOffset = this.nextTransferFromWhere;
this.nextTransferFromWhere += size;
selectResult.getByteBuffer().limit(size);
this.selectMappedBufferResult = selectResult;
// Build Header
this.byteBufferHeader.position(0);
this.byteBufferHeader.limit(headerSize);
this.byteBufferHeader.putLong(thisOffset);
this.byteBufferHeader.putInt(size);
this.byteBufferHeader.flip();
this.lastWriteOver = this.transferData();
} else {
service.getWaitNotifyObject().wakeupAll();
HAConnection.this.haService.getWaitNotifyObject().allWaitForRunning(100);
}
我认为当master收到slaveRequestOffset时,计算nextTransfer FromWhere应该检查slaveRequest Offset是否合法,而不仅仅是
this.nextTransferFromWhere = HAConnection.this.slaveRequestOffset;
原提问者GitHub用户qsrg
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。