package proj.zoie.hourglass.impl; import java.io.IOException; import java.util.LinkedList; import java.util.List; import org.apache.log4j.Logger; import org.apache.lucene.index.IndexReader; import proj.zoie.api.ZoieException; import proj.zoie.api.ZoieMultiReader; import proj.zoie.api.indexing.IndexReaderDecorator; import proj.zoie.impl.indexing.ZoieSystem; public class Box<R extends IndexReader, D> { public static final Logger log = Logger.getLogger(Box.class.getName()); List<ZoieMultiReader<R>> _archives; List<ZoieSystem<R, D>> _archiveZoies; List<ZoieSystem<R, D>> _retiree; List<ZoieSystem<R, D>> _actives; IndexReaderDecorator<R> _decorator; /** * Copy the given lists to have immutable behavior. * * @param archives * @param retiree * @param actives * @param decorator */ public Box(List<ZoieMultiReader<R>> archives, List<ZoieSystem<R, D>> archiveZoies, List<ZoieSystem<R, D>> retiree, List<ZoieSystem<R, D>> actives, IndexReaderDecorator<R> decorator) { _archives = new LinkedList<ZoieMultiReader<R>>(archives); _archiveZoies = new LinkedList<ZoieSystem<R, D>>(archiveZoies); _retiree = new LinkedList<ZoieSystem<R, D>>(retiree); _actives = new LinkedList<ZoieSystem<R, D>>(actives); _decorator = decorator; if (log.isDebugEnabled()) { for (ZoieMultiReader<R> r : _archives) { log.debug("archive " + r.directory() + " refCount: " + r.getInnerRefCount()); } } } public void shutdown() { for (ZoieMultiReader<R> r : _archives) { r.decZoieRef(); log.info("refCount at shutdown: " + r.getInnerRefCount() + " " + r.directory()); } for (ZoieSystem<R, D> zoie : _archiveZoies) { zoie.shutdown(); } for (ZoieSystem<R, D> zoie : _retiree) { zoie.shutdown(); } // add the active index readers for (ZoieSystem<R, D> zoie : _actives) { while (true) { long flushwait = 200000L; try { zoie.flushEvents(flushwait); zoie.getAdminMBean().setUseCompoundFile(true); zoie.getAdminMBean().optimize(1); break; } catch (IOException e) { log.error("pre-shutdown optimization " + zoie.getAdminMBean().getIndexDir() + " Should investigate. But move on now.", e); break; } catch (ZoieException e) { if (e.getMessage().indexOf("timed out") < 0) { break; } else { log.info("pre-shutdown optimization " + zoie.getAdminMBean().getIndexDir() + " flushing processing " + flushwait + "ms elapsed"); } } } zoie.shutdown(); } } }