protected IOException unknownCommandType( byte commandType, ReadableChannel channel ) throws IOException { String message = "Unknown command type[" + commandType + "]"; if ( channel instanceof PositionAwareChannel ) { PositionAwareChannel logChannel = (PositionAwareChannel) channel; LogPositionMarker position = new LogPositionMarker(); logChannel.getCurrentPosition( position ); message += " near " + position.newPosition(); } return new IOException( message ); } }
@Test public void shouldReturnUnspecifiedIfNothingHasBeenMarked() { // given final LogPositionMarker marker = new LogPositionMarker(); // when final LogPosition logPosition = marker.newPosition(); // given assertEquals(LogPosition.UNSPECIFIED, logPosition); }
@Test public void shouldReturnTheMarkedPosition() { // given final LogPositionMarker marker = new LogPositionMarker(); // when marker.mark( 1, 2 ); final LogPosition logPosition = marker.newPosition(); // given assertEquals(new LogPosition( 1, 2 ), logPosition); }
@Test public void shouldReturnUnspecifiedWhenAskedTo() { // given final LogPositionMarker marker = new LogPositionMarker(); // when marker.mark( 1, 2 ); marker.unspecified(); final LogPosition logPosition = marker.newPosition(); // given assertEquals(LogPosition.UNSPECIFIED, logPosition); } }
LogPositionMarker positionMarker = new LogPositionMarker(); long skipped = 0; while ( true )
@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() ); }
LogFile logFile = logFiles.getLogFile(); FlushablePositionAwareChannel writer = logFile.getWriter(); LogPositionMarker startPosition = new LogPositionMarker(); writer.getCurrentPosition( startPosition );
LogPositionMarker positionMarker = new LogPositionMarker(); LogEntryWriter writer = new LogEntryWriter( writeChannel ); for ( Entry entry : entries )
@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() ); }
LogPositionMarker marker = new LogPositionMarker();
LogPositionMarker marker = new LogPositionMarker();
LogPositionMarker mark = new LogPositionMarker(); writer.getCurrentPosition( mark ); for ( int i = 0; i < 5; i++ )
@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() ); }
@Test public void shouldSeeCorrectPositionEvenBeforeEmptyingDataIntoChannel() throws Exception { // GIVEN final File file = new File( directory.directory(), "file" ); StoreChannel storeChannel = fileSystemRule.get().open( file, OpenMode.READ_WRITE ); PhysicalLogVersionedStoreChannel versionedStoreChannel = new PhysicalLogVersionedStoreChannel( storeChannel, 1, (byte) -1 /* ignored */ ); PositionAwarePhysicalFlushableChannel channel = new PositionAwarePhysicalFlushableChannel( versionedStoreChannel ); LogPositionMarker positionMarker = new LogPositionMarker(); LogPosition initialPosition = channel.getCurrentPosition( positionMarker ).newPosition(); // WHEN channel.putLong( 67 ); channel.putInt( 1234 ); LogPosition positionAfterSomeData = channel.getCurrentPosition( positionMarker ).newPosition(); // THEN assertEquals( 12, positionAfterSomeData.getByteOffset() - initialPosition.getByteOffset() ); channel.close(); }
@Test public void shouldWriteSomeDataIntoTheLog() throws Exception { // GIVEN String name = "log"; FileSystemAbstraction fs = fileSystemRule.get(); LogFiles logFiles = LogFilesBuilder.builder( directory.databaseLayout(), fs ) .withTransactionIdStore( transactionIdStore ) .withLogVersionRepository( logVersionRepository ).build(); life.start(); life.add( logFiles ); // WHEN FlushablePositionAwareChannel writer = logFiles.getLogFile().getWriter(); LogPositionMarker positionMarker = new LogPositionMarker(); writer.getCurrentPosition( positionMarker ); int intValue = 45; long longValue = 4854587; writer.putInt( intValue ); writer.putLong( longValue ); writer.prepareForFlush().flush(); // THEN try ( ReadableClosableChannel reader = logFiles.getLogFile().getReader( positionMarker.newPosition() ) ) { assertEquals( intValue, reader.getInt() ); assertEquals( longValue, reader.getLong() ); } }
final LogPositionMarker marker = new LogPositionMarker();
LogPositionMarker positionMarker = new LogPositionMarker(); writer.getCurrentPosition( positionMarker ); LogPosition position1 = positionMarker.newPosition();
protected IOException unknownCommandType( byte commandType, ReadableChannel channel ) throws IOException { String message = "Unknown command type[" + commandType + "]"; if ( channel instanceof PositionAwareChannel ) { PositionAwareChannel logChannel = (PositionAwareChannel) channel; LogPositionMarker position = new LogPositionMarker(); logChannel.getCurrentPosition( position ); message += " near " + position.newPosition(); } return new IOException( message ); } }
LogPositionMarker positionMarker = new LogPositionMarker(); long skipped = 0; while ( true )