jafka里的filemessageset类的read方法的问题
@imxylz 你好,想跟你请教个问题:
自己在看jafka的源码时,有个问题不理解,filemessageset的read方法在被Log类的read方法 调用的时候已经是文件内offset了,为什么read方法的实现里要加上this.offset,我感觉这个this.offset就是0.
public MessageSet read(long offset, int length) throws IOException {
List<LogSegment> views = segments.getView();
LogSegment found = findRange(views, offset, views.size());
if (found == null) {
if (logger.isTraceEnabled()) {
logger.trace(format("NOT FOUND MessageSet from Log[%s], offset=%d, length=%d", name, offset, length));
}
return MessageSet.Empty;
}
return found.getMessageSet().read(offset - found.start(), length);
}
return new FileMessageSet(channel, this.offset + readOffset, //
Math.min(this.offset + readOffset + size, highWaterMark()), false, new AtomicBoolean(false));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
感谢回复
目前FileMessageSet只有一次镜像,所以第一次镜像的offset应该都是0,这没问题。但为了保持this.offset在FileMessageSet中的语义,所以在读写FileMessageSet镜像的时候都带着offset定义。另外也许将来为了提升性能有多级FileMessageSet镜像的时候,这里offset就必须传入正确的值了(这是不一定为0)。