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 {