예제 #1
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldTruncateLogAfterLastCompleteTransactionAfterSuccessfulRecovery() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldTruncateLogAfterLastCompleteTransactionAfterSuccessfulRecovery()
        {
            // GIVEN
            File file = _logFiles.getLogFileForVersion(_logVersion);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final org.neo4j.kernel.impl.transaction.log.LogPositionMarker marker = new org.neo4j.kernel.impl.transaction.log.LogPositionMarker();
            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 sbyte[0]);
                writer.writeCommitEntry(4L, 5L);

                // incomplete tx
                consumer.accept(marker);                   // <-- marker has the last good position
                writer.writeStartEntry(0, 1, 5L, 4L, new sbyte[0]);

                return(true);
            });

            // WHEN
            bool recoveryRequired = Recover(_storeDir, _logFiles);

            // THEN
            assertTrue(recoveryRequired);
            assertEquals(marker.ByteOffset, file.length());
        }
예제 #2
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldSeeThatACleanDatabaseShouldNotRequireRecovery() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldSeeThatACleanDatabaseShouldNotRequireRecovery()
        {
            File file = _logFiles.getLogFileForVersion(_logVersion);

            WriteSomeData(file, pair =>
            {
                LogEntryWriter writer = pair.first();
                Consumer <LogPositionMarker> consumer = pair.other();
                LogPositionMarker marker = new LogPositionMarker();

                // last committed tx
                consumer.accept(marker);
                writer.writeStartEntry(0, 1, 2L, 3L, new sbyte[0]);
                writer.writeCommitEntry(4L, 5L);

                // check point
                consumer.accept(marker);
                writer.writeCheckPointEntry(marker.newPosition());

                return(true);
            });

            LifeSupport     life    = new LifeSupport();
            RecoveryMonitor monitor = mock(typeof(RecoveryMonitor));

            try
            {
                StorageEngine storageEngine = mock(typeof(StorageEngine));
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final org.neo4j.kernel.impl.transaction.log.entry.LogEntryReader<org.neo4j.kernel.impl.transaction.log.ReadableClosablePositionAwareChannel> reader = new org.neo4j.kernel.impl.transaction.log.entry.VersionAwareLogEntryReader<>();
                LogEntryReader <ReadableClosablePositionAwareChannel> reader = new VersionAwareLogEntryReader <ReadableClosablePositionAwareChannel>();
                LogTailScanner tailScanner = GetTailScanner(_logFiles, reader);

                TransactionMetadataCache metadataCache = new TransactionMetadataCache();
                LogicalTransactionStore  txStore       = new PhysicalLogicalTransactionStore(_logFiles, metadataCache, reader, _monitors, false);
                CorruptedLogsTruncator   logPruner     = new CorruptedLogsTruncator(_storeDir, _logFiles, FileSystemRule.get());
                life.add(new Recovery(new DefaultRecoveryServiceAnonymousInnerClass2(this, storageEngine, tailScanner, _transactionIdStore, txStore, _versionRepository, NO_MONITOR)
                                      , logPruner, _schemaLife, monitor, SilentProgressReporter.INSTANCE, false));

                life.Start();

                verifyZeroInteractions(monitor);
            }
            finally
            {
                life.Shutdown();
            }
        }
예제 #3
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldTellTransactionIdStoreAfterSuccessfulRecovery() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldTellTransactionIdStoreAfterSuccessfulRecovery()
        {
            // GIVEN
            File file = _logFiles.getLogFileForVersion(_logVersion);
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final org.neo4j.kernel.impl.transaction.log.LogPositionMarker marker = new org.neo4j.kernel.impl.transaction.log.LogPositionMarker();
            LogPositionMarker marker = new LogPositionMarker();

//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final byte[] additionalHeaderData = new byte[0];
            sbyte[]    additionalHeaderData = new sbyte[0];
            const int  masterId             = 0;
            const int  authorId             = 1;
            const long transactionId        = 4;
            const long commitTimestamp      = 5;

            WriteSomeData(file, pair =>
            {
                LogEntryWriter writer = pair.first();
                Consumer <LogPositionMarker> consumer = pair.other();

                // last committed tx
                writer.writeStartEntry(masterId, authorId, 2L, 3L, additionalHeaderData);
                writer.writeCommitEntry(transactionId, commitTimestamp);
                consumer.accept(marker);

                return(true);
            });

            // WHEN
            bool recoveryRequired = Recover(_storeDir, _logFiles);

            // THEN
            assertTrue(recoveryRequired);
            long[] lastClosedTransaction = _transactionIdStore.LastClosedTransaction;
            assertEquals(transactionId, lastClosedTransaction[0]);
            assertEquals(LogEntryStart.checksum(additionalHeaderData, masterId, authorId), _transactionIdStore.LastCommittedTransaction.checksum());
            assertEquals(commitTimestamp, _transactionIdStore.LastCommittedTransaction.commitTimestamp());
            assertEquals(_logVersion, lastClosedTransaction[1]);
            assertEquals(marker.ByteOffset, lastClosedTransaction[2]);
        }
