@Override public AppendMessageResult<Void> doAppend(long baseOffset, ByteBuffer targetBuffer, int freeSpace, ConsumerLogMessage message) { workingBuffer.clear(); final long wroteOffset = baseOffset + targetBuffer.position(); workingBuffer.flip(); workingBuffer.limit(CONSUMER_LOG_UNIT_BYTES); workingBuffer.putLong(System.currentTimeMillis()); workingBuffer.putLong(message.getOffset()); workingBuffer.putInt(message.getSize()); workingBuffer.putShort(message.getHeaderSize()); targetBuffer.put(workingBuffer.array(), 0, CONSUMER_LOG_UNIT_BYTES); return new AppendMessageResult<>(AppendMessageStatus.SUCCESS, wroteOffset, CONSUMER_LOG_UNIT_BYTES); } }
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; }
private void fillPreBlank(final LogSegment segment, final long untilWhere) { final ConsumerLogMessage blankMessage = new ConsumerLogMessage(0, 0, Integer.MAX_VALUE, (short) 0); final long startOffset = segment.getBaseOffset() + segment.getWrotePosition(); for (long i = startOffset; i < untilWhere; i += CONSUMER_LOG_UNIT_BYTES) { segment.append(blankMessage, consumerLogAppender); } }