Author: dspicar
Date: Thu Aug  4 21:11:55 2011
New Revision: 1154017

URL: http://svn.apache.org/viewvc?rev=1154017&view=rev
Log:
CLEREZZA-564: applied patch that allows to shedule CRIS index optimization and 
the optimization is run in an extra thread

Modified:
    
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
    
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/LuceneTools.java

Modified: 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java?rev=1154017&r1=1154016&r2=1154017&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
 (original)
+++ 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/GraphIndexer.java
 Thu Aug  4 21:11:55 2011
@@ -26,6 +26,8 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import org.apache.clerezza.rdf.core.NonLiteral;
@@ -96,8 +98,21 @@ public class GraphIndexer extends Resour
        private final GraphListener typeChangeListener;
        private final GraphListener indexedPropertyChangeListener;
        private Map<SortFieldArrayWrapper, Sort> sortCache = new 
HashMap<SortFieldArrayWrapper, Sort>();
+       private Timer timer = new Timer();
+       private final OptimizationTask optimizationTask = new 
OptimizationTask();
        
-       
+       /**
+        * Allows to schedule optimizations using a Timer.
+        * 
+        * NOTE: not for public access as this functionality is likely to be 
moved
+        * into a stand-alone service.
+        */
+       private class OptimizationTask extends TimerTask {
+               @Override
+               public void run() {
+                       optimizeIndex();
+               }
+       }
        
        /**
         * When resources are (re)-indexed, 
@@ -513,15 +528,33 @@ public class GraphIndexer extends Resour
 
        @Override
        public void optimizeIndex() {
-               try {
-                       luceneTools.getIndexWriter(false).optimize();
-               } catch (CorruptIndexException ex) {
-               } catch (IOException ex) {
-               } finally {
-                       luceneTools.commitChanges();
+               luceneTools.optimizeIndex();
+       }
+       
+       /**
+        * Schedule optimizations for repeated executions.
+        * 
+        * @param delay 
+        *              The delay before the first execution in milliseconds.
+        * @param period 
+        *              Time between successive executions (execution rate) in 
milliseconds.
+        */
+       public void scheduleIndexOptimizations(long delay, long period) {
+               if(timer != null) {
+                       timer.cancel();
                }
-
+               timer = new Timer();
+               timer.scheduleAtFixedRate(optimizationTask, delay, period);
        }
+       
+       /**
+        * Cancel scheduled optimizations. This call does not have any effect on
+        * optimizations that are being executed while the method is called.
+        */
+       public void terminateIndexOptimizationSchedule() {
+               timer.cancel();
+               timer = null;
+       } 
 
        @Override
        public void reCreateIndex() {

Modified: 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/LuceneTools.java
URL: 
http://svn.apache.org/viewvc/incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/LuceneTools.java?rev=1154017&r1=1154016&r2=1154017&view=diff
==============================================================================
--- 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/LuceneTools.java
 (original)
+++ 
incubator/clerezza/trunk/parent/rdf.cris/core/src/main/java/org/apache/clerezza/rdf/cris/LuceneTools.java
 Thu Aug  4 21:11:55 2011
@@ -21,6 +21,8 @@ package org.apache.clerezza.rdf.cris;
 
 import java.io.File;
 import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.index.CorruptIndexException;
 import org.apache.lucene.index.IndexReader;
@@ -47,6 +49,7 @@ public class LuceneTools {
        private IndexWriter indexWriter = null;
        private Analyzer analyzer = null;
        private File luceneIndexDir = null;
+       private boolean optimizeInProgress = false;
 
        /**
         * Wraps an IndexWriter to ensure that is it closed properly.
@@ -76,11 +79,13 @@ public class LuceneTools {
 
                @Override
                public void close() throws CorruptIndexException, IOException {
-                       super.close();
-                       invokeClose = false;
+                       if(!optimizeInProgress) {
+                               super.close();
+                               invokeClose = false;
+                       }
                }
        }
-
+       
        /**
         * Constructor.
         * 
@@ -131,22 +136,17 @@ public class LuceneTools {
         */
        public void closeIndexWriter() {
                try {
-                       if(indexWriter != null) {
-                               //when should optimize be called?
-                               try {
-                                       
if(!indexWriter.getReader().isOptimized()) {
-                                               indexWriter.optimize();
-                                       }
-                               } finally {
-                                       indexWriter.close();
-                               }
+                       if(indexWriter != null && !optimizeInProgress) {
+                               indexWriter.close();
                        }
                } catch (IOException ex) {
                        logger.error(ex.getMessage());
                } catch(AlreadyClosedException ex) {
                        logger.warn("IndexWriter already closed.");
                } finally {
-                       indexWriter = null;
+                       if(!optimizeInProgress) {
+                               indexWriter = null;
+                       }
                }
        }
 
@@ -156,8 +156,10 @@ public class LuceneTools {
         */
        public IndexSearcher getIndexSearcher() throws RuntimeException {
                try {
-                       if (indexSearcher != null && 
indexSearcher.getIndexReader().isCurrent()) {
-                               return indexSearcher;
+                       if(indexSearcher != null) {
+                               if (indexSearcher.getIndexReader().isCurrent() 
|| optimizeInProgress) {
+                                       return indexSearcher;
+                               }
                        }
                        if (IndexReader.indexExists(indexDirectory)) {
                                indexSearcher = new 
IndexSearcher(indexDirectory, true);
@@ -199,6 +201,46 @@ public class LuceneTools {
                return this.analyzer;
        }
        
+       /**
+        * Starts index optimization. Optimization is started in a separate 
thread.
+        * This method does not wait for optimization to finish but returns 
immediately 
+        * after starting the optimize thread.
+        */
+       synchronized public void optimizeIndex() {
+               if(optimizeInProgress) {
+                       return;
+               }
+               new Thread(new Runnable() {
+                       @Override
+                       public void run() {
+                               optimizeInProgress = true;
+                               long id = Thread.currentThread().getId();
+                               Thread.currentThread().setName("CRIS Optimize 
Thread[" + id + "]");
+                               logger.info("Starting index optimization.");
+                               AccessController.doPrivileged(new 
PrivilegedAction<Void>() {
+
+                                       @Override
+                                       public Void run() {
+                                               try {
+                                                       
getIndexWriter().optimize(true);
+                                                       commit();
+                                                       logger.info("Index 
optimized.");
+                                               } catch(IOException ex) {
+                                                       
logger.error(ex.getMessage());
+                                                       throw new 
RuntimeException("Could not optimize index.", ex);
+                                               } catch(OutOfMemoryError ex) {
+                                                       
logger.error(ex.getMessage());
+                                               } finally {
+                                                       optimizeInProgress = 
false;
+                                                       closeIndexWriter();
+                                               }
+                                               return null;
+                                       }
+                               });
+                       }
+               }).start();
+       }
+       
        @Override
        protected void finalize() throws Throwable {
                try {


Reply via email to