invalidLogEntryHandler.handleInvalidEntry( e, position ) ) ((PositionableChannel)channel).setCurrentPosition( positionMarker.getByteOffset() + 1 ); skipped++; continue;
@Test public void shouldTruncateLogAfterSinglePartialTransaction() throws Exception { // GIVEN File file = logFiles.getLogFileForVersion( logVersion ); final LogPositionMarker marker = new LogPositionMarker(); writeSomeData( file, pair -> { LogEntryWriter writer = pair.first(); Consumer<LogPositionMarker> consumer = pair.other(); // incomplete tx consumer.accept( marker ); // <-- marker has the last good position writer.writeStartEntry( 0, 1, 5L, 4L, new byte[0] ); return true; } ); // WHEN boolean recoveryRequired = recover( storeDir, logFiles ); // THEN assertTrue( recoveryRequired ); assertEquals( marker.getByteOffset(), file.length() ); }
@Test public void shouldTruncateLogAfterLastCompleteTransactionAfterSuccessfulRecovery() throws Exception { // GIVEN File file = logFiles.getLogFileForVersion( logVersion ); final LogPositionMarker marker = new LogPositionMarker(); writeSomeData( file, pair -> { LogEntryWriter writer = pair.first(); Consumer<LogPositionMarker> consumer = pair.other(); // last committed tx writer.writeStartEntry( 0, 1, 2L, 3L, new byte[0] ); writer.writeCommitEntry( 4L, 5L ); // incomplete tx consumer.accept( marker ); // <-- marker has the last good position writer.writeStartEntry( 0, 1, 5L, 4L, new byte[0] ); return true; } ); // WHEN boolean recoveryRequired = recover( storeDir, logFiles ); // THEN assertTrue( recoveryRequired ); assertEquals( marker.getByteOffset(), file.length() ); }
@Test public void doNotTruncateCheckpointsAfterLastTransaction() throws IOException { File file = logFiles.getLogFileForVersion( logVersion ); LogPositionMarker marker = new LogPositionMarker(); writeSomeData( file, pair -> { LogEntryWriter writer = pair.first(); writer.writeStartEntry( 1, 1, 1L, 1L, ArrayUtils.EMPTY_BYTE_ARRAY ); writer.writeCommitEntry( 1L, 2L ); writer.writeCheckPointEntry( new LogPosition( logVersion, LogHeader.LOG_HEADER_SIZE ) ); writer.writeCheckPointEntry( new LogPosition( logVersion, LogHeader.LOG_HEADER_SIZE ) ); writer.writeCheckPointEntry( new LogPosition( logVersion, LogHeader.LOG_HEADER_SIZE ) ); writer.writeCheckPointEntry( new LogPosition( logVersion, LogHeader.LOG_HEADER_SIZE ) ); Consumer<LogPositionMarker> other = pair.other(); other.accept( marker ); return true; } ); assertTrue( recover( storeDir, logFiles ) ); assertEquals( marker.getByteOffset(), file.length() ); }
assertEquals( commitTimestamp, transactionIdStore.getLastCommittedTransaction().commitTimestamp() ); assertEquals( logVersion, lastClosedTransaction[1] ); assertEquals( marker.getByteOffset(), lastClosedTransaction[2] );
invalidLogEntryHandler.handleInvalidEntry( e, position ) ) ((PositionableChannel)channel).setCurrentPosition( positionMarker.getByteOffset() + 1 ); skipped++; continue;