dovecot-2.2: fts-lucene: Make sure Lucene indexes are always clo...

dovecot at dovecot.org dovecot at dovecot.org
Thu Aug 21 12:49:48 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/5f8cff646417
changeset: 17739:5f8cff646417
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Aug 21 14:46:47 2014 +0200
description:
fts-lucene: Make sure Lucene indexes are always closed at deinit to avoid memory leaks.
At least optimize leaked memory.

diffstat:

 src/plugins/fts-lucene/lucene-wrapper.cc |  38 +++++++++++++++++++++----------
 1 files changed, 26 insertions(+), 12 deletions(-)

diffs (81 lines):

diff -r 5832a9ed3ece -r 5f8cff646417 src/plugins/fts-lucene/lucene-wrapper.cc
--- 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;


More information about the dovecot-cvs mailing list