Mercurial > dovecot > original-hg > dovecot-2.2
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;