package org.infinispan.lucene.cacheloader; import static org.infinispan.lucene.cacheloader.TestHelper.createIndex; import static org.infinispan.test.TestingUtil.findInterceptor; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertTrue; import java.io.File; import java.nio.file.Files; import org.apache.lucene.store.Directory; import org.infinispan.Cache; import org.infinispan.commons.util.Util; import org.infinispan.configuration.cache.CacheMode; import org.infinispan.configuration.cache.ConfigurationBuilder; import org.infinispan.interceptors.impl.CacheLoaderInterceptor; import org.infinispan.lucene.cacheloader.configuration.LuceneLoaderConfigurationBuilder; import org.infinispan.lucene.directory.DirectoryBuilder; import org.infinispan.lucene.testutils.LuceneUtils; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.test.MultipleCacheManagersTest; import org.testng.annotations.AfterClass; import org.testng.annotations.Test; /** * * Verify that preloading a read only lucene index in a cache and query it * afterwards will not cause cache loader hits * * @author gustavonalle * @since 7.0 */ @Test(groups = "functional", testName = "lucene.cacheloader.WarmCacheTest") public class WarmCacheTest extends MultipleCacheManagersTest { public static final int CLUSTER_SIZE = 3; public static final String INDEX_NAME = "INDEX"; public static final int TERMS_NUMBER = 1000; private File indexDir; @Test public void shouldNotHitCacheLoaderWhenWarm() throws Throwable { Cache<Object, Object> cache = cacheManagers.get(0).getCache(); Directory directory = DirectoryBuilder.newDirectoryInstance(cache, cache, cache, INDEX_NAME).create(); assertTrue(LuceneUtils.readTerms("main", directory).contains("500")); assertEquals(TERMS_NUMBER + 1, LuceneUtils.numDocs(directory)); LuceneUtils.collect(directory, TERMS_NUMBER); assertNoCacheLoaderInteractions(); } private void assertNoCacheLoaderInteractions() { for (EmbeddedCacheManager cacheManager : cacheManagers) { CacheLoaderInterceptor interceptor = findInterceptor(cacheManager.getCache(), CacheLoaderInterceptor.class); assertEquals(0, interceptor.getCacheLoaderLoads()); assertEquals(0, interceptor.getCacheLoaderMisses()); } } @Override protected void createCacheManagers() throws Throwable { indexDir = Files.createTempDirectory("test-").toFile(); createIndex(indexDir, INDEX_NAME, TERMS_NUMBER, false); ConfigurationBuilder c = getDefaultClusteredCacheConfig(CacheMode.DIST_ASYNC, false); c.clustering().hash().numOwners(1); c.jmxStatistics().enable(); c.persistence() .addStore(LuceneLoaderConfigurationBuilder.class) .preload(true) .location(indexDir.getAbsolutePath()); createCluster(c, CLUSTER_SIZE); waitForClusterToForm(); } @AfterClass(alwaysRun = true) protected void clearTempDir() { Util.recursiveFileRemove(indexDir); } }