private int determineInitialPartitionId() { final LogStorage logStorage = logStorageInjector.getValue(); final LogBlockIndex logBlockIndex = logBlockIndexInjector.getValue(); try (BufferedLogStreamReader logReader = new BufferedLogStreamReader(true)) { logReader.wrap(logStorage, logBlockIndex); long lastPosition = 0; // Get position of last entry logReader.seekToLastEvent(); if (logReader.hasNext()) { final LoggedEvent lastEntry = logReader.next(); lastPosition = lastEntry.getPosition(); } // dispatcher needs to generate positions greater than the last position int partitionId = 0; if (lastPosition > 0) { partitionId = PositionUtil.partitionId(lastPosition); } return partitionId; } }
@Override public boolean hasNext() { switch (state) { case EMPTY_LOG_STREAM: seekToFirstEvent(); break; case NOT_ENOUGH_DATA: readNextAddress(); break; case EVENT_NOT_COMMITTED: checkIfNextEventIsCommitted(); break; case WRAP_NOT_CALLED: throw new IllegalStateException("Iterator not initialized"); } return state == IteratorState.EVENT_AVAILABLE; }
public LoggedEvent getLastEvent() { reader.seekToLastEvent(); if (reader.hasNext()) { return reader.next(); } else { return null; } }
public void wrap( final LogStorage logStorage, final LogBlockIndex logBlockIndex, final long position) { this.logStorage = logStorage; this.logBlockIndex = logBlockIndex; if (isClosed()) { allocateBuffer(DEFAULT_INITIAL_BUFFER_CAPACITY); } seek(position); }
@Test public void shouldWriteCommandRequestEventType() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest(serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, 123); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getValueType()).isEqualTo(ValueType.JOB); assertThat(eventMetadata.getIntent()).isEqualTo(JobIntent.CREATE); }
public TypedStreamReaderImpl( LogStream stream, EnumMap<ValueType, Class<? extends UnpackedObject>> eventRegistry) { this.reader = new BufferedLogStreamReader(stream); this.eventCache = new HashMap<>(); eventRegistry.forEach((t, c) -> eventCache.put(c, ReflectUtil.newInstance(c))); }
reader.seek(blockPosition); } else { reader.seekToFirstEvent(); while (reader.hasNext()) { final LoggedEvent next = reader.next();
@Override public void seekToLastEvent() { seek(getLastPosition()); if (isNextEventInitialized()) { checkIfNextEventIsCommitted(); } }
protected void waitForAvailableEvent(final BufferedLogStreamReader logStreamReader) { TestUtil.waitUntil(() -> logStreamReader.hasNext()); } }
private boolean readBlockIntoBuffer(final long blockAddress) { if (byteBuffer.remaining() < LogEntryDescriptor.HEADER_BLOCK_LENGTH) { compactBuffer(); } final long result = logStorage.read(byteBuffer, blockAddress, completeEventsInBlockProcessor); if (result == LogStorage.OP_RESULT_INSUFFICIENT_BUFFER_CAPACITY) { // it was not possible to read the block in the existing buffer => expand buffer long nextCapacity = 2L * (long) byteBuffer.capacity(); nextCapacity = Math.min(nextCapacity, MAX_BUFFER_CAPACITY); allocateBuffer((int) nextCapacity); // retry to read the next block return readBlockIntoBuffer(blockAddress); } else if (result == LogStorage.OP_RESULT_INVALID_ADDR) { throw new IllegalStateException("Invalid address to read from " + blockAddress); } else if (result == LogStorage.OP_RESULT_NO_DATA) { state = IteratorState.NOT_ENOUGH_DATA; return false; } else { this.nextLogStorageReadAddress = result; return true; } }
private void setPreviousEventToEndOfLog() { discardBufferedEvent(); reader.seekToLastEvent(); final LoggedEventImpl lastEvent = getNextEvent(); setPreviousEvent(lastEvent); }
private void setPreviousEventToStartOfLog() { discardBufferedEvent(); reader.seekToFirstEvent(); setPreviousEvent(null); }
@Override public void seekToFirstEvent() { seek(FIRST_POSITION); }
@Test public void shouldWriteCommandRequestEventType() { // given final int writtenLength = writeCommandRequestToBuffer( buffer, LOG_STREAM_PARTITION_ID, null, ValueType.JOB, JobIntent.CREATE); // when final boolean isHandled = messageHandler.onRequest(serverOutput, DEFAULT_ADDRESS, buffer, 0, writtenLength, 123); // then assertThat(isHandled).isTrue(); final BufferedLogStreamReader logStreamReader = new BufferedLogStreamReader(logStream, true); waitForAvailableEvent(logStreamReader); final LoggedEvent loggedEvent = logStreamReader.next(); final RecordMetadata eventMetadata = new RecordMetadata(); loggedEvent.readMetadata(eventMetadata); assertThat(eventMetadata.getValueType()).isEqualTo(ValueType.JOB); assertThat(eventMetadata.getIntent()).isEqualTo(JobIntent.CREATE); }
public TypedStreamReaderImpl( LogStream stream, EnumMap<ValueType, Class<? extends UnpackedObject>> eventRegistry) { this.reader = new BufferedLogStreamReader(stream); this.eventCache = new HashMap<>(); eventRegistry.forEach((t, c) -> eventCache.put(c, ReflectUtil.newInstance(c))); }
public LoggedEvent getLastEvent() { reader.seekToLastEvent(); if (reader.hasNext()) { return reader.next(); } else { return null; } }
reader.seek(blockPosition); } else { reader.seekToFirstEvent(); while (reader.hasNext()) { final LoggedEvent next = reader.next();