diff --git a/community/command-line/src/main/java/org/neo4j/commandline/Util.java b/community/command-line/src/main/java/org/neo4j/commandline/Util.java index d70720ce0aa4b..919e1fe37b7a6 100644 --- a/community/command-line/src/main/java/org/neo4j/commandline/Util.java +++ b/community/command-line/src/main/java/org/neo4j/commandline/Util.java @@ -30,6 +30,7 @@ import org.neo4j.commandline.admin.CommandFailed; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.kernel.internal.locker.GlobalStoreLocker; import org.neo4j.kernel.internal.locker.StoreLocker; @@ -78,10 +79,10 @@ public static boolean isSameOrChildPath( Path parent, Path candidate ) return normalizedCandidate.startsWith( normalizedParent ); } - public static void checkLock( Path databaseDirectory ) throws CommandFailed + public static void checkLock( StoreLayout storeLayout ) throws CommandFailed { try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); - StoreLocker storeLocker = new GlobalStoreLocker( fileSystem, databaseDirectory.getParent().toFile() ) ) + StoreLocker storeLocker = new GlobalStoreLocker( fileSystem, storeLayout ) ) { storeLocker.checkLock(); } diff --git a/community/community-it/it-test-support/src/main/java/org/neo4j/test/ImpermanentGraphDatabase.java b/community/community-it/it-test-support/src/main/java/org/neo4j/test/ImpermanentGraphDatabase.java index b9335d44c97ff..1fc0d83638bf1 100644 --- a/community/community-it/it-test-support/src/main/java/org/neo4j/test/ImpermanentGraphDatabase.java +++ b/community/community-it/it-test-support/src/main/java/org/neo4j/test/ImpermanentGraphDatabase.java @@ -195,7 +195,7 @@ public ImpermanentPlatformModule( File storeDir, Config config, DatabaseInfo dat @Override protected StoreLocker createStoreLocker() { - return new StoreLocker( fileSystem, storeLayout.storeDirectory() ); + return new StoreLocker( fileSystem, storeLayout ); } @Override diff --git a/community/community-it/it-test-support/src/main/java/org/neo4j/test/TestGraphDatabaseFactory.java b/community/community-it/it-test-support/src/main/java/org/neo4j/test/TestGraphDatabaseFactory.java index b30e221d71017..3d125af328f22 100644 --- a/community/community-it/it-test-support/src/main/java/org/neo4j/test/TestGraphDatabaseFactory.java +++ b/community/community-it/it-test-support/src/main/java/org/neo4j/test/TestGraphDatabaseFactory.java @@ -350,7 +350,7 @@ protected FileSystemAbstraction createNewFileSystem() @Override protected StoreLocker createStoreLocker() { - return new StoreLocker( fileSystem, storeLayout.storeDirectory() ); + return new StoreLocker( fileSystem, storeLayout ); } } } diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/internal/StoreLockerTest.java b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/internal/StoreLockerTest.java index 2e63dad922c67..4911435d2c47d 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/internal/StoreLockerTest.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/kernel/internal/StoreLockerTest.java @@ -35,6 +35,7 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.OpenMode; import org.neo4j.io.fs.StoreChannel; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.test.TestGraphDatabaseFactory; @@ -47,7 +48,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; -import static org.neo4j.kernel.internal.locker.StoreLocker.STORE_LOCK_FILENAME; public class StoreLockerTest { @@ -63,7 +63,7 @@ public void shouldUseAlreadyOpenedFileChannel() throws Exception CustomChannelFileSystemAbstraction fileSystemAbstraction = new CustomChannelFileSystemAbstraction( fileSystemRule.get(), channel ); int numberOfCallesToOpen = 0; - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.directory( "unused" ) ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { try { @@ -91,7 +91,7 @@ public void shouldUseAlreadyOpenedFileChannel() throws Exception @Test public void shouldAllowMultipleCallsToCheckLock() throws Exception { - try ( StoreLocker storeLocker = new StoreLocker( fileSystemRule.get(), target.directory( "unused" ) ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemRule.get(), target.storeLayout() ) ) { storeLocker.checkLock(); storeLocker.checkLock(); @@ -101,12 +101,12 @@ public void shouldAllowMultipleCallsToCheckLock() throws Exception @Test public void keepLockWhenOtherTryToTakeLock() throws Exception { - File directory = target.directory( "unused" ); + StoreLayout storeLayout = target.storeLayout(); DefaultFileSystemAbstraction fileSystemAbstraction = fileSystemRule.get(); - StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, directory ); + StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeLayout ); storeLocker.checkLock(); - try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, directory ) ) + try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker1.checkLock(); fail(); @@ -117,7 +117,7 @@ public void keepLockWhenOtherTryToTakeLock() throws Exception } // Initial locker should still have a valid lock - try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, directory ) ) + try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker1.checkLock(); fail(); @@ -142,7 +142,7 @@ public boolean fileExists( File fileName ) } }; - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.directory( "unused" ) ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { storeLocker.checkLock(); @@ -166,7 +166,7 @@ public boolean fileExists( File fileName ) } }; - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.directory( "unused" ) ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { storeLocker.checkLock(); // Ok @@ -191,9 +191,8 @@ public boolean fileExists( File fileName ) } }; - File storeDir = target.directory( "unused" ); - - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeDir ) ) + StoreLayout storeLayout = target.storeLayout(); + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker.checkLock(); fail(); @@ -202,7 +201,7 @@ public boolean fileExists( File fileName ) { String msg = format( "Unable to create path for store dir: %s. " + "Please ensure no other process is using this database, and that " + - "the directory is writable (required even for read-only access)", storeDir ); + "the directory is writable (required even for read-only access)", storeLayout ); assertThat( e.getMessage(), is( msg ) ); } } @@ -225,9 +224,9 @@ public boolean fileExists( File fileName ) } }; - File storeDir = target.directory( "unused" ); + StoreLayout storeLayout = target.storeLayout(); - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeDir ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker.checkLock(); fail(); @@ -237,7 +236,7 @@ public boolean fileExists( File fileName ) String msg = format( "Unable to obtain lock on store lock file: %s. " + "Please ensure no other process is using this database, and that the " + "directory is writable (required even for read-only access)", - new File( storeDir, STORE_LOCK_FILENAME ) ); + storeLayout.storeLockFile() ); assertThat( e.getMessage(), is( msg ) ); } } @@ -267,7 +266,7 @@ public FileLock tryLock() } }; - try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.directory( "unused" ) ) ) + try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { storeLocker.checkLock(); fail(); diff --git a/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImplTest.java b/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImplTest.java index a3c913fb5aac5..8b28426a9c072 100644 --- a/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImplTest.java +++ b/community/community-it/kernel-it/src/test/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImplTest.java @@ -24,12 +24,13 @@ import org.junit.rules.ExpectedException; import org.junit.rules.RuleChain; -import java.io.File; import java.io.IOException; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.io.pagecache.PageCache; import org.neo4j.io.pagecache.impl.muninn.MuninnPageCache; import org.neo4j.kernel.StoreLockException; @@ -77,13 +78,13 @@ public void testHonorsPassedInParams() throws Exception public void testCreatesStoreLockFile() throws Exception { // Given - File file = testDirectory.databaseDir(); + DatabaseLayout databaseLayout = testDirectory.databaseLayout(); // When - BatchInserter inserter = BatchInserters.inserter( file.getAbsoluteFile(), fileSystemRule.get() ); + BatchInserter inserter = BatchInserters.inserter( databaseLayout.databaseDirectory(), fileSystemRule.get() ); // Then - assertThat( new File( file, StoreLocker.STORE_LOCK_FILENAME ).exists(), equalTo( true ) ); + assertThat( databaseLayout.getStoreLayout().storeLockFile().exists(), equalTo( true ) ); inserter.shutdown(); } @@ -91,9 +92,9 @@ public void testCreatesStoreLockFile() throws Exception public void testFailsOnExistingStoreLockFile() throws IOException { // Given - File parent = testDirectory.databaseDir(); + StoreLayout storeLayout = testDirectory.storeLayout(); try ( FileSystemAbstraction fileSystemAbstraction = new DefaultFileSystemAbstraction(); - StoreLocker lock = new StoreLocker( fileSystemAbstraction, parent ) ) + StoreLocker lock = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { lock.checkLock(); @@ -101,7 +102,7 @@ public void testFailsOnExistingStoreLockFile() throws IOException expected.expect( StoreLockException.class ); expected.expectMessage( "Unable to obtain lock on store lock file" ); // When - BatchInserters.inserter( parent.getAbsoluteFile(), fileSystemAbstraction ); + BatchInserters.inserter( storeLayout.databaseLayout( "any" ).databaseDirectory(), fileSystemAbstraction ); } } } diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java index ada32191b3318..0effeca56ebd1 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java @@ -20,6 +20,7 @@ package org.neo4j.commandline.dbms; import java.io.Closeable; +import java.io.File; import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; @@ -32,13 +33,12 @@ import org.neo4j.commandline.admin.CommandFailed; import org.neo4j.commandline.admin.IncorrectUsage; import org.neo4j.commandline.arguments.Arguments; -import org.neo4j.commandline.arguments.common.Database; import org.neo4j.dbms.archive.Dumper; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.io.layout.DatabaseLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.util.Validators; -import org.neo4j.kernel.internal.locker.StoreLocker; import static java.lang.String.format; import static org.neo4j.commandline.Util.canonicalPath; @@ -72,6 +72,7 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed Config config = buildConfig( database ); Path databaseDirectory = canonicalPath( getDatabaseDirectory( config ) ); + DatabaseLayout databaseLayout = DatabaseLayout.of( databaseDirectory.toFile() ); Path transactionLogsDirectory = canonicalPath( getTransactionalLogsDirectory( config ) ); try @@ -83,9 +84,9 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed throw new CommandFailed( "database does not exist: " + database, e ); } - try ( Closeable ignored = StoreLockChecker.check( databaseDirectory ) ) + try ( Closeable ignored = StoreLockChecker.check( databaseLayout.getStoreLayout() ) ) { - dump( database, databaseDirectory, transactionLogsDirectory, archive ); + dump( database, databaseLayout, transactionLogsDirectory, archive ); } catch ( StoreLockException e ) { @@ -101,12 +102,12 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed } } - private Path getDatabaseDirectory( Config config ) + private static Path getDatabaseDirectory( Config config ) { return config.get( database_path ).toPath(); } - private Path getTransactionalLogsDirectory( Config config ) + private static Path getTransactionalLogsDirectory( Config config ) { return config.get( logical_logs_location ).toPath(); } @@ -120,17 +121,19 @@ private Config buildConfig( String databaseName ) .build(); } - private Path calculateArchive( String database, Path to ) + private static Path calculateArchive( String database, Path to ) { return Files.isDirectory( to ) ? to.resolve( database + ".dump" ) : to; } - private void dump( String database, Path databaseDirectory, Path transactionalLogsDirectory, Path archive ) + private void dump( String database, DatabaseLayout databaseLayout, Path transactionalLogsDirectory, Path archive ) throws CommandFailed { + Path databasePath = databaseLayout.databaseDirectory().toPath(); try { - dumper.dump( databaseDirectory, transactionalLogsDirectory, archive, this::isStoreLock ); + File storeLockFile = databaseLayout.getStoreLayout().storeLockFile(); + dumper.dump( databasePath, transactionalLogsDirectory, archive, path -> Objects.equals( path.getFileName().toString(), storeLockFile.getName() ) ); } catch ( FileAlreadyExistsException e ) { @@ -138,7 +141,7 @@ private void dump( String database, Path databaseDirectory, Path transactionalLo } catch ( NoSuchFileException e ) { - if ( Paths.get( e.getMessage() ).toAbsolutePath().equals( databaseDirectory.toAbsolutePath() ) ) + if ( Paths.get( e.getMessage() ).toAbsolutePath().equals( databasePath ) ) { throw new CommandFailed( "database does not exist: " + database, e ); } @@ -150,11 +153,6 @@ private void dump( String database, Path databaseDirectory, Path transactionalLo } } - private boolean isStoreLock( Path path ) - { - return Objects.equals( path.getFileName().toString(), StoreLocker.STORE_LOCK_FILENAME ); - } - private void wrapIOException( IOException e ) throws CommandFailed { throw new CommandFailed( diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java index 37a9e8370f89f..f76e9b7183ad2 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/LoadCommand.java @@ -31,12 +31,12 @@ import org.neo4j.commandline.admin.IncorrectUsage; import org.neo4j.commandline.arguments.Arguments; import org.neo4j.commandline.arguments.OptionalBooleanArg; -import org.neo4j.commandline.arguments.common.Database; import org.neo4j.commandline.arguments.common.MandatoryCanonicalPath; import org.neo4j.dbms.archive.IncorrectFormat; import org.neo4j.dbms.archive.Loader; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.io.fs.FileUtils; +import org.neo4j.io.layout.DatabaseLayout; import org.neo4j.kernel.configuration.Config; import static java.util.Objects.requireNonNull; @@ -112,7 +112,7 @@ private void deleteIfNecessary( Path databaseDirectory, Path transactionLogsDire { if ( force ) { - checkLock( databaseDirectory ); + checkLock( DatabaseLayout.of( databaseDirectory.toFile() ).getStoreLayout() ); FileUtils.deletePathRecursively( databaseDirectory ); if ( !isSameOrChildPath( databaseDirectory, transactionLogsDirectory ) ) { diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/StoreLockChecker.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/StoreLockChecker.java index ca46a1370fd88..d91036786b46b 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/StoreLockChecker.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/StoreLockChecker.java @@ -20,7 +20,6 @@ package org.neo4j.commandline.dbms; import java.io.Closeable; -import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -28,6 +27,7 @@ import org.neo4j.io.IOUtils; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.kernel.internal.locker.GlobalStoreLocker; import org.neo4j.kernel.internal.locker.StoreLocker; @@ -38,29 +38,29 @@ class StoreLockChecker implements Closeable private final FileSystemAbstraction fileSystem; private final StoreLocker storeLocker; - private StoreLockChecker( FileSystemAbstraction fileSystem, File storeDirectory ) + private StoreLockChecker( FileSystemAbstraction fileSystem, StoreLayout storeLayout ) { this.fileSystem = fileSystem; - this.storeLocker = new GlobalStoreLocker( fileSystem, storeDirectory ); + this.storeLocker = new GlobalStoreLocker( fileSystem, storeLayout ); } /** - * Create store lock checker with lock on a provided path if it exists and writable - * @param databaseDirectory database path + * Create store lock checker with lock on a provided store layout if it exists and writable + * @param storeLayout store layout to check * @return lock checker or empty closeable in case if path does not exists or is not writable * @throws CannotWriteException * * @see StoreLocker * @see Files */ - static Closeable check( Path databaseDirectory ) throws CannotWriteException + static Closeable check( StoreLayout storeLayout ) throws CannotWriteException { - Path lockFile = databaseDirectory.resolve( StoreLocker.STORE_LOCK_FILENAME ); + Path lockFile = storeLayout.storeLockFile().toPath(); if ( Files.exists( lockFile ) ) { if ( Files.isWritable( lockFile ) ) { - StoreLockChecker storeLocker = new StoreLockChecker( new DefaultFileSystemAbstraction(), databaseDirectory.toFile() ); + StoreLockChecker storeLocker = new StoreLockChecker( new DefaultFileSystemAbstraction(), storeLayout ); try { storeLocker.checkLock(); diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java index 9335c752288cf..a79d4104f4e04 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java @@ -46,6 +46,8 @@ import org.neo4j.graphdb.config.Setting; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.storemigration.StoreFileType; @@ -182,9 +184,9 @@ void shouldNotCalculateTheArchiveNameIfPassedAnExistingFile() void shouldRespectTheStoreLock() throws Exception { Path databaseDirectory = homeDir.resolve( "data/databases/foo.db" ); - + StoreLayout storeLayout = DatabaseLayout.of( databaseDirectory.toFile() ).getStoreLayout(); try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); - StoreLocker storeLocker = new StoreLocker( fileSystem, databaseDirectory.toFile() ) ) + StoreLocker storeLocker = new StoreLocker( fileSystem, storeLayout ) ) { storeLocker.checkLock(); @@ -227,13 +229,13 @@ void shouldNotAccidentallyCreateTheDatabaseDirectoryAsASideEffectOfStoreLocking( @DisabledOnOs( OS.WINDOWS ) void shouldReportAHelpfulErrorIfWeDontHaveWritePermissionsForLock() throws Exception { + StoreLayout storeLayout = DatabaseLayout.of( databaseDirectory.toFile() ).getStoreLayout(); try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); - StoreLocker storeLocker = new StoreLocker( fileSystem, databaseDirectory.toFile() ) ) + StoreLocker storeLocker = new StoreLocker( fileSystem, storeLayout ) ) { storeLocker.checkLock(); - try ( Closeable ignored = withPermissions( databaseDirectory.resolve( StoreLocker.STORE_LOCK_FILENAME ), - emptySet() ) ) + try ( Closeable ignored = withPermissions( storeLayout.storeLockFile().toPath(), emptySet() ) ) { CommandFailed commandFailed = assertThrows( CommandFailed.class, () -> execute( "foo.db" ) ); assertEquals( commandFailed.getMessage(), "you do not have permission to dump the database -- is Neo4j running as a different user?" ); @@ -245,10 +247,11 @@ void shouldReportAHelpfulErrorIfWeDontHaveWritePermissionsForLock() throws Excep void shouldExcludeTheStoreLockFromTheArchiveToAvoidProblemsWithReadingLockedFilesOnWindows() throws Exception { + File lockFile = StoreLayout.of( new File( "." ) ).storeLockFile(); doAnswer( invocation -> { Predicate exclude = invocation.getArgument( 3 ); - assertThat( exclude.test( Paths.get( StoreLocker.STORE_LOCK_FILENAME ) ), is( true ) ); + assertThat( exclude.test( Paths.get( lockFile.getName() ) ), is( true ) ); assertThat( exclude.test( Paths.get( "some-other-file" ) ), is( false ) ); return null; } ).when( dumper ).dump(any(), any(), any(), any() ); @@ -349,7 +352,7 @@ private void execute( final String database ) throws IncorrectUsage, CommandFail private static void assertCanLockStore( Path databaseDirectory ) throws IOException { try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); - StoreLocker storeLocker = new StoreLocker( fileSystem, databaseDirectory.toFile() ) ) + StoreLocker storeLocker = new StoreLocker( fileSystem, DatabaseLayout.of( databaseDirectory.toFile() ).getStoreLayout() ) ) { storeLocker.checkLock(); } diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java index 1a8e9434c1aec..bc1b4eb76ab3b 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java @@ -48,6 +48,8 @@ import org.neo4j.helpers.ArrayUtil; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.test.extension.Inject; @@ -196,9 +198,10 @@ void shouldRespectTheStoreLock() throws IOException { Path databaseDirectory = homeDir.resolve( "data/databases/foo.db" ); Files.createDirectories( databaseDirectory ); + StoreLayout storeLayout = DatabaseLayout.of( databaseDirectory.toFile() ).getStoreLayout(); try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); - StoreLocker locker = new StoreLocker( fileSystem, databaseDirectory.getParent().toFile() ) ) + StoreLocker locker = new StoreLocker( fileSystem, storeLayout ) ) { locker.checkLock(); CommandFailed commandFailed = assertThrows( CommandFailed.class, () -> execute( "foo.db", "--force" ) ); diff --git a/community/io/src/main/java/org/neo4j/io/layout/DatabaseLayout.java b/community/io/src/main/java/org/neo4j/io/layout/DatabaseLayout.java index 1f02ee0d45b0f..1dc91f3cf4ca3 100644 --- a/community/io/src/main/java/org/neo4j/io/layout/DatabaseLayout.java +++ b/community/io/src/main/java/org/neo4j/io/layout/DatabaseLayout.java @@ -37,12 +37,12 @@ public static DatabaseLayout of( StoreLayout storeLayout, String databaseName ) public static DatabaseLayout of( File databaseDirectory ) { - return new DatabaseLayout( new StoreLayout( databaseDirectory.getParentFile() ), databaseDirectory.getName() ); + return new DatabaseLayout( StoreLayout.of( databaseDirectory.getParentFile() ), databaseDirectory.getName() ); } public static DatabaseLayout of( File rootDirectory, String databaseName ) { - return new DatabaseLayout( new StoreLayout( rootDirectory ), databaseName ); + return new DatabaseLayout( StoreLayout.of( rootDirectory ), databaseName ); } private DatabaseLayout( StoreLayout storeLayout, String databaseName ) @@ -57,9 +57,9 @@ public String getDatabaseName() return databaseName; } - public File getStoreDirectory() + public StoreLayout getStoreLayout() { - return storeLayout.storeDirectory(); + return storeLayout; } public File databaseDirectory() diff --git a/community/io/src/main/java/org/neo4j/io/layout/StoreLayout.java b/community/io/src/main/java/org/neo4j/io/layout/StoreLayout.java index e2ab7c9bd791b..4283d543b5ff4 100644 --- a/community/io/src/main/java/org/neo4j/io/layout/StoreLayout.java +++ b/community/io/src/main/java/org/neo4j/io/layout/StoreLayout.java @@ -23,13 +23,25 @@ public class StoreLayout { + private static final String STORE_LOCK_FILENAME = "store_lock"; + private final File storeDirectory; - public StoreLayout( File rootStoreDirectory ) + public static StoreLayout of( File storeDirectory ) + { + return new StoreLayout( storeDirectory ); + } + + private StoreLayout( File rootStoreDirectory ) { this.storeDirectory = rootStoreDirectory; } + public DatabaseLayout databaseLayout( String databaseName ) + { + return DatabaseLayout.of( storeDirectory, databaseName ); + } + /** * Databases root directory where all databases are located. * @return all databases root directory @@ -39,8 +51,14 @@ public File storeDirectory() return storeDirectory; } - public DatabaseLayout databaseLayout( String databaseName ) + public File storeLockFile() { - return DatabaseLayout.of( storeDirectory, databaseName ); + return new File( storeDirectory, STORE_LOCK_FILENAME ); + } + + @Override + public String toString() + { + return String.valueOf( storeDirectory ); } } diff --git a/community/io/src/test/java/org/neo4j/test/rule/TestDirectory.java b/community/io/src/test/java/org/neo4j/test/rule/TestDirectory.java index cb7a1d2a9df42..0ae5ae53e170a 100644 --- a/community/io/src/test/java/org/neo4j/test/rule/TestDirectory.java +++ b/community/io/src/test/java/org/neo4j/test/rule/TestDirectory.java @@ -165,6 +165,11 @@ public File databaseDir() return databaseLayout().databaseDirectory(); } + public StoreLayout storeLayout() + { + return storeLayout; + } + public DatabaseLayout databaseLayout() { createDirectory( defaultDatabaseLayout.databaseDirectory() ); @@ -173,7 +178,7 @@ public DatabaseLayout databaseLayout() public DatabaseLayout databaseLayout( File storeDir ) { - DatabaseLayout databaseLayout = new StoreLayout( storeDir ).databaseLayout( DEFAULT_DATABASE_DIRECTORY ); + DatabaseLayout databaseLayout = StoreLayout.of( storeDir ).databaseLayout( DEFAULT_DATABASE_DIRECTORY ); createDirectory( defaultDatabaseLayout.databaseDirectory() ); return databaseLayout; } @@ -253,7 +258,7 @@ public void prepareDirectory( Class testClass, String test ) throws IOExcepti test = "static"; } testDirectory = prepareDirectoryForTest( test ); - storeLayout = new StoreLayout( testDirectory ); + storeLayout = StoreLayout.of( testDirectory ); defaultDatabaseLayout = storeLayout.databaseLayout( DEFAULT_DATABASE_DIRECTORY ); } diff --git a/community/jmx/src/main/java/org/neo4j/jmx/impl/StoreFileBean.java b/community/jmx/src/main/java/org/neo4j/jmx/impl/StoreFileBean.java index 96a29a67a2253..7f69295f9fccb 100644 --- a/community/jmx/src/main/java/org/neo4j/jmx/impl/StoreFileBean.java +++ b/community/jmx/src/main/java/org/neo4j/jmx/impl/StoreFileBean.java @@ -20,7 +20,6 @@ package org.neo4j.jmx.impl; import java.io.File; -import java.io.IOException; import javax.management.NotCompliantMBeanException; import org.neo4j.helpers.Service; @@ -95,15 +94,7 @@ public void unregistered( NeoStoreDataSource ds ) private File resolvePath( NeoStoreDataSource ds ) { - File databasesDirectory = ds.getDatabaseLayout().getStoreDirectory(); - try - { - return databasesDirectory.getCanonicalFile().getAbsoluteFile(); - } - catch ( IOException e ) - { - return databasesDirectory.getAbsoluteFile(); - } + return ds.getDatabaseLayout().getStoreLayout().storeDirectory(); } } ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/transaction/log/files/LogFilesBuilder.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/transaction/log/files/LogFilesBuilder.java index 1423019a5ce2d..90cad94201be3 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/transaction/log/files/LogFilesBuilder.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/transaction/log/files/LogFilesBuilder.java @@ -192,7 +192,7 @@ private File getLogsDirectory() File neo4jHome = config.get( GraphDatabaseSettings.neo4j_home ); File databasePath = config.get( database_path ); File logicalLogsLocation = config.get( GraphDatabaseSettings.logical_logs_location ); - if ( databaseLayout.getStoreDirectory().equals( neo4jHome ) && databasePath.equals( logicalLogsLocation ) ) + if ( databaseLayout.getStoreLayout().equals( neo4jHome ) && databasePath.equals( logicalLogsLocation ) ) { return databaseLayout.databaseDirectory(); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/GlobalStoreLocker.java b/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/GlobalStoreLocker.java index 0afe6128837c9..413beda07a3ae 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/GlobalStoreLocker.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/GlobalStoreLocker.java @@ -27,6 +27,7 @@ import java.util.concurrent.ConcurrentHashMap; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; /** @@ -49,9 +50,9 @@ public class GlobalStoreLocker extends StoreLocker { private static final Set lockedFiles = Collections.newSetFromMap( new ConcurrentHashMap<>() ); - public GlobalStoreLocker( FileSystemAbstraction fileSystemAbstraction, File storeDirectory ) + public GlobalStoreLocker( FileSystemAbstraction fileSystemAbstraction, StoreLayout storeLayout ) { - super( fileSystemAbstraction, storeDirectory ); + super( fileSystemAbstraction, storeLayout ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/StoreLocker.java b/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/StoreLocker.java index 48afe98c6f065..044a6634cfdc4 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/StoreLocker.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/internal/locker/StoreLocker.java @@ -28,26 +28,25 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.OpenMode; import org.neo4j.io.fs.StoreChannel; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; /** - * The class takes a lock on the {@link #STORE_LOCK_FILENAME} file. The lock is valid after a successful call to + * The class takes a lock on store described by provided instance of {@link StoreLayout}. The lock is valid after a successful call to * {@link #checkLock()} until a call to {@link #close()}. */ public class StoreLocker implements Closeable { - public static final String STORE_LOCK_FILENAME = "store_lock"; - final FileSystemAbstraction fileSystemAbstraction; final File storeLockFile; FileLock storeLockFileLock; private StoreChannel storeLockFileChannel; - public StoreLocker( FileSystemAbstraction fileSystemAbstraction, File storeDirectory ) + public StoreLocker( FileSystemAbstraction fileSystemAbstraction, StoreLayout storeLayout ) { this.fileSystemAbstraction = fileSystemAbstraction; - storeLockFile = new File( storeDirectory, STORE_LOCK_FILENAME ); + storeLockFile = storeLayout.storeLockFile(); } /** diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java index 4919fc6de72c6..c05122f466c1c 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java @@ -183,7 +183,7 @@ public class BatchInserterImpl implements BatchInserter, IndexConfigStoreProvide private final LifeSupport life; private final NeoStores neoStores; private final IndexConfigStore indexStore; - private final DatabaseLayout directoryStructure; + private final DatabaseLayout databaseLayout; private final TokenHolders tokenHolders; private final IdGeneratorFactory idGeneratorFactory; private final IndexProviderMap indexProviderMap; @@ -246,7 +246,7 @@ public BatchInserterImpl( final File databaseDirectory, final FileSystemAbstract this.fileSystem = fileSystem; life = new LifeSupport(); - this.directoryStructure = DatabaseLayout.of( databaseDirectory ); + this.databaseLayout = DatabaseLayout.of( databaseDirectory ); storeLocker = tryLockStore( fileSystem ); ConfiguringPageCacheFactory pageCacheFactory = new ConfiguringPageCacheFactory( fileSystem, config, PageCacheTracer.NULL, PageCursorTracerSupplier.NULL, NullLog.getInstance(), @@ -264,9 +264,9 @@ public BatchInserterImpl( final File databaseDirectory, final FileSystemAbstract this.idGeneratorFactory = new DefaultIdGeneratorFactory( fileSystem ); LogProvider internalLogProvider = logService.getInternalLogProvider(); - RecordFormats recordFormats = RecordFormatSelector.selectForStoreOrConfig( config, directoryStructure, fileSystem, + RecordFormats recordFormats = RecordFormatSelector.selectForStoreOrConfig( config, databaseLayout, fileSystem, pageCache, internalLogProvider ); - StoreFactory sf = new StoreFactory( this.directoryStructure, config, idGeneratorFactory, pageCache, fileSystem, + StoreFactory sf = new StoreFactory( this.databaseLayout, config, idGeneratorFactory, pageCache, fileSystem, recordFormats, internalLogProvider, EmptyVersionContextSupplier.EMPTY ); maxNodeId = recordFormats.node().getMaxId(); @@ -311,7 +311,7 @@ public BatchInserterImpl( final File databaseDirectory, final FileSystemAbstract labelTokenHolder.setInitialTokens( labelTokenStore.getTokens() ); tokenHolders = new TokenHolders( propertyKeyTokenHolder, labelTokenHolder, relationshipTypeTokenHolder ); - indexStore = life.add( new IndexConfigStore( this.directoryStructure, fileSystem ) ); + indexStore = life.add( new IndexConfigStore( this.databaseLayout, fileSystem ) ); schemaCache = new SchemaCache( new StandardConstraintSemantics(), schemaStore, indexProviderMap ); actions = new BatchSchemaActions(); @@ -331,7 +331,7 @@ public BatchInserterImpl( final File databaseDirectory, final FileSystemAbstract private StoreLocker tryLockStore( FileSystemAbstraction fileSystem ) { - StoreLocker storeLocker = new GlobalStoreLocker( fileSystem, this.directoryStructure.databaseDirectory() ); + StoreLocker storeLocker = new GlobalStoreLocker( fileSystem, this.databaseLayout.getStoreLayout() ); try { storeLocker.checkLock(); @@ -960,7 +960,7 @@ public void shutdown() private NativeLabelScanStore buildLabelIndex() throws IOException { NativeLabelScanStore labelIndex = - new NativeLabelScanStore( pageCache, directoryStructure, fileSystem, new FullLabelStream( storeIndexStoreView ), false, monitors, + new NativeLabelScanStore( pageCache, databaseLayout, fileSystem, new FullLabelStream( storeIndexStoreView ), false, monitors, RecoveryCleanupWorkCollector.IMMEDIATE ); if ( labelsTouched ) { @@ -974,7 +974,7 @@ private NativeLabelScanStore buildLabelIndex() throws IOException @Override public String toString() { - return "EmbeddedBatchInserter[" + directoryStructure + "]"; + return "EmbeddedBatchInserter[" + databaseLayout + "]"; } private Map getPropertyChain( long nextProp ) @@ -1061,7 +1061,7 @@ private RecordProxy getRelationshipRecord( long id ) @Override public String getStoreDir() { - return directoryStructure.databaseDirectory().getPath(); + return databaseLayout.databaseDirectory().getPath(); } @Override diff --git a/community/kernel/src/test/java/org/neo4j/kernel/internal/locker/GlobalStoreLockerTest.java b/community/kernel/src/test/java/org/neo4j/kernel/internal/locker/GlobalStoreLockerTest.java index e9fce281843e6..156fb77c805ce 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/internal/locker/GlobalStoreLockerTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/internal/locker/GlobalStoreLockerTest.java @@ -22,9 +22,9 @@ import org.junit.Rule; import org.junit.Test; -import java.io.File; import java.io.IOException; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.test.rule.TestDirectory; import org.neo4j.test.rule.fs.DefaultFileSystemRule; @@ -34,7 +34,6 @@ public class GlobalStoreLockerTest { - @Rule public final TestDirectory testDirectory = TestDirectory.testDirectory(); @Rule @@ -43,12 +42,12 @@ public class GlobalStoreLockerTest @Test public void failToLockSameFolderAcrossIndependentLockers() throws Exception { - File directory = testDirectory.directory( "store-dir" ); - try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + StoreLayout storeLayout = testDirectory.storeLayout(); + try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); - try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { locker.checkLock(); fail("directory should be locked"); @@ -58,7 +57,7 @@ public void failToLockSameFolderAcrossIndependentLockers() throws Exception // expected } - try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { locker.checkLock(); fail("directory should be locked"); @@ -73,12 +72,12 @@ public void failToLockSameFolderAcrossIndependentLockers() throws Exception @Test public void allowToLockSameDirectoryIfItWasUnlocked() throws IOException { - File directory = testDirectory.directory( "doubleLock" ); - try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + StoreLayout storeLayout = testDirectory.storeLayout(); + try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); } - try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); } @@ -87,8 +86,8 @@ public void allowToLockSameDirectoryIfItWasUnlocked() throws IOException @Test public void allowMultipleCallstoActuallyStoreLocker() throws IOException { - File directory = testDirectory.directory( "multipleCalls" ); - try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), directory ) ) + StoreLayout storeLayout = testDirectory.storeLayout(); + try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); storeLocker.checkLock(); diff --git a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/PlatformModule.java b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/PlatformModule.java index ef2482b8dc655..a702379111a12 100644 --- a/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/PlatformModule.java +++ b/community/neo4j/src/main/java/org/neo4j/graphdb/factory/module/PlatformModule.java @@ -157,7 +157,7 @@ public PlatformModule( File providedStoreDir, Config config, DatabaseInfo databa config.augmentDefaults( GraphDatabaseSettings.neo4j_home, providedStoreDir.getAbsolutePath() ); this.config = dependencies.satisfyDependency( config ); - this.storeLayout = new StoreLayout( providedStoreDir.getAbsoluteFile() ); + this.storeLayout = StoreLayout.of( providedStoreDir.getAbsoluteFile() ); fileSystem = dependencies.satisfyDependency( createFileSystemAbstraction() ); life.add( new FileSystemLifecycleAdapter( fileSystem ) ); @@ -245,7 +245,7 @@ protected AvailabilityGuard createAvailabilityGuard() protected StoreLocker createStoreLocker() { - return new GlobalStoreLocker( fileSystem, storeLayout.storeDirectory() ); + return new GlobalStoreLocker( fileSystem, storeLayout ); } protected SystemNanoClock createClock() diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupProtocolService.java b/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupProtocolService.java index ba155911f38a4..177078bf08fec 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupProtocolService.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupProtocolService.java @@ -73,7 +73,6 @@ import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; import org.neo4j.kernel.impl.transaction.log.entry.VersionAwareLogEntryReader; import org.neo4j.kernel.internal.GraphDatabaseAPI; -import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.kernel.lifecycle.Lifespan; import org.neo4j.kernel.monitoring.ByteCounterMonitor; import org.neo4j.kernel.monitoring.Monitors; @@ -227,7 +226,7 @@ private BackupOutcome incrementalBackup( FileSystemAbstraction fileSystem, Strin { targetDb.shutdown(); // as soon as recovery will be extracted we will not gonna need this - File lockFile = new File( targetLayout.getStoreDirectory(), StoreLocker.STORE_LOCK_FILENAME ); + File lockFile = targetLayout.getStoreLayout().storeLockFile(); if ( lockFile.exists() ) { FileUtils.deleteFile( lockFile ); diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupRecoveryService.java b/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupRecoveryService.java index 50e1b970cb13f..0dab3cae2bab0 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupRecoveryService.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/impl/BackupRecoveryService.java @@ -28,11 +28,11 @@ import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.io.fs.FileUtils; +import org.neo4j.io.layout.DatabaseLayout; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.internal.GraphDatabaseAPI; -import org.neo4j.kernel.internal.locker.StoreLocker; import static org.neo4j.backup.impl.BackupProtocolService.startTemporaryDb; @@ -40,14 +40,15 @@ class BackupRecoveryService { void recoverWithDatabase( Path databaseDirectory, PageCache pageCache, Config config ) { + DatabaseLayout databaseLayout = DatabaseLayout.of( databaseDirectory.toFile() ); Map configParams = config.getRaw(); configParams.put( GraphDatabaseSettings.logical_logs_location.name(), databaseDirectory.toString() ); - configParams.put( GraphDatabaseSettings.active_database.name(), databaseDirectory.getFileName().toString() ); + configParams.put( GraphDatabaseSettings.active_database.name(), databaseLayout.getDatabaseName() ); configParams.put( GraphDatabaseSettings.pagecache_warmup_enabled.name(), Settings.FALSE ); - GraphDatabaseAPI targetDb = startTemporaryDb( databaseDirectory.toFile(), pageCache, configParams ); + GraphDatabaseAPI targetDb = startTemporaryDb( databaseLayout.databaseDirectory(), pageCache, configParams ); targetDb.shutdown(); // as soon as recovery will be extracted we will not gonna need this - File lockFile = new File( databaseDirectory.getParent().toFile(), StoreLocker.STORE_LOCK_FILENAME ); + File lockFile = databaseLayout.getStoreLayout().storeLockFile(); if ( lockFile.exists() ) { FileUtils.deleteFile( lockFile ); diff --git a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCommand.java b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCommand.java index bec6f2f652b65..912de39f796bf 100644 --- a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCommand.java +++ b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCommand.java @@ -28,6 +28,7 @@ import org.neo4j.commandline.admin.CommandFailed; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.transaction.log.files.LogFiles; import org.neo4j.kernel.impl.transaction.log.files.LogFilesBuilder; @@ -80,7 +81,7 @@ public void execute() throws IOException, CommandFailed throw new IllegalArgumentException( format( "Database with name [%s] already exists at %s", toDatabaseName, toDatabaseDir ) ); } - checkLock( toDatabaseDir.toPath() ); + checkLock( DatabaseLayout.of( toDatabaseDir ).getStoreLayout() ); fs.deleteRecursively( toDatabaseDir ); diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/impl/OnlineBackupCommandHaIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/impl/OnlineBackupCommandHaIT.java index 2d917d052ee30..14c6431d4e365 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/impl/OnlineBackupCommandHaIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/impl/OnlineBackupCommandHaIT.java @@ -361,7 +361,7 @@ public void onlyTheLatestTransactionIsKeptAfterIncrementalBackup() throws Except // then there has been a rotation BackupTransactionLogFilesHelper backupTransactionLogFilesHelper = new BackupTransactionLogFilesHelper(); - LogFiles logFiles = BackupTransactionLogFilesHelper.readLogFiles( new StoreLayout( backupDir ).databaseLayout( backupName ) ); + LogFiles logFiles = BackupTransactionLogFilesHelper.readLogFiles( StoreLayout.of( backupDir ).databaseLayout( backupName ) ); long highestTxIdInLogFiles = logFiles.getHighestLogVersion(); assertEquals( 2, highestTxIdInLogFiles ); diff --git a/enterprise/backup/src/test/java/org/neo4j/restore/RestoreDatabaseCommandIT.java b/enterprise/backup/src/test/java/org/neo4j/restore/RestoreDatabaseCommandIT.java index cc9135cd7ff05..e92b1143f8083 100644 --- a/enterprise/backup/src/test/java/org/neo4j/restore/RestoreDatabaseCommandIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/restore/RestoreDatabaseCommandIT.java @@ -47,6 +47,7 @@ import org.neo4j.graphdb.index.RelationshipIndex; import org.neo4j.helpers.collection.Iterables; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.impl.enterprise.configuration.OnlineBackupSettings; @@ -91,7 +92,7 @@ public void forceShouldRespectStoreLock() createDbAt( toPath, toNodeCount ); FileSystemAbstraction fs = fileSystemRule.get(); - try ( StoreLocker storeLocker = new StoreLocker( fs, toPath.getParentFile() ) ) + try ( StoreLocker storeLocker = new StoreLocker( fs, DatabaseLayout.of( toPath ).getStoreLayout() ) ) { storeLocker.checkLock(); diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/catchup/storecopy/CopiedStoreRecovery.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/catchup/storecopy/CopiedStoreRecovery.java index d01c01cb7436f..271e59f9799e1 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/catchup/storecopy/CopiedStoreRecovery.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/catchup/storecopy/CopiedStoreRecovery.java @@ -35,7 +35,6 @@ import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.impl.enterprise.configuration.OnlineBackupSettings; import org.neo4j.kernel.impl.storemigration.UpgradeNotAllowedByConfigurationException; -import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.kernel.lifecycle.LifecycleAdapter; import org.neo4j.logging.NullLogProvider; @@ -75,7 +74,7 @@ public synchronized void recoverCopiedStore( DatabaseLayout databaseLayout ) thr GraphDatabaseService graphDatabaseService = newTempDatabase( databaseLayout.databaseDirectory() ); graphDatabaseService.shutdown(); // as soon as recovery will be extracted we will not gonna need this - File lockFile = new File( databaseLayout.getStoreDirectory(), StoreLocker.STORE_LOCK_FILENAME ); + File lockFile = databaseLayout.getStoreLayout().storeLockFile(); if ( lockFile.exists() ) { FileUtils.deleteFile( lockFile ); diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java index 68c0787ce0d08..bca41af42af6e 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java @@ -34,9 +34,10 @@ import org.neo4j.commandline.admin.IncorrectUsage; import org.neo4j.commandline.admin.OutsideWorld; import org.neo4j.commandline.arguments.Arguments; -import org.neo4j.commandline.arguments.common.Database; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.io.fs.FileUtils; +import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.kernel.StoreLockException; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.util.Validators; @@ -92,7 +93,7 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed if ( hasDatabase ) { - confirmTargetDirectoryIsWritable( pathToSpecificDatabase ); + confirmTargetDirectoryIsWritable( DatabaseLayout.of( pathToSpecificDatabase.toFile() ).getStoreLayout() ); } ClusterStateDirectory clusterStateDirectory = new ClusterStateDirectory( dataDirectory ); @@ -114,10 +115,10 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed } } - private void confirmTargetDirectoryIsWritable( Path pathToSpecificDatabase ) + private static void confirmTargetDirectoryIsWritable( StoreLayout storeLayout ) throws CannotWriteException, IOException { - try ( Closeable ignored = StoreLockChecker.check( pathToSpecificDatabase ) ) + try ( Closeable ignored = StoreLockChecker.check( storeLayout ) ) { // empty } diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/commandline/dbms/UnbindFromClusterCommandTest.java b/enterprise/causal-clustering/src/test/java/org/neo4j/commandline/dbms/UnbindFromClusterCommandTest.java index 91f341c849b4c..dd4dcf50df099 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/commandline/dbms/UnbindFromClusterCommandTest.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/commandline/dbms/UnbindFromClusterCommandTest.java @@ -36,7 +36,6 @@ import java.nio.channels.FileLock; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import org.neo4j.causalclustering.core.state.ClusterStateDirectory; import org.neo4j.causalclustering.core.state.ClusterStateException; @@ -48,6 +47,8 @@ import org.neo4j.io.IOUtils; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.test.rule.TestDirectory; import org.neo4j.test.rule.fs.EphemeralFileSystemRule; @@ -59,7 +60,6 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import static org.neo4j.kernel.internal.locker.StoreLocker.STORE_LOCK_FILENAME; public class UnbindFromClusterCommandTest { @@ -190,7 +190,7 @@ public void shouldPrintUsage() throws Throwable private Path createUnlockedFakeDbDir( Path homeDir ) throws IOException { Path fakeDbDir = createFakeDbDir( homeDir ); - Files.createFile( Paths.get( fakeDbDir.toString(), STORE_LOCK_FILENAME ) ); + Files.createFile( DatabaseLayout.of( fakeDbDir.toFile() ).getStoreLayout().storeLockFile().toPath() ); return fakeDbDir; } @@ -207,9 +207,9 @@ private Path createFakeDbDir( Path homeDir ) throws IOException return graphDb; } - private FileLock createLockedStoreLockFileIn( Path parent ) throws IOException + private FileLock createLockedStoreLockFileIn( Path storeDir ) throws IOException { - Path storeLockFile = Files.createFile( Paths.get( parent.toString(), STORE_LOCK_FILENAME ) ); + Path storeLockFile = StoreLayout.of( storeDir.toFile() ).storeLockFile().toPath(); channel = FileChannel.open( storeLockFile, READ, WRITE ); return channel.lock( 0, Long.MAX_VALUE, true ); } diff --git a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java index 5a79b006c8178..d1e7dadc54b71 100644 --- a/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java +++ b/enterprise/com/src/main/java/org/neo4j/com/storecopy/StoreCopyClient.java @@ -38,6 +38,7 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.fs.FileUtils; import org.neo4j.io.layout.DatabaseLayout; +import org.neo4j.io.layout.StoreLayout; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.configuration.Settings; @@ -50,7 +51,6 @@ import org.neo4j.kernel.impl.transaction.log.entry.LogEntryWriter; import org.neo4j.kernel.impl.transaction.log.files.LogFiles; import org.neo4j.kernel.impl.transaction.log.files.LogFilesBuilder; -import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.kernel.lifecycle.LifeSupport; import org.neo4j.logging.Log; import org.neo4j.logging.LogProvider; @@ -173,7 +173,7 @@ private void recoverDatabase( File tempStore ) GraphDatabaseService graphDatabaseService = newTempDatabase( tempStore ); graphDatabaseService.shutdown(); // as soon as recovery will be extracted we will not gonna need this - File lockFile = new File( storeDir, StoreLocker.STORE_LOCK_FILENAME ); + File lockFile = StoreLayout.of( storeDir ).storeLockFile(); if ( lockFile.exists() ) { FileUtils.deleteFile( lockFile );