package org.infinispan.query.performance; import java.io.IOException; import java.text.NumberFormat; import java.util.concurrent.TimeUnit; import org.apache.lucene.search.MatchAllDocsQuery; import org.infinispan.Cache; import org.infinispan.commons.util.Util; import org.infinispan.context.Flag; import org.infinispan.manager.EmbeddedCacheManager; import org.infinispan.query.Search; import org.infinispan.query.SearchManager; import org.infinispan.query.test.Person; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.test.fwk.TestCacheManagerFactory; import org.testng.Assert; import org.testng.annotations.Test; /** * Starts writing a lot of data in a loop. Used to measure ingestion rate. * * -server -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+UseParNewGC -Xss500k -Xmx12G -Xms12G -Dlog4j.configurationFile=log4j2.xml * * @author Sanne Grinovero * @since 5.3 */ @Test(groups = "performance", testName = "query.performance.LoopingWriterTest") public class LoopingWriterTest extends AbstractInfinispanTest { private static final int TOTAL_LOOPS = Integer.MAX_VALUE; private static final int TIMESAMPLE_PERIODICITY = 6000; private static final int QUERY_PERIODICITY = 15170; public void neverEndingWrite() throws IOException { EmbeddedCacheManager embeddedCacheManager = TestCacheManagerFactory.fromXml("nrt-performance-writer-infinispandirectory.xml"); try { Cache<Object, Object> cache = embeddedCacheManager.getCache("Indexed"); cache = cache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES); writeStuff(cache); } finally { embeddedCacheManager.stop(); } } /** * We write a lot of elements.. and run a Query occasionally to check. */ private void writeStuff(final Cache<Object, Object> cache) { final long startTime = System.nanoTime(); for (int i = 1; i < TOTAL_LOOPS; i++) { final String key = "K" + i; final Person value = new Person(key, key, i); cache.put(key, value); if (i % QUERY_PERIODICITY == 0) { countElementsViaQuery(cache, i); } if (i % TIMESAMPLE_PERIODICITY == 0) { final long currentTimeStamp = System.nanoTime(); final long elapsed = currentTimeStamp - startTime; final double elementsWrittenPerSecond = ((double)TimeUnit.NANOSECONDS.convert(i, TimeUnit.SECONDS))/elapsed; NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); nf.setGroupingUsed(true); System.out.println( "Transactions committed to index per second: " + nf.format(elementsWrittenPerSecond) + ". Total documents: " + i + " Total time: " + Util.prettyPrintTime(elapsed, TimeUnit.NANOSECONDS) ); } } } private void countElementsViaQuery(Cache<Object, Object> cache, int expectedElements) { SearchManager searchManager = Search.getSearchManager(cache); MatchAllDocsQuery query = new MatchAllDocsQuery(); int resultSize = searchManager.getQuery(query).getResultSize(); Assert.assertEquals(resultSize, expectedElements); System.out.println("Query OK! found (as expected) " + resultSize + " elements"); } @Test(enabled=false) // Disable explicitly to avoid TestNG thinking this is a test!! public static void main(String[] args) throws IOException { LoopingWriterTest runner = new LoopingWriterTest(); runner.neverEndingWrite(); } }