use of org.neo4j.kernel.impl.transaction.log.entry.LogHeader in project neo4j by neo4j.
the class NeoStoreDataSourceTest method logWithTransactions.
private PhysicalLogFiles logWithTransactions(long logVersion, long headerTxId) throws IOException {
PhysicalLogFiles files = mock(PhysicalLogFiles.class);
when(files.getLowestLogVersion()).thenReturn(logVersion);
when(files.hasAnyEntries(logVersion)).thenReturn(true);
when(files.versionExists(logVersion)).thenReturn(true);
when(files.extractHeader(logVersion)).thenReturn(new LogHeader(LogEntryVersion.CURRENT.byteCode(), logVersion, headerTxId));
return files;
}
use of org.neo4j.kernel.impl.transaction.log.entry.LogHeader in project neo4j by neo4j.
the class LegacyLogEntryReaderTest method shouldReadTheLogHeaderAndSetCurrentVersionAndABaseTxIdIfNegative.
@Test
public void shouldReadTheLogHeaderAndSetCurrentVersionAndABaseTxIdIfNegative() throws IOException {
// given
final LegacyLogEntryReader reader = new LegacyLogEntryReader(fs);
// when
final Pair<LogHeader, IOCursor<LogEntry>> pair = reader.openReadableChannel(input);
// then
// not null cursor
pair.other().close();
assertEquals(new LogHeader(CURRENT_LOG_VERSION, 3L, BASE_TX_ID), pair.first());
}
use of org.neo4j.kernel.impl.transaction.log.entry.LogHeader in project neo4j by neo4j.
the class LegacyLogsTest method shouldRewriteLogFiles.
@Test
public void shouldRewriteLogFiles() throws IOException {
// given
final IOCursor<LogEntry> cursor = mock(IOCursor.class);
final LogVersionedStoreChannel writeChannel = mock(LogVersionedStoreChannel.class);
final LogHeader header = new LogHeader(CURRENT_LOG_VERSION, 1, 42);
when(fs.listFiles(storeDir, versionedLegacyLogFilesFilter)).thenReturn(new File[] { new File(getLegacyLogFilename(1)) });
when(reader.openReadableChannel(new File(getLegacyLogFilename(1)))).thenReturn(Pair.of(header, cursor));
when(writer.openWritableChannel(new File(migrationDir, getLegacyLogFilename(1)))).thenReturn(writeChannel);
// when
new LegacyLogs(fs, reader, writer).migrateLogs(storeDir, migrationDir);
// then
verify(writer, times(1)).writeLogHeader(writeChannel, header);
verify(writer, times(1)).writeAllLogEntries(writeChannel, cursor);
}
use of org.neo4j.kernel.impl.transaction.log.entry.LogHeader in project neo4j by neo4j.
the class PhysicalLogFileInformationTest method shouldReadAndCacheFirstCommittedTransactionIdWhenNotCached.
@Test
public void shouldReadAndCacheFirstCommittedTransactionIdWhenNotCached() throws Exception {
PhysicalLogFileInformation info = new PhysicalLogFileInformation(logFiles, logHeaderCache, transactionIdStore::getLastCommittedTransactionId, logVersionToTimestamp);
long expected = 5;
long version = 10L;
when(logFiles.getHighestLogVersion()).thenReturn(version);
when(logHeaderCache.getLogHeader(version)).thenReturn(null);
when(logFiles.versionExists(version)).thenReturn(true);
when(logFiles.extractHeader(version)).thenReturn(new LogHeader((byte) -1, /*ignored*/
-1L, /*ignored*/
expected - 1L));
when(logFiles.hasAnyEntries(version)).thenReturn(true);
long firstCommittedTxId = info.getFirstExistingEntryId();
assertEquals(expected, firstCommittedTxId);
verify(logHeaderCache, times(1)).putHeader(version, expected - 1);
}
use of org.neo4j.kernel.impl.transaction.log.entry.LogHeader in project neo4j by neo4j.
the class DumpLogicalLog method dump.
public void dump(String filenameOrDirectory, PrintStream out, Predicate<LogEntry[]> filter, Function<LogEntry, String> serializer) throws IOException {
File file = new File(filenameOrDirectory);
printFile(file, out);
File firstFile;
LogVersionBridge bridge;
if (file.isDirectory()) {
// Use natural log version bridging if a directory is supplied
final PhysicalLogFiles logFiles = new PhysicalLogFiles(file, fileSystem);
bridge = new ReaderLogVersionBridge(fileSystem, logFiles) {
@Override
public LogVersionedStoreChannel next(LogVersionedStoreChannel channel) throws IOException {
LogVersionedStoreChannel next = super.next(channel);
if (next != channel) {
printFile(logFiles.getLogFileForVersion(next.getVersion()), out);
}
return next;
}
};
firstFile = logFiles.getLogFileForVersion(logFiles.getLowestLogVersion());
} else {
// Use no bridging, simple reading this single log file if a file is supplied
firstFile = file;
bridge = NO_MORE_CHANNELS;
}
StoreChannel fileChannel = fileSystem.open(firstFile, "r");
ByteBuffer buffer = ByteBuffer.allocateDirect(LOG_HEADER_SIZE);
LogHeader logHeader;
try {
logHeader = readLogHeader(buffer, fileChannel, false, firstFile);
} catch (IOException ex) {
out.println("Unable to read timestamp information, no records in logical log.");
out.println(ex.getMessage());
fileChannel.close();
throw ex;
}
out.println("Logical log format: " + logHeader.logFormatVersion + " version: " + logHeader.logVersion + " with prev committed tx[" + logHeader.lastCommittedTxId + "]");
PhysicalLogVersionedStoreChannel channel = new PhysicalLogVersionedStoreChannel(fileChannel, logHeader.logVersion, logHeader.logFormatVersion);
ReadableClosablePositionAwareChannel logChannel = new ReadAheadLogChannel(channel, bridge, DEFAULT_READ_AHEAD_SIZE);
LogEntryReader<ReadableClosablePositionAwareChannel> entryReader = new VersionAwareLogEntryReader<>();
IOCursor<LogEntry> entryCursor = new LogEntryCursor(entryReader, logChannel);
TransactionLogEntryCursor transactionCursor = new TransactionLogEntryCursor(entryCursor);
try (IOCursor<LogEntry[]> cursor = filter == null ? transactionCursor : new FilteringIOCursor<>(transactionCursor, filter)) {
while (cursor.next()) {
for (LogEntry entry : cursor.get()) {
out.println(serializer.apply(entry));
}
}
}
}
Aggregations