diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index 71d92f11a7ee..917143ed0b12 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -738,7 +738,7 @@ private void buildRecovery( final LatestCheckPointFinder checkPointFinder = new LatestCheckPointFinder( logFiles, fileSystemAbstraction, logEntryReader ); Recovery.SPI spi = new DefaultRecoverySPI( - storageEngine, logFiles, fileSystemAbstraction, logVersionRepository, + storageEngine, logVersionRepository, checkPointFinder, transactionIdStore, logicalTransactionStore ); Recovery recovery = new Recovery( spi, recoveryMonitor ); monitors.addMonitorListener( new Recovery.Monitor() diff --git a/community/kernel/src/main/java/org/neo4j/kernel/recovery/DefaultRecoverySPI.java b/community/kernel/src/main/java/org/neo4j/kernel/recovery/DefaultRecoverySPI.java index cfa45c29ff26..e7a978633c63 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/recovery/DefaultRecoverySPI.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/recovery/DefaultRecoverySPI.java @@ -22,7 +22,6 @@ import java.io.IOException; import org.neo4j.helpers.collection.Visitor; -import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.IOLimiter; import org.neo4j.kernel.impl.api.TransactionQueue; import org.neo4j.kernel.impl.api.TransactionToApply; @@ -31,7 +30,6 @@ import org.neo4j.kernel.impl.transaction.log.LogPosition; import org.neo4j.kernel.impl.transaction.log.LogVersionRepository; import org.neo4j.kernel.impl.transaction.log.LogicalTransactionStore; -import org.neo4j.kernel.impl.transaction.log.PhysicalLogFiles; import org.neo4j.kernel.impl.transaction.log.TransactionCursor; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; import org.neo4j.kernel.impl.transaction.log.entry.LogEntryStart; @@ -40,26 +38,22 @@ import static org.neo4j.kernel.impl.transaction.log.Commitment.NO_COMMITMENT; import static org.neo4j.storageengine.api.TransactionApplicationMode.RECOVERY; -public class DefaultRecoverySPI implements Recovery.SPI, Visitor +public class DefaultRecoverySPI implements Recovery.SPI { - private final PhysicalLogFiles logFiles; - private final FileSystemAbstraction fileSystemAbstraction; private final LogVersionRepository logVersionRepository; private final PositionToRecoverFrom positionToRecoverFrom; private final StorageEngine storageEngine; private final TransactionIdStore transactionIdStore; private final LogicalTransactionStore logicalTransactionStore; + private Visitor recoveryVisitor; private TransactionQueue transactionsToApply; public DefaultRecoverySPI( StorageEngine storageEngine, - PhysicalLogFiles logFiles, FileSystemAbstraction fileSystemAbstraction, LogVersionRepository logVersionRepository, LatestCheckPointFinder checkPointFinder, TransactionIdStore transactionIdStore, LogicalTransactionStore logicalTransactionStore ) { this.storageEngine = storageEngine; - this.logFiles = logFiles; - this.fileSystemAbstraction = fileSystemAbstraction; this.logVersionRepository = logVersionRepository; this.transactionIdStore = transactionIdStore; this.logicalTransactionStore = logicalTransactionStore; @@ -80,7 +74,7 @@ public LogPosition getPositionToRecoverFrom() throws IOException } @Override - public Visitor getRecoveryVisitor() + public Visitor startRecovery() { // Calling this method means that recovery is required, tell storage engine about it // This method will be called before recovery actually starts and so will ensure that @@ -90,8 +84,9 @@ public Visitor getRecoveryVisitor( storageEngine.prepareForRecoveryRequired(); transactionsToApply = new TransactionQueue( 10_000, (first,last) -> storageEngine.apply( first, RECOVERY ) ); + recoveryVisitor = new RecoveryVisitor( transactionsToApply ); - return this; + return recoveryVisitor; } @Override @@ -114,14 +109,24 @@ public void allTransactionsRecovered( CommittedTransactionRepresentation lastRec // TODO: Also truncate last log after last known position } - @Override - public boolean visit( CommittedTransactionRepresentation transaction ) throws Exception + static class RecoveryVisitor implements Visitor { - TransactionRepresentation txRepresentation = transaction.getTransactionRepresentation(); - long txId = transaction.getCommitEntry().getTxId(); - TransactionToApply tx = new TransactionToApply( txRepresentation, txId ); - tx.commitment( NO_COMMITMENT, txId ); - transactionsToApply.queue( tx ); - return false; + private final TransactionQueue transactionsToApply; + + public RecoveryVisitor( TransactionQueue transactionsToApply ) + { + this.transactionsToApply = transactionsToApply; + } + + @Override + public boolean visit( CommittedTransactionRepresentation transaction ) throws Exception + { + TransactionRepresentation txRepresentation = transaction.getTransactionRepresentation(); + long txId = transaction.getCommitEntry().getTxId(); + TransactionToApply tx = new TransactionToApply( txRepresentation, txId ); + tx.commitment( NO_COMMITMENT, txId ); + transactionsToApply.queue( tx ); + return false; + } } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/recovery/Recovery.java b/community/kernel/src/main/java/org/neo4j/kernel/recovery/Recovery.java index 2fac97c0d1a5..1ab0498b253a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/recovery/Recovery.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/recovery/Recovery.java @@ -56,7 +56,7 @@ public interface SPI LogPosition getPositionToRecoverFrom() throws IOException; - Visitor getRecoveryVisitor(); + Visitor startRecovery(); void allTransactionsRecovered( CommittedTransactionRepresentation lastRecoveredTransaction, LogPosition positionAfterLastRecoveredTransaction ) throws Exception; @@ -87,7 +87,7 @@ public void init() throws Throwable LogPosition recoveryToPosition; CommittedTransactionRepresentation lastTransaction = null; - Visitor recoveryVisitor = spi.getRecoveryVisitor(); + Visitor recoveryVisitor = spi.startRecovery(); try ( TransactionCursor transactionsToRecover = spi.getTransactions( recoveryFromPosition ) ) { while ( transactionsToRecover.next() ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/RecoveryTest.java b/community/kernel/src/test/java/org/neo4j/kernel/RecoveryTest.java index 95714a5fa51c..f511c3568687 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/RecoveryTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/RecoveryTest.java @@ -150,15 +150,15 @@ public boolean visit( Pair> pair ) th LogicalTransactionStore txStore = new PhysicalLogicalTransactionStore( logFile, metadataCache, reader ); life.add( new Recovery( new DefaultRecoverySPI( storageEngine, - logFiles, fs, logVersionRepository, finder, transactionIdStore, txStore ) + logVersionRepository, finder, transactionIdStore, txStore ) { private int nr = 0; @Override - public Visitor getRecoveryVisitor() + public Visitor startRecovery() { recoveryRequired.set( true ); - final Visitor actual = super.getRecoveryVisitor(); + final Visitor actual = super.startRecovery(); return new Visitor() { @Override @@ -240,10 +240,10 @@ public boolean visit( Pair> pair ) th LogicalTransactionStore txStore = new PhysicalLogicalTransactionStore( logFile, metadataCache, reader ); life.add( new Recovery( new DefaultRecoverySPI( storageEngine, - logFiles, fs, logVersionRepository, finder, transactionIdStore, txStore ) + logVersionRepository, finder, transactionIdStore, txStore ) { @Override - public Visitor getRecoveryVisitor() + public Visitor startRecovery() { fail( "Recovery should not be required" ); return null; // <-- to satisfy the compiler diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/log/PhysicalLogicalTransactionStoreTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/log/PhysicalLogicalTransactionStoreTest.java index 014159393069..c8ccdb70b1d7 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/log/PhysicalLogicalTransactionStoreTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/log/PhysicalLogicalTransactionStoreTest.java @@ -154,7 +154,7 @@ public void forceEverything() } @Override - public Visitor getRecoveryVisitor() + public Visitor startRecovery() { recoveryRequired.set( true ); return visitor;