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