changeset 17739:5f8cff646417

fts-lucene: Make sure Lucene indexes are always closed at deinit to avoid memory leaks. At least optimize leaked memory.
author Timo Sirainen <tss@iki.fi>
date Thu, 21 Aug 2014 14:46:47 +0200
parents 5832a9ed3ece
children 9cdf42df4c4b
files src/plugins/fts-lucene/lucene-wrapper.cc
diffstat 1 files changed, 26 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/plugins/fts-lucene/lucene-wrapper.cc	Thu Aug 21 11:40:51 2014 +0200
+++ b/src/plugins/fts-lucene/lucene-wrapper.cc	Thu Aug 21 14:46:47 2014 +0200
@@ -97,6 +97,8 @@
 static bool textcat_broken = FALSE;
 static int textcat_refcount = 0;
 
+static void lucene_handle_error(struct lucene_index *index, CLuceneError &err,
+				const char *msg);
 static void rescan_clear_unseen_mailboxes(struct lucene_index *index,
 					  struct rescan_context *rescan_ctx);
 
@@ -141,9 +143,23 @@
 
 void lucene_index_close(struct lucene_index *index)
 {
-	_CLDELETE(index->reader);
-	_CLDELETE(index->writer);
 	_CLDELETE(index->searcher);
+	if (index->writer != NULL) {
+		try {
+			index->writer->close();
+		} catch (CLuceneError &err) {
+			lucene_handle_error(index, err, "IndexWriter::close");
+		}
+		_CLDELETE(index->writer);
+	}
+	if (index->reader != NULL) {
+		try {
+			index->reader->close();
+		} catch (CLuceneError &err) {
+			lucene_handle_error(index, err, "IndexReader::close");
+		}
+		_CLDELETE(index->reader);
+	}
 }
 
 void lucene_index_deinit(struct lucene_index *index)
@@ -852,12 +868,11 @@
 				index->reader->deleteDocument(hits->id(i));
 		}
 		_CLDELETE(hits);
-		index->reader->close();
-		lucene_index_close(index);
 	} catch (CLuceneError &err) {
 		lucene_handle_error(index, err, "rescan search");
 		failed = true;
 	}
+	lucene_index_close(index);
 	if (ctx.box != NULL)
 		rescan_finish(&ctx);
 	array_free(&ctx.uids);
@@ -965,14 +980,7 @@
 		}
 	}
 
-	try {
-		if (index->reader != NULL)
-			index->reader->close();
-		lucene_index_close(index);
-	} catch (CLuceneError &err) {
-		lucene_handle_error(index, err, "expunge delete");
-		ret = -1;
-	}
+	lucene_index_close(index);
 
 	ret2 = fts_expunge_log_read_end(&ctx);
 	if (ret < 0 || ret2 < 0)
@@ -997,6 +1005,12 @@
 		lucene_handle_error(index, err, "IndexWriter::optimize()");
 		ret = -1;
 	}
+	try {
+		writer->close();
+	} catch (CLuceneError &err) {
+		lucene_handle_error(index, err, "IndexWriter::close()");
+		ret = -1;
+	}
 	if (writer != NULL)
 		_CLDELETE(writer);
 	return ret;