On Sun, 23 Dec 2007, David Carter wrote:

Rather more fundamental: "reconstruct -k" copies expunge.index records verbatim, without making any effort to update offsets into cyrus.cache. These offsets are used by both "cyr_expire -X" and "unexpunge".

[...]

I know how I plan to fix this problem: reconstruct needs to rebuild
cyrus.index and expunge in parallel, rather like sync_combine_commit().
However this will be a rewrite of reconstruct.c, not a one line fix.

Here is a replacement reconstruct:

http://www-uxsup.csx.cam.ac.uk/~dpc22/cyrus/patches/2.3cvs/reconstruct-rewrite-expunge.patch

reconstruct_read_index_record() is a bit of an embarrassment. It is just mailbox_read_index_record_from_mapped() without a mailbox, as start_offset and record size will be invalid if the cyrus.index file is toast.

We really need clean separation between routines which go digging around inside mmap()ed files (and inherently trust the data they see there), and the level up which works with struct mailbox and struct index_record objects. I suspect that this is where Bron's CRC32 stuff is heading.

A number of the support routines are derived from sync_commit.c: some scope for refactoring there.

--
David Carter                             Email: [EMAIL PROTECTED]
University Computing Service,            Phone: (01223) 334502
New Museums Site, Pembroke Street,       Fax:   (01223) 334679
Cambridge UK. CB2 3QH.

Reply via email to