diff --git a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyServer.java b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyServer.java index 700b630eafb4b..184d921c0dc91 100644 --- a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyServer.java +++ b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyServer.java @@ -190,7 +190,7 @@ public RequestContext flushStoresAndStreamStoreFiles( String triggerName, StoreW { doWrite( writer, temporaryBuffer, file, recordSize, fileChannel, fileSize, storeCopyIdentifier ); } - return anonymous( lastAppliedTransaction ); + continue; } } } diff --git a/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java b/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java index 95831c82144ec..183325af4d9aa 100644 --- a/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java +++ b/enterprise/com/src/test/java/org/neo4j/com/storecopy/StoreCopyClientTest.java @@ -24,6 +24,10 @@ import org.junit.Test; import org.junit.rules.RuleChain; import org.junit.rules.TestRule; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; import java.io.File; import java.util.ArrayList; @@ -38,6 +42,7 @@ import org.neo4j.helpers.Service; import org.neo4j.helpers.collection.Iterators; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.pagecache.DelegatingPageCache; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.configuration.Config; @@ -75,6 +80,7 @@ import static org.neo4j.graphdb.Label.label; import static org.neo4j.graphdb.factory.GraphDatabaseSettings.record_format; +@RunWith( Parameterized.class ) public class StoreCopyClientTest { private final TestDirectory testDir = TestDirectory.testDirectory(); @@ -82,6 +88,15 @@ public class StoreCopyClientTest private final CleanupRule cleanup = new CleanupRule(); private final DefaultFileSystemRule fileSystemRule = new DefaultFileSystemRule(); + @Parameters + public static StoreCopyRequestFactory[] data() + { + return new StoreCopyRequestFactory[]{LocalStoreCopyRequester::new, LocalStoreCopyRequesterForcePageCache::new}; + } + + @Parameter + public StoreCopyRequestFactory requestFactory; + @Rule public TestRule rules = RuleChain.outerRule( testDir ).around( fileSystemRule ). around( pageCacheRule ).around( cleanup ); @@ -129,7 +144,7 @@ public void finishRecoveringStore() } StoreCopyClient.StoreCopyRequester storeCopyRequest = - spy( new LocalStoreCopyRequester( original, originalDir, fileSystem ) ); + spy( requestFactory.create( original, originalDir, fileSystem ) ); // when copier.copyStore( storeCopyRequest, cancelStoreCopy::get, MoveAfterCopy.moveReplaceExisting() ); @@ -175,7 +190,7 @@ copyDir, config, loadKernelExtensions(), NullLogProvider.getInstance(), fileSyst new StoreCopyClient.Monitor.Adapter(), false ); final GraphDatabaseAPI original = (GraphDatabaseAPI) startDatabase( originalDir, recordFormatsName ); - StoreCopyClient.StoreCopyRequester storeCopyRequest = new LocalStoreCopyRequester( original, originalDir, + StoreCopyClient.StoreCopyRequester storeCopyRequest = requestFactory.create( original, originalDir, fileSystem ); copier.copyStore( storeCopyRequest, CancellationRequest.NEVER_CANCELLED, MoveAfterCopy.moveReplaceExisting() ); @@ -219,7 +234,7 @@ public void finishReceivingStoreFiles() } StoreCopyClient.StoreCopyRequester storeCopyRequest = - spy( new LocalStoreCopyRequester( original, originalDir, fileSystem ) ); + spy( requestFactory.create( original, originalDir, fileSystem ) ); // when copier.copyStore( storeCopyRequest, cancelStoreCopy::get, MoveAfterCopy.moveReplaceExisting() ); @@ -259,7 +274,7 @@ public void shouldResetNeoStoreLastTransactionOffsetForNonForensicCopy() throws .getInstance(), fileSystem, pageCache, new StoreCopyClient.Monitor.Adapter(), false ); CancellationRequest falseCancellationRequest = () -> false; StoreCopyClient.StoreCopyRequester storeCopyRequest = - new LocalStoreCopyRequester( (GraphDatabaseAPI) initialDatabase, initialStore, fileSystem ); + requestFactory.create( (GraphDatabaseAPI) initialDatabase, initialStore, fileSystem ); // WHEN copier.copyStore( storeCopyRequest, falseCancellationRequest, MoveAfterCopy.moveReplaceExisting() ); @@ -352,6 +367,11 @@ private static List> loadKernelExtensions() return kernelExtensions; } + private interface StoreCopyRequestFactory + { + StoreCopyClient.StoreCopyRequester create( GraphDatabaseAPI original, File originalDir, FileSystemAbstraction fs ); + } + private static class LocalStoreCopyRequester implements StoreCopyClient.StoreCopyRequester { private final GraphDatabaseAPI original; @@ -367,6 +387,11 @@ private static class LocalStoreCopyRequester implements StoreCopyClient.StoreCop this.fs = fs; } + protected PageCache getPageCache() + { + return original.getDependencyResolver().resolveDependency( PageCache.class ); + } + @Override public Response copyStore( StoreWriter writer ) { @@ -382,8 +407,7 @@ public Response copyStore( StoreWriter writer ) CheckPointer checkPointer = original.getDependencyResolver().resolveDependency( CheckPointer.class ); - PageCache pageCache = - original.getDependencyResolver().resolveDependency( PageCache.class ); + PageCache pageCache = getPageCache(); RequestContext requestContext = new StoreCopyServer( neoStoreDataSource, checkPointer, fs, originalDir, new Monitors().newMonitor( StoreCopyServer.Monitor.class ), pageCache, @@ -409,4 +433,25 @@ public void done() verify( response, times( 1 ) ).close(); } } + + private static class LocalStoreCopyRequesterForcePageCache extends LocalStoreCopyRequester + { + LocalStoreCopyRequesterForcePageCache( GraphDatabaseAPI original, File originalDir, FileSystemAbstraction fs ) + { + super( original, originalDir, fs ); + } + + @Override + protected PageCache getPageCache() + { + return new DelegatingPageCache( super.getPageCache() ) + { + @Override + public boolean fileSystemSupportsFileOperations() + { + return false; + } + }; + } + } }