Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7230:777131d76168 HEAD
When dropping last_uid fields, finish the search before removing them.
Otherwise lucene could crash.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 11 Feb 2008 21:41:41 +0200 |
parents | 586abf9b561c |
children | 0706d404a8fb |
files | src/plugins/fts-lucene/lucene-wrapper.cc |
diffstat | 1 files changed, 21 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts-lucene/lucene-wrapper.cc Mon Feb 11 20:47:45 2008 +0200 +++ b/src/plugins/fts-lucene/lucene-wrapper.cc Mon Feb 11 21:41:41 2008 +0200 @@ -2,6 +2,7 @@ extern "C" { #include "lib.h" +#include "array.h" #include "env-util.h" #include "unichar.h" #include "str.h" @@ -283,6 +284,8 @@ static int lucene_index_get_last_uid_int(struct lucene_index *index, bool delete_old) { + ARRAY_TYPE(uint32_t) delete_doc_ids; + uint32_t del_id; int ret = 0; bool deleted = false; @@ -304,6 +307,8 @@ query.add(&mailbox_query, true, false); query.add(&last_uid_query, true, false); + t_push(); + t_array_init(&delete_doc_ids, 10); int32_t last_doc_id = -1; try { Hits *hits = index->searcher->search(&query); @@ -317,19 +322,28 @@ break; } - int32_t del_id = -1; if (uid > index->last_uid) { - if (last_doc_id >= 0) + if (last_doc_id >= 0) { del_id = last_doc_id; + array_append_i(&delete_doc_ids.arr, + (void *)&del_id, 1); + } index->last_uid = uid; last_doc_id = hits->id(i); } else { del_id = hits->id(i); + array_append_i(&delete_doc_ids.arr, + (void *)&del_id, 1); } - if (del_id >= 0 && delete_old) { - index->reader->deleteDocument(del_id); - deleted = true; - } + } + if (delete_old && array_count(&delete_doc_ids) > 0) { + const uint32_t *ids; + unsigned int i, count; + + ids = array_get(&delete_doc_ids, &count); + for (i = 0; i < count; i++) + index->reader->deleteDocument(ids[i]); + deleted = true; } index->lock_error = FALSE; _CLDELETE(hits); @@ -343,6 +357,7 @@ before opening a writer */ lucene_index_close(index); } + t_pop(); return ret; }