/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.performance.util; import java.io.IOException; import java.io.PrintStream; import java.util.Collection; import org.apache.lucene.index.CheckIndex; import org.apache.lucene.index.CheckIndex.Status; import org.apache.lucene.store.Directory; import org.hibernate.Session; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.backend.impl.lucene.WorkspaceHolder; import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator; import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager; import org.hibernate.search.indexes.spi.IndexManager; import org.hibernate.search.store.DirectoryProvider; import org.hibernate.search.test.performance.scenario.TestContext; import static org.hibernate.search.test.performance.scenario.TestContext.CHECK_INDEX_STATE; import static org.junit.Assert.assertTrue; /** * @author Tomas Hradec */ public class CheckerLuceneIndex { private CheckerLuceneIndex() { } @SuppressWarnings("deprecation") // performance tests can be run against older hsearch versions, where isn't getIndexManagerHolder yet public static void printIndexReport(TestContext ctx, PrintStream out) throws IOException { if ( !CHECK_INDEX_STATE ) { return; } out.println( "INDEX CHECK..." ); out.println( "" ); Session s = ctx.sf.openSession(); FullTextSession fts = Search.getFullTextSession( s ); ExtendedSearchIntegrator integrator = fts.getSearchFactory().unwrap( ExtendedSearchIntegrator.class ); Collection<IndexManager> indexManagers = integrator.getIndexManagerHolder().getIndexManagers(); for ( IndexManager indexManager : indexManagers ) { DirectoryBasedIndexManager directoryBasedIndexManager = (DirectoryBasedIndexManager) indexManager; stopBackend( directoryBasedIndexManager ); DirectoryProvider<?> directoryProvider = directoryBasedIndexManager.getDirectoryProvider(); Directory directory = directoryProvider.getDirectory(); out.println( "directory : " + directory.toString() ); out.println( "" ); CheckIndex checkIndex = new CheckIndex( directory ); checkIndex.setInfoStream( out ); Status status; try { status = checkIndex.checkIndex(); } catch (IOException e) { throw new RuntimeException( e ); } assertTrue( status.clean ); } out.println( "==================================================================" ); out.flush(); } /** * This essentially kills the backend: needed to release the IndexWriter lock * so that the CheckIndex task can be run. * You'll need to ignore further issues if indexing is attempted, and even shutdown * might not be graceful (the shutdown is not designed to be recoverable). */ private static void stopBackend(DirectoryBasedIndexManager directoryBasedIndexManager) { WorkspaceHolder backendQueueProcessor = (WorkspaceHolder) directoryBasedIndexManager.getWorkspaceHolder(); backendQueueProcessor.getIndexResources().shutdown(); } }