예제 #4
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void doNotTruncateCheckpointsAfterLastTransaction() throws java.io.IOException
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void DoNotTruncateCheckpointsAfterLastTransaction()
        {
            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.ByteOffset, file.length());
        }
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: public LogPositionMarker getCurrentPosition(LogPositionMarker positionMarker) throws java.io.IOException
        public override LogPositionMarker GetCurrentPosition(LogPositionMarker positionMarker)
        {
            positionMarker.Mark(_logVersionedStoreChannel.Version, _channel.position());
            return(positionMarker);
        }
예제 #6
0
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
//ORIGINAL LINE: public LogEntry readLogEntry(SOURCE channel) throws java.io.IOException
        public override LogEntry ReadLogEntry(SOURCE channel)
        {
            try
            {
                LogPositionMarker positionMarker = new LogPositionMarker();
                long skipped = 0;
                while (true)
                {
                    channel.GetCurrentPosition(positionMarker);

                    sbyte versionCode = channel.Get();
                    sbyte typeCode    = channel.Get();

                    LogEntryVersion           version = null;
                    LogEntryParser <LogEntry> entryReader;
                    LogEntry entry;
                    try
                    {
                        version     = byVersion(versionCode);
                        entryReader = version.entryParser(typeCode);
                        entry       = entryReader.Parse(version, channel, positionMarker, _commandReaderFactory);
                        if (entry != null && skipped > 0)
                        {
                            // Take extra care when reading an entry in a bad section. Just because entry reading
                            // didn't throw exception doesn't mean that it's a sane entry.
                            if (!logEntryMakesSense(entry))
                            {
                                throw new System.ArgumentException("Log entry " + entry + " which was read after " + "a bad section of " + skipped + " bytes was read successfully, but " + "its contents is unrealistic, so treating as part of bad section");
                            }
                            _invalidLogEntryHandler.bytesSkipped(skipped);
                            skipped = 0;
                        }
                    }
                    catch (ReadPastEndException e)
                    {                              // Make these exceptions slip by straight out to the outer handler
                        throw e;
                    }
                    catch (Exception e)
                    {                              // Tag all other exceptions with log position and other useful information
                        LogPosition position = positionMarker.NewPosition();
                        e = withMessage(e, e.Message + ". At position " + position + " and entry version " + version);

                        if (ChannelSupportsPositioning(channel) && _invalidLogEntryHandler.handleInvalidEntry(e, position))
                        {
                            (( PositionableChannel )channel).CurrentPosition = positionMarker.ByteOffset + 1;
                            skipped++;
                            continue;
                        }
                        throwIfInstanceOf(e, typeof(UnsupportedLogVersionException));
                        throw new IOException(e);
                    }

                    if (!entryReader.Skip())
                    {
                        return(entry);
                    }
                }
            }
            catch (ReadPastEndException)
            {
                return(null);
            }
        }
