Skip to content

Commit

Permalink
Label index log internal recovery
Browse files Browse the repository at this point in the history
  • Loading branch information
burqen committed Sep 18, 2017
1 parent cb204b2 commit 00235f3
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 15 deletions.
Expand Up @@ -40,6 +40,7 @@
import org.neo4j.kernel.api.exceptions.schema.CreateConstraintFailureException;
import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.api.labelscan.LabelScanWriter;
import org.neo4j.kernel.api.labelscan.LoggingMonitor;
import org.neo4j.kernel.api.txstate.TransactionCountingStateVisitor;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.api.BatchTransactionApplier;
Expand Down Expand Up @@ -203,6 +204,7 @@ public RecordStorageEngine(

NeoStoreIndexStoreView neoStoreIndexStoreView = new NeoStoreIndexStoreView( lockService, neoStores );
Boolean readOnly = config.get( GraphDatabaseSettings.read_only ) && operationalMode == OperationalMode.single;
monitors.addMonitorListener( new LoggingMonitor( logProvider.getLog( NativeLabelScanStore.class ) ) );
labelScanStore = new NativeLabelScanStore( pageCache, storeDir, new FullLabelStream( neoStoreIndexStoreView ),
readOnly, monitors, recoveryCleanupWorkCollector );

Expand Down
56 changes: 41 additions & 15 deletions community/neo4j/src/test/java/recovery/RecoveryCleanupIT.java
Expand Up @@ -46,6 +46,7 @@
import org.neo4j.kernel.internal.DatabaseHealth;
import org.neo4j.kernel.internal.GraphDatabaseAPI;
import org.neo4j.kernel.monitoring.Monitors;
import org.neo4j.logging.AssertableLogProvider;
import org.neo4j.test.Barrier;
import org.neo4j.test.Race;
import org.neo4j.test.TestGraphDatabaseFactory;
Expand All @@ -69,12 +70,6 @@ public class RecoveryCleanupIT
public void setup()
{
storeDir = testDirectory.graphDbDir();

Monitors monitors = new Monitors();
recoveryCompleteBarrier = new Barrier.Control();
LabelScanStore.Monitor recoveryBarrierMonitor = new RecoveryBarrierMonitor( recoveryCompleteBarrier );
monitors.addMonitorListener( recoveryBarrierMonitor );
factory.setMonitors( monitors );
}

@After
Expand All @@ -91,17 +86,12 @@ public void recoveryCleanupShouldBlockCheckpoint() throws Throwable
AtomicReference<Throwable> error = new AtomicReference<>();
try
{
db = startDatabase();

DatabaseHealth databaseHealth = databaseHealth( db );
someData( db );
checkpoint( db );
someData( db );
databaseHealth.panic( new Throwable( "Trigger recovery on next startup" ) );
db.shutdown();
db = null;
dirtyDatabase();

// WHEN
recoveryCompleteBarrier = new Barrier.Control();
LabelScanStore.Monitor recoveryBarrierMonitor = new RecoveryBarrierMonitor( recoveryCompleteBarrier );
setMonitor( recoveryBarrierMonitor );
db = startDatabase();
recoveryCompleteBarrier.awaitUninterruptibly(); // Ensure we are mid recovery cleanup

Expand All @@ -123,6 +113,42 @@ public void recoveryCleanupShouldBlockCheckpoint() throws Throwable
}
}

@Test
public void scanStoreMustLogCrashPointerCleanupDuringRecovery() throws Exception
{
// given
dirtyDatabase();

// when
AssertableLogProvider logProvider = new AssertableLogProvider( true );
factory.setUserLogProvider( logProvider );
factory.setInternalLogProvider( logProvider );
startDatabase().shutdown();

// then
logProvider.assertContainsLogCallContaining( "Scan store recovery completed" );
}

private void setMonitor( Object monitor )
{
Monitors monitors = new Monitors();
monitors.addMonitorListener( monitor );
factory.setMonitors( monitors );
}

private void dirtyDatabase() throws IOException
{
db = startDatabase();

DatabaseHealth databaseHealth = databaseHealth( db );
someData( db );
checkpoint( db );
someData( db );
databaseHealth.panic( new Throwable( "Trigger recovery on next startup" ) );
db.shutdown();
db = null;
}

private void reportError( Race.ThrowingRunnable checkpoint, AtomicReference<Throwable> error )
{
try
Expand Down

0 comments on commit 00235f3

Please sign in to comment.