package org.infinispan.query.distributed;
import org.apache.lucene.search.MatchAllDocsQuery;
import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.query.Search;
import org.infinispan.test.MultipleCacheManagersTest;
import org.infinispan.test.fwk.TestCacheManagerFactory;
import org.jboss.byteman.contrib.bmunit.BMNGListener;
import org.jboss.byteman.contrib.bmunit.BMRule;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
/**
* Tests for running MassIndexer on async indexing backend
*
* @author gustavonalle
* @since 7.2
*/
@Test(groups = "functional", testName = "query.distributed.MassIndexerAsyncBackendTest")
@Listeners(BMNGListener.class)
public class MassIndexerAsyncBackendTest extends MultipleCacheManagersTest {
protected static final int NUM_NODES = 2;
protected static final int NUM_ENTRIES = 10;
@Override
protected void createCacheManagers() throws Throwable {
for (int i = 0; i < NUM_NODES; i++) {
EmbeddedCacheManager cacheManager = TestCacheManagerFactory.fromXml("dist-indexing-async.xml");
registerCacheManager(cacheManager);
}
waitForClusterToForm("default", "LuceneIndexesMetadata", "LuceneIndexesData", "LuceneIndexesLocking");
}
@Test
@BMRule(name = "Delay the purge of the index",
targetClass = "org.hibernate.search.backend.impl.lucene.works.PurgeAllWorkExecutor",
targetMethod = "performWork",
action = "delay(500)"
)
public void testMassIndexOnAsync() throws Exception {
final Cache<Object, Object> cache = caches().get(0);
for (int i = 0; i < NUM_ENTRIES; i++) {
cache.getAdvancedCache().withFlags(Flag.SKIP_INDEXING).put(String.valueOf(i), new Transaction(i, "12345"));
}
for (Cache c : caches()) {
Search.getSearchManager(c).getMassIndexer().start();
assertAllIndexed(c);
}
}
private void assertAllIndexed(final Cache cache) {
eventually(() -> {
int size = Search.getSearchManager(cache).getQuery(new MatchAllDocsQuery(), Transaction.class).list().size();
return size == NUM_ENTRIES;
});
}
}