/* * JBoss, Home of Professional Open Source * Copyright 2010 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.lucene.readlocks; import java.io.IOException; import org.apache.lucene.store.Directory; import org.apache.lucene.store.IndexInput; import org.apache.lucene.store.IndexOutput; import org.infinispan.Cache; import org.infinispan.config.Configuration; import org.infinispan.lucene.CacheTestSupport; import org.infinispan.lucene.DirectoryIntegrityCheck; import org.infinispan.lucene.InfinispanDirectory; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * DistributedSegmentReadLockerTest represents a quick check on the functionality * of {@link org.infinispan.lucene.readlocks.DistributedSegmentReadLocker} * * @author Sanne Grinovero * @since 4.1 */ @SuppressWarnings("unchecked") @Test(groups = "functional", testName = "lucene.readlocks.DistributedSegmentReadLockerTest") public class DistributedSegmentReadLockerTest extends MultipleCacheManagersTest { /** The Index name */ protected static final String INDEX_NAME = "indexName"; /** The cache name */ protected static final String CACHE_NAME = "lucene"; /** Chunk Size **/ protected static final int CHUNK_SIZE = 6; /** The name of the test file **/ protected static final String filename = "readme.txt"; protected Cache cache0; protected Cache cache1; protected Directory dirA; protected Directory dirB; @Override protected void createCacheManagers() throws Throwable { Configuration configuration = CacheTestSupport.createTestConfiguration(); createClusteredCaches(2, CACHE_NAME, configuration); } @BeforeMethod protected void prepare() throws IOException { cache0 = cache(0, CACHE_NAME); cache1 = cache(1, CACHE_NAME); dirA = createDirectory(cache0); dirB = createDirectory(cache1); CacheTestSupport.initializeDirectory(dirA); } @Test public void testIndexWritingAndFinding() throws IOException, InterruptedException { verifyBoth(cache0,cache1); IndexOutput indexOutput = dirA.createOutput(filename); indexOutput.writeString("no need to write, nobody ever will read this"); indexOutput.flush(); indexOutput.close(); assertFileExistsHavingRLCount(filename, 1, true); IndexInput openInput = dirB.openInput(filename); 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 clone = (IndexInput) openInput.clone(); assertFileExistsHavingRLCount(filename, 1, false); clone.close(); assertFileExistsHavingRLCount(filename, 1, false); openInput.close(); assertFileNotExists(filename); dirA.close(); dirB.close(); verifyBoth(cache0, cache1); } void assertFileNotExists(String fileName) throws InterruptedException { DirectoryIntegrityCheck.assertFileNotExists(cache0, INDEX_NAME, fileName, 10000L); DirectoryIntegrityCheck.assertFileNotExists(cache1, INDEX_NAME, fileName, 10000L); } void assertFileExistsHavingRLCount(String fileName, int expectedReadcount, boolean expectRegisteredInFat) { DirectoryIntegrityCheck.assertFileExistsHavingRLCount(cache0, fileName, INDEX_NAME, expectedReadcount, CHUNK_SIZE, expectRegisteredInFat); DirectoryIntegrityCheck.assertFileExistsHavingRLCount(cache1, fileName, INDEX_NAME, expectedReadcount, CHUNK_SIZE, expectRegisteredInFat); } Directory createDirectory(Cache cache) { return new InfinispanDirectory(cache, INDEX_NAME, CHUNK_SIZE, new DistributedSegmentReadLocker(cache, INDEX_NAME)); } void verifyBoth(Cache cache0, Cache cache1) { DirectoryIntegrityCheck.verifyDirectoryStructure(cache0, INDEX_NAME); DirectoryIntegrityCheck.verifyDirectoryStructure(cache1, INDEX_NAME); } }