Java Mailing List Archive

http://www.gg3721.com/

Home » Hibernate Commits List »

[hibernate-commits] Hibernate SVN: r14687 - in search/trunk/src:
 java/org/hibernate/search/backend/impl and 7 other directories.

hibernate-commits

2008-05-22


Author LoginPost Reply
Author: epbernard
Date: 2008-05-22 14:21:01 -0400 (Thu, 22 May 2008)
New Revision: 14687

Modified:
 search/trunk/src/java/org/hibernate/search/backend/QueueingProcessor.java
 search/trunk/src/java/org/hibernate/search/backend/Worker.java
 search/trunk/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
 search/trunk/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
 search/trunk/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java
 search/trunk/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
 search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
 search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java
 search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java
 search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
 search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
 search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
 search/trunk/src/test/org/hibernate/search/test/FSDirectoryTest.java
 search/trunk/src/test/org/hibernate/search/test/HANTestCase.java
 search/trunk/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java
 search/trunk/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
Log:
HSEARCH-199 close resources on SF.close() had to change the DirectoryProvider API and the worker / QueueingProcess APIs

Modified: search/trunk/src/java/org/hibernate/search/backend/QueueingProcessor.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/QueueingProcessor.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/backend/QueueingProcessor.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
  * Rollback works
  */
 void cancelWorks(WorkQueue workQueue);
+
+  /**
+   * clean resources
+   * This method should log errors rather than raise an exception
+   */
+  void close();
}

Modified: search/trunk/src/java/org/hibernate/search/backend/Worker.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/Worker.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/backend/Worker.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
 void performWork(Work work, EventSource session);

 void initialize(Properties props, SearchFactoryImplementor searchFactoryImplementor);
+
+  /**
+   * clean resources
+   * This method can return exceptions
+   */
+  void close();
}

Modified: search/trunk/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
import org.hibernate.search.engine.DocumentBuilder;
import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

/**
* Batch work until #performWorks is called.
@@(protected) @@
* @author Emmanuel Bernard
*/
public class BatchedQueueingProcessor implements QueueingProcessor {
+
+  private static final Logger log = LoggerFactory.getLogger( BatchedQueueingProcessor.class );
+
 private boolean sync;
 private int batchSize;
 private ExecutorService executorService;
@@(protected) @@
   workQueue.clear();
 }

-  @Override
-  public void finalize() throws Throwable {
-    super.finalize();
+  public void close() {
   //gracefully stop
-    //TODO move to the SF close lifecycle
   if ( executorService != null && !executorService.isShutdown() ) {
     executorService.shutdown();
-      executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS );
+      try {
+        executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS );
+      }
+      catch (InterruptedException e) {
+        log.error("Unable to property shut down asynchronous indexing work", e);
+      }
   }
 }


Modified: search/trunk/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
 public void initialize(Properties props, SearchFactoryImplementor searchFactory) {
   this.queueingProcessor = new BatchedQueueingProcessor( searchFactory, props );
 }
+
+  public void close() {
+    queueingProcessor.close();
+  }
+
}

Modified: search/trunk/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/engine/SearchFactoryImplementor.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
 void addIndexingParmeters(DirectoryProvider<?> provider, LuceneIndexingParameters indexingParams);

 public String getIndexingStrategy();
+
+  public void close();
}

Modified: search/trunk/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/event/FullTextIndexEventListener.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/event/FullTextIndexEventListener.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
import org.hibernate.event.PostInsertEventListener;
import org.hibernate.event.PostUpdateEvent;
import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.event.Destructible;
import org.hibernate.search.backend.WorkType;
import org.hibernate.search.backend.Work;
import org.hibernate.search.engine.DocumentBuilder;
@@(protected) @@
//TODO work on sharing the same indexWriters and readers across a single post operation...
//TODO implement and use a LockableDirectoryProvider that wraps a DP to handle the lock inside the LDP
public class FullTextIndexEventListener implements PostDeleteEventListener, PostInsertEventListener,
-    PostUpdateEventListener, Initializable {
+    PostUpdateEventListener, Initializable, Destructible {

 @SuppressWarnings( { "WeakerAccess" } )
 protected boolean used;
@@(protected) @@
   Work work = new Work(entity, id, workType);
   searchFactoryImplementor.getWorker().performWork( work, event.getSession() );
 }
+
+  public void cleanup() {
+    searchFactoryImplementor.close();
+  }
}

Modified: search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
import org.hibernate.search.store.DirectoryProviderFactory;
import org.hibernate.search.store.optimization.OptimizerStrategy;
import org.apache.lucene.analysis.Analyzer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

