public boolean putMessageLogOffset(final long sequence, final long offset, final int size, final short headerSize) {
putMessageLogOffsetLock.lock();
try {
if (sequence < nextSequence()) {
return true;
}
final long expectedOffset = sequence * CONSUMER_LOG_UNIT_BYTES;
LogSegment segment = logManager.locateSegment(expectedOffset);
if (segment == null) {
segment = logManager.allocOrResetSegments(expectedOffset);
}
fillPreBlank(segment, expectedOffset);
final AppendMessageResult result = segment.append(new ConsumerLogMessage(sequence, offset, size, headerSize), consumerLogAppender);
switch (result.getStatus()) {
case SUCCESS:
break;
case END_OF_FILE:
logManager.allocNextSegment();
return putMessageLogOffset(sequence, offset, size, headerSize);
default:
return false;
}
} finally {
putMessageLogOffsetLock.unlock();
}
return true;
}