@Test void storeLockFileLocation() { StoreLayout storeLayout = testDirectory.storeLayout(); File storeLockFile = storeLayout.storeLockFile(); assertEquals( "store_lock", storeLockFile.getName() ); assertEquals( storeLayout.storeDirectory(), storeLockFile.getParentFile() ); } }
@Test void databaseLayoutForName() { String databaseName = "testDatabase"; StoreLayout storeLayout = testDirectory.storeLayout(); DatabaseLayout testDatabase = DatabaseLayout.of( storeLayout, databaseName ); assertEquals( new File( storeLayout.storeDirectory(), databaseName ), testDatabase.databaseDirectory() ); }
@Test public void shouldAllowMultipleCallsToCheckLock() throws Exception { try ( StoreLocker storeLocker = new StoreLocker( fileSystemRule.get(), target.storeLayout() ) ) { storeLocker.checkLock(); storeLocker.checkLock(); } }
@Test public void shouldCreateStoreDirAndObtainLockWhenStoreDirDoesNotExist() throws Exception { FileSystemAbstraction fileSystemAbstraction = new DelegatingFileSystemAbstraction( fileSystemRule.get() ) { @Override public boolean fileExists( File file ) { return false; } }; try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { storeLocker.checkLock(); // Ok } }
@Test public void shouldNotObtainLockWhenStoreDirCannotBeCreated() throws Exception { FileSystemAbstraction fileSystemAbstraction = new DelegatingFileSystemAbstraction( fileSystemRule.get() ) { @Override public void mkdirs( File fileName ) throws IOException { throw new IOException( "store dir could not be created" ); } @Override public boolean fileExists( File file ) { return false; } }; StoreLayout storeLayout = target.storeLayout(); try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker.checkLock(); fail(); } catch ( StoreLockException e ) { 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)", storeLayout ); assertThat( e.getMessage(), is( msg ) ); } }
@Test public void shouldObtainLockWhenStoreFileNotLocked() throws Exception { FileSystemAbstraction fileSystemAbstraction = new DelegatingFileSystemAbstraction( fileSystemRule.get() ) { @Override public boolean fileExists( File file ) { return true; } }; try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { storeLocker.checkLock(); // Ok } catch ( StoreLockException e ) { fail(); } }
StoreLayout storeLayout = target.storeLayout();
@Test public void allowToLockSameDirectoryIfItWasUnlocked() throws IOException { StoreLayout storeLayout = testDirectory.storeLayout(); try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); } try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); } }
try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) )
@Test public void allowMultipleCallstoActuallyStoreLocker() throws IOException { StoreLayout storeLayout = testDirectory.storeLayout(); try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); storeLocker.checkLock(); storeLocker.checkLock(); storeLocker.checkLock(); storeLocker.checkLock(); } } }
@Test public void shouldUseAlreadyOpenedFileChannel() throws Exception { StoreChannel channel = Mockito.mock( StoreChannel.class ); CustomChannelFileSystemAbstraction fileSystemAbstraction = new CustomChannelFileSystemAbstraction( fileSystemRule.get(), channel ); int numberOfCallesToOpen = 0; try ( StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, target.storeLayout() ) ) { try { storeLocker.checkLock(); fail(); } catch ( StoreLockException e ) { numberOfCallesToOpen = fileSystemAbstraction.getNumberOfCallsToOpen(); // Try to grab lock a second time storeLocker.checkLock(); } } catch ( StoreLockException e ) { // expected } assertEquals( "Expect that number of open channels will remain the same for ", numberOfCallesToOpen, fileSystemAbstraction .getNumberOfCallsToOpen() ); }
@Test public void testFailsOnExistingStoreLockFile() throws IOException { // Given StoreLayout storeLayout = testDirectory.storeLayout(); try ( FileSystemAbstraction fileSystemAbstraction = new DefaultFileSystemAbstraction(); StoreLocker lock = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { lock.checkLock(); // Then expected.expect( StoreLockException.class ); expected.expectMessage( "Unable to obtain lock on store lock file" ); // When BatchInserters.inserter( storeLayout.databaseLayout( "any" ).databaseDirectory(), fileSystemAbstraction ); } } }
@Test public void keepLockWhenOtherTryToTakeLock() throws Exception { StoreLayout storeLayout = target.storeLayout(); DefaultFileSystemAbstraction fileSystemAbstraction = fileSystemRule.get(); StoreLocker storeLocker = new StoreLocker( fileSystemAbstraction, storeLayout ); storeLocker.checkLock(); try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker1.checkLock(); fail(); } catch ( StoreLockException e ) { // Expected } // Initial locker should still have a valid lock try ( StoreLocker storeLocker1 = new StoreLocker( fileSystemAbstraction, storeLayout ) ) { storeLocker1.checkLock(); fail(); } catch ( StoreLockException e ) { // Expected } storeLocker.close(); }
@Test public void failToLockSameFolderAcrossIndependentLockers() throws Exception { StoreLayout storeLayout = testDirectory.storeLayout(); try ( GlobalStoreLocker storeLocker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { storeLocker.checkLock(); try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { locker.checkLock(); fail("directory should be locked"); } catch ( StoreLockException expected ) { // expected } try ( GlobalStoreLocker locker = new GlobalStoreLocker( fileSystemRule.get(), storeLayout ) ) { locker.checkLock(); fail("directory should be locked"); } catch ( StoreLockException expected ) { // expected } } }