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); } }
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); } }
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; }
public synchronized PutMessageResult addAction(final Action action) { final AppendMessageResult<MessageSequence> result; LogSegment segment = logManager.latestSegment(); if (segment == null) { segment = logManager.allocNextSegment(); } if (segment == null) { return new PutMessageResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } result = segment.append(action, actionAppender); switch (result.getStatus()) { case SUCCESS: break; case END_OF_FILE: if (logManager.allocNextSegment() == null) { return new PutMessageResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } return addAction(action); case MESSAGE_SIZE_EXCEEDED: return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, result); default: return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); } return new PutMessageResult(PutMessageStatus.SUCCESS, result); }
public PutMessageResult putMessage(final RawMessage message) { final AppendMessageResult<MessageSequence> result; LogSegment segment = logManager.latestSegment(); if (segment == null) { segment = logManager.allocNextSegment(); } if (segment == null) { return new PutMessageResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } result = segment.append(message, messageAppender); switch (result.getStatus()) { case SUCCESS: break; case END_OF_FILE: LogSegment logSegment = logManager.allocNextSegment(); if (logSegment == null) { return new PutMessageResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } return putMessage(message); case MESSAGE_SIZE_EXCEEDED: return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, result); default: return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); } return new PutMessageResult(PutMessageStatus.SUCCESS, result); }
@Override public AppendMessageRecordResult append(RawMessageExtend record) { AppendMessageResult<Long> result; LogSegment segment = logManager.latestSegment(); if (null == segment) { segment = logManager.allocNextSegment(); } if (null == segment) { return new AppendMessageRecordResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } result = segment.append(record, messageAppender); switch (result.getStatus()) { case MESSAGE_SIZE_EXCEEDED: return new AppendMessageRecordResult(PutMessageStatus.MESSAGE_ILLEGAL, null); case END_OF_FILE: if (null == logManager.allocNextSegment()) { return new AppendMessageRecordResult(PutMessageStatus.CREATE_MAPPED_FILE_FAILED, null); } return append(record); case SUCCESS: return new AppendMessageRecordResult(PutMessageStatus.SUCCESS, result); default: return new AppendMessageRecordResult(PutMessageStatus.UNKNOWN_ERROR, result); } }
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); }