package org.infinispan.lucene.readlocks;
import java.io.IOException;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.IOContext;
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
import org.infinispan.Cache;
import org.infinispan.lucene.CacheTestSupport;
import org.infinispan.lucene.directory.DirectoryBuilder;
import org.testng.annotations.Test;
/**
* LocalLockMergingSegmentReadLockerTest represents a quick check on the functionality
* of {@link org.infinispan.lucene.readlocks.LocalLockMergingSegmentReadLocker}
*
* @author Sanne Grinovero
* @since 4.1
*/
@SuppressWarnings("unchecked")
@Test(groups = "functional", testName = "lucene.readlocks.LocalLockMergingSegmentReadLockerTest")
public class LocalLockMergingSegmentReadLockerTest extends DistributedSegmentReadLockerTest {
@Test @Override
public void testIndexWritingAndFinding() throws IOException, InterruptedException {
prepareEnvironment(false);
verifyBoth(cache0,cache1);
IndexOutput indexOutput = dirA.createOutput(filename, IOContext.DEFAULT);
indexOutput.writeString("no need to write, nobody ever will read this");
indexOutput.close();
assertFileExistsHavingRLCount(filename, 1, true);
IndexInput firstOpenOnB = dirB.openInput(filename, IOContext.DEFAULT);
assertFileExistsHavingRLCount(filename, 2, true);
dirA.deleteFile(filename);
assertFileExistsHavingRLCount(filename, 1, false);
//Lucene does use clone() - lock implementation ignores it as a clone is
//cast on locked segments and released before the close on the parent object
IndexInput cloneOfFirstOpenOnB = (IndexInput) firstOpenOnB.clone();
assertFileExistsHavingRLCount(filename, 1, false);
cloneOfFirstOpenOnB.close();
assertFileExistsHavingRLCount(filename, 1, false);
IndexInput firstOpenOnA = dirA.openInput(filename, IOContext.DEFAULT);
assertFileExistsHavingRLCount(filename, 2, false);
IndexInput secondOpenOnA = dirA.openInput(filename, IOContext.DEFAULT);
assertFileExistsHavingRLCount(filename, 2, false);
firstOpenOnA.close();
assertFileExistsHavingRLCount(filename, 2, false);
secondOpenOnA.close();
assertFileExistsHavingRLCount(filename, 1, false);
firstOpenOnB.close();
assertFileNotExists(filename);
dirA.close();
dirB.close();
verifyBoth(cache0, cache1);
}
@Test
public void testAdditionalIndexWritingAndFinding() throws IOException, InterruptedException {
prepareEnvironment(true);
testIndexWritingAndFinding();
}
@Override
Directory createDirectory(Cache cache) {
return DirectoryBuilder.newDirectoryInstance(cache, cache, cache, INDEX_NAME)
.chunkSize(CHUNK_SIZE)
.overrideSegmentReadLocker(new LocalLockMergingSegmentReadLocker(cache, INDEX_NAME, -1))
.overrideSegmentReadLocker(new LocalLockMergingSegmentReadLocker(cache, cache, cache, INDEX_NAME, true, -1))
.create();
}
Directory createAdditionalDirectory(Cache cache) {
return DirectoryBuilder.newDirectoryInstance(cache, cache, cache, INDEX_NAME)
.chunkSize(CHUNK_SIZE)
.overrideSegmentReadLocker(new LocalLockMergingSegmentReadLocker(cache, cache, cache, INDEX_NAME, -1))
.overrideSegmentReadLocker(new LocalLockMergingSegmentReadLocker(cache, cache, cache, INDEX_NAME, true, 1))
.create();
}
private void prepareEnvironment(final boolean useDefConstructor) throws IOException {
cache0 = cache(0, CACHE_NAME);
cache1 = cache(1, CACHE_NAME);
if (useDefConstructor) {
dirA = createDirectory(cache0);
dirB = createDirectory(cache1);
} else {
dirA = createAdditionalDirectory(cache0);
dirB = createAdditionalDirectory(cache1);
}
CacheTestSupport.initializeDirectory(dirA);
}
}