package org.infinispan.hibernate.search.impl;
import java.util.Properties;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.hibernate.search.engine.service.spi.Startable;
import org.hibernate.search.engine.service.spi.Stoppable;
import org.hibernate.search.spi.BuildContext;
import org.hibernate.search.util.impl.Executors;
import org.hibernate.search.util.logging.impl.LoggerFactory;
import org.infinispan.hibernate.search.logging.Log;
import org.kohsuke.MetaInfServices;
/**
* A shared service used among all InfinispanDirectoryProvider instances to delete segments asynchronously.
*
* @author Sanne Grinovero <sanne@hibernate.org> (C) 2014 Red Hat Inc.
*/
@MetaInfServices(AsyncDeleteExecutorService.class)
public class DefaultAsyncDeleteExecutor implements AsyncDeleteExecutorService, Startable, Stoppable {
private static final Log log = LoggerFactory.make(Log.class);
private ThreadPoolExecutor threadPool;
@Override
public void start(Properties properties, BuildContext context) {
threadPool = Executors
.newScalableThreadPool(1, 5, "async deletion of index segments", 100);
}
@Override
public void stop() {
closeAndFlush();
}
@Override
public Executor getExecutor() {
return threadPool;
}
@Override
public void closeAndFlush() {
//Each DirectoryProvider using this service should flush and wait a bit to allow
//async work to be performed before the Directory itself becomes unavailable.
threadPool.shutdown();
try {
threadPool.awaitTermination(30L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
log.interruptedWhileWaitingForAsyncDeleteFlush();
}
}
@Override
public int getActiveTasks() {
return threadPool.getActiveCount();
}
}