private List<PullLogMessage> createMessages(final PullAction action) { final int count = (int) (action.getLastSequence() - action.getFirstSequence() + 1); final List<PullLogMessage> messages = new ArrayList<>(count); for (int i = 0; i < count; i++) { messages.add(new PullLogMessage(action.getFirstSequence() + i, action.getFirstMessageSequence() + i)); } return messages; } }
@Override public AppendMessageResult<MessageSequence> doAppend(long baseOffset, ByteBuffer targetBuffer, int freeSpace, PullLogMessage message) { workingBuffer.clear(); final long wroteOffset = baseOffset + targetBuffer.position(); workingBuffer.flip(); workingBuffer.limit(PULL_LOG_UNIT_BYTES); workingBuffer.putLong(message.getMessageSequence()); targetBuffer.put(workingBuffer.array(), 0, PULL_LOG_UNIT_BYTES); final long messageIndex = wroteOffset / PULL_LOG_UNIT_BYTES; return new AppendMessageResult<>(AppendMessageStatus.SUCCESS, wroteOffset, PULL_LOG_UNIT_BYTES, new MessageSequence(messageIndex, wroteOffset)); } }
private PutMessageResult directPutMessage(final PullLogMessage message) { final long sequence = message.getSequence(); if (sequence < getMaxOffset()) { return new PutMessageResult(PutMessageStatus.ALREADY_WRITTEN, null); } final long expectPhysicalOffset = sequence * PULL_LOG_UNIT_BYTES; LogSegment segment = logManager.locateSegment(expectPhysicalOffset); if (segment == null) { segment = logManager.allocOrResetSegments(expectPhysicalOffset); } fillPreBlank(segment, expectPhysicalOffset); final AppendMessageResult<MessageSequence> result = segment.append(message, messageAppender); switch (result.getStatus()) { case SUCCESS: break; case END_OF_FILE: logManager.allocNextSegment(); return directPutMessage(message); default: return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); } return new PutMessageResult(PutMessageStatus.SUCCESS, result); }
private void fillPreBlank(final LogSegment segment, final long untilWhere) { final PullLogMessage blankMessage = new PullLogMessage(0, -1); final long startOffset = segment.getBaseOffset() + segment.getWrotePosition(); for (long i = startOffset; i < untilWhere; i += PULL_LOG_UNIT_BYTES) { segment.append(blankMessage, messageAppender); } }