/**
* @author Emmanuel Bernard
@@(protected) @@
   Version.touch();
 }

+  private final Logger log = LoggerFactory.getLogger( SearchFactoryImpl.class );
+
 private Map<Class, DocumentBuilder<Object>> documentBuilders = new HashMap<Class, DocumentBuilder<Object>>();
 //keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
 private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders =
@@(protected) @@
 private Map<String, FilterDef> filterDefinitions = new HashMap<String, FilterDef>();
 private FilterCachingStrategy filterCachingStrategy;
 private Map<String, Analyzer> analyzers;
+  private boolean stopped = false;

 /**
  * Each directory provider (index) can have its own performance settings.
@@(protected) @@
   return indexingStrategy;
 }

+  public void close() {
+    if (!stopped) {
+      stopped = true;
+      try {
+        worker.close();
+      }
+      catch (Exception e) {
+        log.error( "Worker raises an exception on close()", e );
+      }
+      //TODO move to DirectoryProviderFactory for cleaner
+      for (DirectoryProvider dp : lockableDirectoryProviders.keySet() ) {
+        try {
+          dp.stop();
+        }
+        catch (Exception e) {
+          log.error( "DirectoryProvider raises an exception on stop() ", e );
+        }
+      }
+    }
+  }
+
 private void bindFilterDefs(XClass mappedXClass) {
   FullTextFilterDef defAnn = mappedXClass.getAnnotation( FullTextFilterDef.class );
   if ( defAnn != null ) {

Modified: search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
  * Executed after initialize, this method set up the heavy process of starting up the DirectoryProvider
  * IO processing as well as backgroup processing are expected to be set up here
  *
-   * TODO stop() method, for now use finalize()
  */
 void start();

 /**
+   * Executed when the search factory is closed. This method should stop any background process as well as
+   * releasing any resource.
+   * This method should avoid raising exceptions and log potential errors instead
+   */
+  void stop();
+
+  /**
  * Returns an initialized Lucene Directory. This method call <b>must</b> be threadsafe
  */
 TDirectory getDirectory();

Modified: search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
import org.hibernate.search.Environment;
import org.hibernate.search.SearchException;
import org.hibernate.search.engine.SearchFactoryImplementor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;

/**
* Use a Lucene FSDirectory
@@(protected) @@
* @author Sanne Grinovero
*/
public class FSDirectoryProvider implements DirectoryProvider<FSDirectory> {
+
+  private final Logger log = LoggerFactory.getLogger( FSDirectoryProvider.class );
 
 private FSDirectory directory;
 private String indexName;
@@(protected) @@
   //all the process is done in initialize
 }

+  public void stop() {
+    try {
+      directory.close();
+    }
+    catch (Exception e) {
+      log.error( "Unable to property close Lucene directory {}" + directory.getFile(), e );
+    }
+  }
+
 public FSDirectory getDirectory() {
   return directory;
 }

Modified: search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
   return 37 * hash + indexName.hashCode();
 }

+
+
+  public void stop() {
+    timer.cancel();
+    try {
+      directory.close();
+    }
+    catch (Exception e) {
+      log.error( "Unable to property close Lucene directory {}" + directory.getFile(), e );
+    }
+  }
+
 class TriggerTask extends TimerTask {

   private final ExecutorService executor;
@@(protected) @@
     log.trace( "Copy for {} took {} ms", indexName, (System.currentTimeMillis() - start) );
   }
 }
-
-  public void finalize() throws Throwable {
-    super.finalize();
-    timer.cancel();
-    //TODO find a better cycle from Hibernate core
-  }
}

Modified: search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
   }
 }

-  public void finalize() throws Throwable {
-    super.finalize();
+  public void stop() {
   timer.cancel();
-    //TODO find a better cycle from Hibernate core
+    try {
+      directory1.close();
+    }
+    catch (Exception e) {
+      log.error( "Unable to property close Lucene directory {}" + directory1.getFile(), e );
+    }
+    try {
+      directory2.close();
+    }
+    catch (Exception e) {
+      log.error( "Unable to property close Lucene directory {}" + directory2.getFile(), e );
+    }
 }
}

Modified: search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
   return directory;
 }

+  public void stop() {}
+
 @Override
 public boolean equals(Object obj) {
   // this code is actually broken since the value change after initialize call

Modified: search/trunk/src/test/org/hibernate/search/test/FSDirectoryTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/FSDirectoryTest.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/test/org/hibernate/search/test/FSDirectoryTest.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
   }
   s.getTransaction().commit();
   s.close();
+    getSessions().close(); //run the searchfactory.close() operations
 }

 public void testSearchOnDeletedIndex() throws Exception {

Modified: search/trunk/src/test/org/hibernate/search/test/HANTestCase.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/HANTestCase.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/test/org/hibernate/search/test/HANTestCase.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
 }

 protected void setUp() throws Exception {
-    if ( getSessions() == null || lastTestClass != getClass() ) {
+    if ( getSessions() == null || getSessions().isClosed() || lastTestClass != getClass() ) {
     buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
     lastTestClass = getClass();
   }

Modified: search/trunk/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
import org.apache.lucene.analysis.StopAnalyzer;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.Session;
+import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.event.PostDeleteEventListener;
import org.hibernate.event.PostInsertEventListener;
@@(protected) @@
   assertEquals("Third copy did not work out", 1, result.size() );

   fts2.close();
+    //run the searchfactory.close() operations
+    for ( SessionFactory sf : getSessionFactories() ) {
+      sf.close();
+    }
 }


@@(protected) @@

   File slave = new File(root, "slave");
   slave.mkdir();
-
+                                                      
   super.setUp();
 }


Modified: search/trunk/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
===================================================================
--- search/trunk/src/test/org/hibernate/search/test/worker/WorkerTestCase.java  2008-05-22 15:43:24 UTC (rev 14686)
+++ search/trunk/src/test/org/hibernate/search/test/worker/WorkerTestCase.java  2008-05-22 18:21:01 UTC (rev 14687)
@@(protected) @@
   while ( work.count < iteration - 1 ) {
     Thread.sleep( 20 );
   }
+    getSessions().close();
   System.out.println( iteration + " iterations (8 tx per iteration) in " + nThreads + " threads: " + ( System
       .currentTimeMillis() - start ) );
 }

_______________________________________________
hibernate-commits mailing list
hibernate-commits@(protected)
https://lists.jboss.org/mailman/listinfo/hibernate-commits
©2008 gg3721.com - Jax Systems, LLC, U.S.A.