[Dovecot] 1.0-test25 with new cache file code
Timo Sirainen
tss at iki.fi
Mon Jul 5 01:47:28 EEST 2004
http://dovecot.org/test/
Pretty much the only change since test24 is a redesign of how cache
file writing works. Reading works as before - without locks.
Before (in 1.0-tests, 0.99 was worse) we used to just try to lock it.
If it failed, we just didn't update cache. If it didn't fail, the lock
could have been kept a long time. For example if a user was downloading
a 10MB mail, the lock could have been kept the whole time and no-one
else could have modified the cache.
The old behaviour wasn't actually too bad, as normally it didn't matter
if something couldn't be written to cache. It would have been the next
time, all it did was cost some I/O.
The new behaviour is more reliable as the locks are kept only a very
short time. It works by first writing the updates only into internal
32kB buffer. Once the buffer gets full, or the transaction completes,
it's written to disk. When buffer gets full, space is reserved from the
cache file for the current transaction. The amount of space is more
than is needed for writing the internal buffer, so we don't have to
lock the cache file every time the buffer gets full (and so we don't
need a huge buffer).
Once transaction completes, we lock the cache again and try to free the
extra reserved space we have left. If multiple processes weren't
updating the cache file at the same time, the freeing should be as
simple as decreasing "used_file_size" field in header. Alternatively
we'll update a linked list of "holes" in the file. When reserving
space, we first try to use those holes instead of appending to end of
file.
Pointers to new cache records are also written to transaction log at
the end of cache transaction. They'll get written to index at next sync
after which they become visible to other processes. Each cache record
contains a pointer to previous record, so there can be multiple cache
records for a single message.
The bad thing with the new logic is that nothing prevents two processes
from writing the same cache records and so using twice as much space as
necessary. But I don't think it's much of a problem. They'll go away at
next cache compression.
These changes also make it quite simple to make cache file work with
shared filesystems. I'd just need to implement some kind of internal
caching buffer which remembers what parts of file are read into memory.
These changes also make it possible to easily and reliably store X-UIDL
headers into cache file, where the POP3 UIDL command could quickly get
them. Not in this release yet, though..
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 186 bytes
Desc: This is a digitally signed message part
URL: <http://dovecot.org/pipermail/dovecot/attachments/20040705/4a6bee66/attachment-0001.bin>
More information about the dovecot
mailing list