*IMPORTANT* - bugfix sync_append_commit index breakage

David Carter dpc22 at cam.ac.uk
Fri Aug 31 12:51:35 EDT 2007

On Fri, 31 Aug 2007, Ken Murchison wrote:

> I think your patch makes sense, but I'm not sure when "The cyrus index 
> file format has this clever "ignore" junk at the end until the exists 
> count changes trick" means.  I know we leave junk in the cache file as a 
> result of delayed expunge which gets cleaned up later, but I'm pretty 
> sure the the index file is always tightly packed.  The is extra space in 
> the index header, but there shouldn't be any between the index records.

I think that the danger is that if sync_server gets shut down uncleanly 
(which I know was happening to Fastmail a lot at one point) then then you 
can end up with a bogus entry at the end of a cyrus.index file which is 
not overwritten by the next sync_append_commit() on that mailbox.

The race condition is that the exists count in the header can only be 
updated after the index record has been written.

An explicit seek using mailbox->exists is definitely more robust, although 
it probably doesn't help if power fails halfway through the fsync() on the 
cyrus.index file after both updates have been made (data=journal maybe?)

David Carter                             Email: David.Carter at ucs.cam.ac.uk
University Computing Service,            Phone: (01223) 334502
New Museums Site, Pembroke Street,       Fax:   (01223) 334679
Cambridge UK. CB2 3QH.

More information about the Cyrus-devel mailing list