diff options
author | David Green | 2013-10-26 01:49:40 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2014-02-07 21:50:08 +0000 |
commit | 4ef9f9a67d1156d86b3c82cbc26b4e3473319512 (patch) | |
tree | 75fe486ffd1ce13d38626f78c08464222ead9dc8 /org.eclipse.mylyn.tasks.index.core | |
parent | aeac2f595cdaa29118c9157783c0bdb86e3a9e99 (diff) | |
download | org.eclipse.mylyn.tasks-4ef9f9a67d1156d86b3c82cbc26b4e3473319512.tar.gz org.eclipse.mylyn.tasks-4ef9f9a67d1156d86b3c82cbc26b4e3473319512.tar.xz org.eclipse.mylyn.tasks-4ef9f9a67d1156d86b3c82cbc26b4e3473319512.zip |
415140: CorruptIndexException in tasklist index
Change-Id: Ia0c6ac54f23f90e32d157f5deba34b3d322aa3c4
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=415140
Diffstat (limited to 'org.eclipse.mylyn.tasks.index.core')
-rw-r--r-- | org.eclipse.mylyn.tasks.index.core/src/org/eclipse/mylyn/internal/tasks/index/core/TaskListIndex.java | 47 |
1 files changed, 42 insertions, 5 deletions
diff --git a/org.eclipse.mylyn.tasks.index.core/src/org/eclipse/mylyn/internal/tasks/index/core/TaskListIndex.java b/org.eclipse.mylyn.tasks.index.core/src/org/eclipse/mylyn/internal/tasks/index/core/TaskListIndex.java index 153c5df9a..119ab2de6 100644 --- a/org.eclipse.mylyn.tasks.index.core/src/org/eclipse/mylyn/internal/tasks/index/core/TaskListIndex.java +++ b/org.eclipse.mylyn.tasks.index.core/src/org/eclipse/mylyn/internal/tasks/index/core/TaskListIndex.java @@ -54,6 +54,7 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.TopDocs; import org.apache.lucene.store.Directory; +import org.apache.lucene.store.FSDirectory; import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.store.NIOFSDirectory; import org.apache.lucene.util.Version; @@ -1118,7 +1119,7 @@ public class TaskListIndex implements ITaskDataManagerListener, ITaskListChangeL } private void indexQueuedTasks(SubMonitor monitor) throws CorruptIndexException, LockObtainFailedException, - IOException { + IOException, CoreException { synchronized (reindexQueue) { if (reindexQueue.isEmpty()) { @@ -1148,8 +1149,16 @@ public class TaskListIndex implements ITaskDataManagerListener, ITaskListChangeL } if (writer == null) { - writer = new IndexWriter(directory, TaskAnalyzer.instance(), false, - IndexWriter.MaxFieldLength.UNLIMITED); + try { + writer = createIndexWriter(false); + } catch (CorruptIndexException e) { + rebuildIndex = true; + synchronized (reindexQueue) { + reindexQueue.clear(); + } + rebuildIndexCompletely(monitor); + return; + } } monitor.setWorkRemaining(workingQueue.size()); @@ -1202,8 +1211,17 @@ public class TaskListIndex implements ITaskDataManagerListener, ITaskListChangeL monitor.beginTask(Messages.TaskListIndex_task_rebuilding_index, taskListState.indexableTasks.size()); try { - final IndexWriter writer = new IndexWriter(directory, TaskAnalyzer.instance(), true, - IndexWriter.MaxFieldLength.UNLIMITED); + IndexWriter writer; + try { + writer = createIndexWriter(true); + } catch (CorruptIndexException e) { + if (directory instanceof FSDirectory) { + cleanDirectory(((FSDirectory) directory).getFile()); + writer = createIndexWriter(true); + } else { + throw e; + } + } try { for (ITask task : taskListState.indexableTasks) { @@ -1230,6 +1248,25 @@ public class TaskListIndex implements ITaskDataManagerListener, ITaskListChangeL return multiStatus; } + private void cleanDirectory(File file) throws IOException { + if (file.exists()) { + File[] children = file.listFiles(); + if (children != null) { + for (File child : children) { + if (child.isDirectory()) { + cleanDirectory(child); + } + child.delete(); + } + } + } + } + + protected IndexWriter createIndexWriter(boolean create) throws CorruptIndexException, LockObtainFailedException, + IOException { + return new IndexWriter(directory, TaskAnalyzer.instance(), create, IndexWriter.MaxFieldLength.UNLIMITED); + } + /** * @param writer * @param task |