diff options
author | David Green | 2013-10-26 01:49:40 +0000 |
---|---|---|
committer | David Green | 2013-10-26 01:49:40 +0000 |
commit | b7836ef3608f5e511420b0cb0e0958cc29cc6a6b (patch) | |
tree | 46e40bd07ec07ef148d5b2852763049df2f0fa12 /org.eclipse.mylyn.tasks.index.core | |
parent | 9c7ab4a6357cdacf9491a74f0d47772e2be63778 (diff) | |
download | org.eclipse.mylyn.tasks-b7836ef3608f5e511420b0cb0e0958cc29cc6a6b.tar.gz org.eclipse.mylyn.tasks-b7836ef3608f5e511420b0cb0e0958cc29cc6a6b.tar.xz org.eclipse.mylyn.tasks-b7836ef3608f5e511420b0cb0e0958cc29cc6a6b.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..861ecc614 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,17 @@ public class TaskListIndex implements ITaskDataManagerListener, ITaskListChangeL } if (writer == null) { - writer = new IndexWriter(directory, TaskAnalyzer.instance(), false, - IndexWriter.MaxFieldLength.UNLIMITED); + try { + writer = new IndexWriter(directory, TaskAnalyzer.instance(), false, + IndexWriter.MaxFieldLength.UNLIMITED); + } catch (CorruptIndexException e) { + rebuildIndex = true; + synchronized (reindexQueue) { + reindexQueue.clear(); + } + rebuildIndexCompletely(monitor); + return; + } } monitor.setWorkRemaining(workingQueue.size()); @@ -1202,8 +1212,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(); + } catch (CorruptIndexException e) { + if (directory instanceof FSDirectory) { + cleanDirectory(((FSDirectory) directory).getDirectory()); + writer = createIndexWriter(); + } else { + throw e; + } + } try { for (ITask task : taskListState.indexableTasks) { @@ -1230,6 +1249,24 @@ 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() throws CorruptIndexException, LockObtainFailedException, IOException { + return new IndexWriter(directory, TaskAnalyzer.instance(), true, IndexWriter.MaxFieldLength.UNLIMITED); + } + /** * @param writer * @param task |