You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2008/09/18 15:47:05 UTC
svn commit: r696656 -
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
Author: mreutegg
Date: Thu Sep 18 06:47:04 2008
New Revision: 696656
URL: http://svn.apache.org/viewvc?rev=696656&view=rev
Log:
JCR-1739: Do not use deletable anymore
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java?rev=696656&r1=696655&r2=696656&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/query/lucene/MultiIndex.java Thu Sep 18 06:47:04 2008
@@ -40,6 +40,7 @@
import javax.jcr.RepositoryException;
import java.io.IOException;
import java.io.File;
+import java.io.FileFilter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -106,7 +107,7 @@
/**
* Names of index directories that can be deleted.
*/
- private final IndexInfos deletable = new IndexInfos("deletable");
+ private final Set deletable = new HashSet();
/**
* List of open persistent indexes. This list may also contain an open
@@ -244,12 +245,9 @@
if (indexNames.exists(indexDir)) {
indexNames.read(indexDir);
}
- if (deletable.exists(indexDir)) {
- deletable.read(indexDir);
- }
- // try to remove deletable files if there are any
- attemptDelete();
+ // as of 1.5 deletable file is not used anymore
+ removeDeletable();
// initialize IndexMerger
merger = new IndexMerger(this);
@@ -312,6 +310,10 @@
// run recovery
Recovery.run(this, redoLog);
+ // enqueue unused segments for deletion
+ enqueueUnusedSegments();
+ attemptDelete();
+
// now that we are ready, start index merger
merger.start();
@@ -845,12 +847,9 @@
// remove it from the lists if index is registered
indexes.remove(index);
indexNames.removeName(index.getName());
- // during recovery it may happen that an index had already been marked
- // deleted, so we need to check if it is already marked deleted.
synchronized (deletable) {
- if (!deletable.contains(index.getName())) {
- deletable.addName(index.getName());
- }
+ log.debug("Moved " + index.getName() + " to deletable");
+ deletable.add(index.getName());
}
}
@@ -918,6 +917,26 @@
//-------------------------< internal >-------------------------------------
+ /**
+ * Enqueues unused segments for deletion in {@link #deletable}. This method
+ * does not synchronize on {@link #deletable}! A caller must ensure that it
+ * is the only one acting on the {@link #deletable} map.
+ */
+ private void enqueueUnusedSegments() {
+ // walk through index segments
+ File[] segmentDirs = indexDir.listFiles(new FileFilter() {
+ public boolean accept(File pathname) {
+ return pathname.isDirectory() && pathname.getName().startsWith("_");
+ }
+ });
+ for (int i = 0; i < segmentDirs.length; i++) {
+ String name = segmentDirs[i].getName();
+ if (!indexNames.contains(name)) {
+ deletable.add(name);
+ }
+ }
+ }
+
private void scheduleFlushTask() {
lastFlushTime = System.currentTimeMillis();
FLUSH_TIMER.schedule(flushTask, 0, 1000);
@@ -1060,20 +1079,26 @@
*/
private void attemptDelete() {
synchronized (deletable) {
- for (int i = deletable.size() - 1; i >= 0; i--) {
- String indexName = deletable.getName(i);
+ for (Iterator it = deletable.iterator(); it.hasNext(); ) {
+ String indexName = (String) it.next();
File dir = new File(indexDir, indexName);
if (deleteIndex(dir)) {
- deletable.removeName(i);
+ it.remove();
} else {
log.info("Unable to delete obsolete index: " + indexName);
}
}
- try {
- deletable.write(indexDir);
- } catch (IOException e) {
- log.warn("Exception while writing deletable indexes: " + e);
- }
+ }
+ }
+
+ /**
+ * Removes the deletable file if it exists. The file is not used anymore
+ * in Jackrabbit versions >= 1.5.
+ */
+ private void removeDeletable() {
+ File deletable = new File(indexDir, "deletable");
+ if (deletable.exists()) {
+ deletable.delete();
}
}