예제 #7
0
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void shouldRecoverExistingData() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ShouldRecoverExistingData()
        {
            File file = _logFiles.getLogFileForVersion(_logVersion);

            WriteSomeData(file, pair =>
            {
                LogEntryWriter writer = pair.first();
                Consumer <LogPositionMarker> consumer = pair.other();
                LogPositionMarker marker = new LogPositionMarker();

                // last committed tx
                consumer.accept(marker);
                LogPosition lastCommittedTxPosition = marker.newPosition();
                writer.writeStartEntry(0, 1, 2L, 3L, new sbyte[0]);
                _lastCommittedTxStartEntry = new LogEntryStart(0, 1, 2L, 3L, new sbyte[0], lastCommittedTxPosition);
                writer.writeCommitEntry(4L, 5L);
                _lastCommittedTxCommitEntry = new LogEntryCommit(4L, 5L);

                // check point pointing to the previously committed transaction
                writer.writeCheckPointEntry(lastCommittedTxPosition);
                _expectedCheckPointEntry = new CheckPoint(lastCommittedTxPosition);

                // tx committed after checkpoint
                consumer.accept(marker);
                writer.writeStartEntry(0, 1, 6L, 4L, new sbyte[0]);
                _expectedStartEntry = new LogEntryStart(0, 1, 6L, 4L, new sbyte[0], marker.newPosition());

                writer.writeCommitEntry(5L, 7L);
                _expectedCommitEntry = new LogEntryCommit(5L, 7L);

                return(true);
            });

            LifeSupport     life    = new LifeSupport();
            RecoveryMonitor monitor = mock(typeof(RecoveryMonitor));
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final java.util.concurrent.atomic.AtomicBoolean recoveryRequired = new java.util.concurrent.atomic.AtomicBoolean();
            AtomicBoolean recoveryRequired = new AtomicBoolean();

            try
            {
                StorageEngine storageEngine = mock(typeof(StorageEngine));
//JAVA TO C# CONVERTER WARNING: The original Java variable was marked 'final':
//ORIGINAL LINE: final org.neo4j.kernel.impl.transaction.log.entry.LogEntryReader<org.neo4j.kernel.impl.transaction.log.ReadableClosablePositionAwareChannel> reader = new org.neo4j.kernel.impl.transaction.log.entry.VersionAwareLogEntryReader<>();
                LogEntryReader <ReadableClosablePositionAwareChannel> reader = new VersionAwareLogEntryReader <ReadableClosablePositionAwareChannel>();
                LogTailScanner tailScanner = GetTailScanner(_logFiles, reader);

                TransactionMetadataCache metadataCache = new TransactionMetadataCache();
                LogicalTransactionStore  txStore       = new PhysicalLogicalTransactionStore(_logFiles, metadataCache, reader, _monitors, false);
                CorruptedLogsTruncator   logPruner     = new CorruptedLogsTruncator(_storeDir, _logFiles, FileSystemRule.get());
                life.add(new Recovery(new DefaultRecoveryServiceAnonymousInnerClass(this, storageEngine, tailScanner, _transactionIdStore, txStore, _versionRepository, NO_MONITOR, recoveryRequired)
                                      , logPruner, _schemaLife, monitor, SilentProgressReporter.INSTANCE, false));

                life.Start();

                InOrder order = inOrder(monitor);
                order.verify(monitor, times(1)).recoveryRequired(any(typeof(LogPosition)));
                order.verify(monitor, times(1)).recoveryCompleted(2);
                assertTrue(recoveryRequired.get());
            }
            finally
            {
                life.Shutdown();
            }
        }
예제 #8
0
        private LogCreator LogFile(params Entry[] entries)
        {
            return((logVersion, positions) =>
            {
                try
                {
                    AtomicLong lastTxId = new AtomicLong();
                    _logVersionRepository.CurrentLogVersion = logVersion;
                    LifeSupport logFileLife = new LifeSupport();
                    logFileLife.start();
                    logFileLife.add(_logFiles);
                    LogFile logFile = _logFiles.LogFile;
                    try
                    {
                        FlushablePositionAwareChannel writeChannel = logFile.Writer;
                        LogPositionMarker positionMarker = new LogPositionMarker();
                        LogEntryWriter writer = new LogEntryWriter(writeChannel);
                        foreach (Entry entry in entries)
                        {
                            LogPosition currentPosition = writeChannel.getCurrentPosition(positionMarker).newPosition();
                            positions.put(entry, currentPosition);
                            if (entry is StartEntry)
                            {
                                writer.writeStartEntry(0, 0, 0, 0, new sbyte[0]);
                            }
                            else if (entry is CommitEntry)
                            {
                                CommitEntry commitEntry = ( CommitEntry )entry;
                                writer.writeCommitEntry(commitEntry.TxId, 0);
                                lastTxId.set(commitEntry.TxId);
                            }
                            else if (entry is CheckPointEntry)
                            {
                                CheckPointEntry checkPointEntry = ( CheckPointEntry )entry;
                                Entry target = checkPointEntry.WithPositionOfEntry;
                                LogPosition logPosition = target != null?positions.get(target) : currentPosition;

                                Debug.Assert(logPosition != null, "No registered log position for " + target);
                                writer.writeCheckPointEntry(logPosition);
                            }
                            else if (entry is PositionEntry)
                            {
                                // Don't write anything, this entry is just for registering a position so that
                                // another CheckPointEntry can refer to it
                            }
                            else
                            {
                                throw new System.ArgumentException("Unknown entry " + entry);
                            }
                        }
                    }
                    finally
                    {
                        logFileLife.shutdown();
                    }
                }
                catch (IOException e)
                {
                    throw new UncheckedIOException(e);
                }
            });
        }