package org.infinispan.lucene.locking; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertTrue; import java.io.IOException; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.store.Directory; import org.apache.lucene.store.Lock; import org.apache.lucene.store.LockFactory; import org.apache.lucene.store.LockObtainFailedException; import org.infinispan.Cache; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.lucene.CacheTestSupport; import org.infinispan.lucene.directory.DirectoryBuilder; import org.infinispan.lucene.impl.BaseLockFactory; import org.infinispan.test.MultipleCacheManagersTest; import org.infinispan.transaction.TransactionMode; import org.testng.annotations.Test; /** * LockManagerFunctionalTest. * * @author Sanne Grinovero * @since 4.0 */ @Test(groups = "functional", testName = "lucene.locking.LockManagerFunctionalTest") public class LockManagerFunctionalTest extends MultipleCacheManagersTest { private static final String COMMON_INDEX_NAME = "myIndex"; private static final String ANOTHER_INDEX = "commonIndexName"; protected Directory directory1; protected Directory directory2; protected Directory directory3; protected void createCacheManagers() { ConfigurationBuilder configurationBuilder = CacheTestSupport.createTestConfiguration(getTransactionsMode()); createClusteredCaches(2, "lucene", configurationBuilder); directory1 = createDirectory(cache(0,"lucene"), COMMON_INDEX_NAME); directory2 = createDirectory(cache(1,"lucene"), COMMON_INDEX_NAME); directory3 = createDirectory(cache(0,"lucene"), ANOTHER_INDEX); } private Directory createDirectory(Cache lockCache, String indexName) { return DirectoryBuilder.newDirectoryInstance( lockCache, lockCache, lockCache, indexName).create(); } protected TransactionMode getTransactionsMode() { return TransactionMode.NON_TRANSACTIONAL; } @Test public void testLuceneIndexLocking() throws IOException { assertFalse(isLocked(directory1)); Lock obtainedLock = directory1.obtainLock(IndexWriter.WRITE_LOCK_NAME); assertTrue(isLocked(directory1)); assertTrue(isLocked(directory2)); assertFalse(isLocked(directory3)); obtainedLock.ensureValid(); //will throw an exception on failure obtainedLock.close(); assertFalse(isLocked(directory1)); assertFalse(isLocked(directory2)); assertFalse(isLocked(directory3)); } //Replacing the now deprecated IndexWriter.isLocked helper private static boolean isLocked(Directory directory) throws IOException { try { directory.obtainLock(IndexWriter.WRITE_LOCK_NAME).close(); return false; } catch (LockObtainFailedException failed) { return true; } } protected LockFactory makeLockFactory() { return BaseLockFactory.INSTANCE; } }