Timo Sirainen [Fri, 15 Apr 2016 13:12:44 +0000 (16:12 +0300)]
lib-storage: Don't use same session ID for multiple mail_storage_service_next() calls.
dsync does multiple mail_storage_service_next() calls for the same
mail_storage_service_user. This causes stats plugin to send the same
session ID to stats process, which complains about duplicates. Solved this
in a generic way by having the following mail_storage_service_next() calls
append :counter to session ID.
Timo Sirainen [Mon, 25 Apr 2016 09:07:25 +0000 (12:07 +0300)]
imapc: Fixed crash caused by pool_unref() API change.
Calling pool_unref() set the mail_private->pool=NULL, which crashed in
index_mail_free(). Fixed this by removing the unnecessary ref/unref
entirely. We're already waiting in imapc_mail_close() for all the
existing FETCHes to finish, so the callback will always have only
valid mails with valid pools.
Timo Sirainen [Thu, 21 Apr 2016 15:51:57 +0000 (18:51 +0300)]
Split parts of lib-dict into lib-dict-extra.
Otherwise there's a circular dependency because lib-dict/dict-fs.c depends
on lib-fs, while lib-fs/fs-dict.c depends on lib-dict. This becomes a problem
when compiling --without-shared-libs, although for some reason it works for
me while linking the Dovecot core, but not when linking external plugins.
If inner MIME part had the same --boundary prefix as its parent(s) and
the MIME part body started with the inner --boundary prefix, we didn't yet
have it in the list of valid boundaries, so we thought that the outer
boundary was found and the MIME headers were truncated. But due to an extra
bug we still treated it as if it were the inner boundary, except the MIME
part sizes/offsets were set wrong.
This for example fixes a situation where FETCH [1.2.MIME] returns an extra
newline before the actual headers.
Timo Sirainen [Fri, 22 Apr 2016 13:28:56 +0000 (16:28 +0300)]
dsync: Determine better when rename-algorithm might have gotten stuck.
A hardcoded value of 100 isn't necessarily enough if there are a lot of
mailboxes with a lot of renames. Base the max count on the total number
of mailboxes on both local and remote. And just in case multiple it by 3.
Probably smaller number would be fine too.
Timo Sirainen [Wed, 20 Apr 2016 20:01:45 +0000 (23:01 +0300)]
lib: var_expand() now expands %{nonexistent} to UNSUPPORTED_VARIABLE_nonexistent
Earlier it was expanded to "nonexistent}", which looked more like a bug.
This change hopefully makes it clear enough to understand when a variable isn't
supported.
Timo Sirainen [Thu, 21 Apr 2016 21:21:12 +0000 (00:21 +0300)]
imapc: Added support for imapc_features=modseq
If the remote server supports CONDSTORE or QRESYNC extensions we'll use the
remote's MODSEQ and HIGHESTMODSEQ counts.
There are some situations where the HIGHESTMODSEQ isn't updated exactly
correctly on an open mailbox, so this feature shouldn't be fully relied on.
It was primarily implemented for dsync+imapc support - both for preserving
modseqs and also for HIGHESTMODSEQ lookups.
Lennart Weller [Tue, 22 Mar 2016 14:24:22 +0000 (10:24 -0400)]
Support multiple recipient_delimiters
The recipient_delimiter is treated as multiple one-character delimiters
rather than one multi-character delimiter if more than one character is
supplied. The address is split on the first character in
recipient_delimiter found.
Timo Sirainen [Tue, 19 Apr 2016 13:55:02 +0000 (16:55 +0300)]
lib-http: Include information about number of request attempts and its timing in response reason.
Because the reason is usually logged as part of the error string, this
causes all of the error messages to include the attempts count and how long
the requests took in total. This should make it easier to understand problems
in error logs.
http_client_request_set_preserve_exact_reason() can be used to disable
modifying the reason string. This may also apply to other reason
modifications that may be done in the future.
Timo Sirainen [Fri, 22 Apr 2016 17:10:34 +0000 (20:10 +0300)]
lib: Improved istream-timeout error message.
We're supposed to check that timeout isn't triggered after a long-running
code, but it's not perfect. So provide the actual timing information we
saw instead of the expected timeout.
Timo Sirainen [Tue, 19 Apr 2016 09:23:54 +0000 (12:23 +0300)]
lib: When istream is destroyed, it now always unrefs the parent istream if it exists.
This way the implementations don't have to do it themselves in their
destroy() function. This change doesn't necessarily require changing the
existing code, because if the istream implementation already unrefs the
parent it gets set to NULL so the auto-unref won't be done.
Timo Sirainen [Tue, 19 Apr 2016 21:29:49 +0000 (00:29 +0300)]
lib-index: Fixed calling mail_cache_open_and_verify() on an already open cache.
This was done at least by index_index_rebuild_init().
Either the currently open cache->fd was leaked, or if the cache file open()
failed we left the cache in an inconsistent state where cache->fd == -1, but
cache->hdr != NULL, so it caused MAIL_CACHE_IS_UNUSABLE() to also be TRUE. This
could have ended up in an assert:
Panic: file mail-index-lock.c: line 31 (mail_index_lock_fd): assertion failed: (MAIL_INDEX_IS_IN_MEMORY(index))
Stephan Bosch [Fri, 15 Apr 2016 21:59:24 +0000 (23:59 +0200)]
lib-http: client: Implemented means to set request payload buffer rather than an input stream.
This is not purely a convenience function: there have been bugs caused by allocating a data input stream from a datastack buffer.
With this function, the buffer is copied to the request pool, so that it is durably allocated while the request exists.
This prevents futher mishaps. The server already has an equivalent function for its response object.
Phil Carmody [Fri, 5 Feb 2016 13:55:15 +0000 (15:55 +0200)]
lib: test-bits - add fraclog test for most usual case, constant fracbits
Were there to be any difference between the constant and non-constant tests,
then it would be a compiler error, but it's better to be defensive and know
about that case.
Phil Carmody [Wed, 3 Feb 2016 17:18:21 +0000 (19:18 +0200)]
lib: test-bits - test the new fractional log helpers
Ensure that the beginning and end of every bucket range are both mapped
into that bucket. It also checks that the bucket ranges are contiguous.
Assuming the function's weakly monatonic, this is as good as testing
every single value.
Phil Carmody [Wed, 3 Feb 2016 16:34:13 +0000 (18:34 +0200)]
lib: bits - new fractional log-like helper
For stats gathering, where the data can have a wide range of values, you
don't necessarily need the same granularity along the full range of values.
For example, 1ms and 11ms latencies are very different, but 1.001s and
1.011s latencies are not worth distinguishing. Something logarithmic seems
more apt. Simply looking at power-of-2 sized bands (e.g. doing log2(n)),
however, is too granular, so these new helpers let you specify how fine
to (linearly) subdivide each of those bands. 1 fractional bit splits
each power of 2 band into 2 halves. 2 fractional bits splits each power
of 2 band into 4 quarters, and so on. 0 fractional bits is just log2().
Exact identification of percentiles is impossible, but it was anyway, as you
simply cannot store all the data required to calculate them. However, a mere
896 buckets will permit you to have 32 bands per power of 2, 5 fracional bits.
The above example would have buckets such as 2.432s-2.496s, and 55.3s-56.3s.
Assuming smooth distribution lets you calculate percentiles more accurately,
just assume within each bucket is a trapezial distribution. This holds even
if the distribution is multi-modal, which it will be. However, maths required.
Phil Carmody [Wed, 3 Feb 2016 15:33:05 +0000 (17:33 +0200)]
lib: array - new copy-making array iterator
Previously macros took a pointer, and that pointer was made to pointed
to each element of the array in turn. Typical use cases for things like
char* or struct* arrays were to immediately/repeatedly, dereference that
pointer.
This new iter (only one implementation done so far, more a proof of
concept) gets rid of the user-visable pointer, and performs the
dereference every time, and only when, a valid element is being
iterated over. Empty array => no assignment. No U.B.
NOTE: This cannot be done without assuming C99. It breaks the build
on compilers that old if any components that are enabled use the
macro. It strongly suggests we just need to make C99 mandatory.
If this is explicitly set to yes or no, it overrides the global auth_verbose
setting. However, auth_debug=yes overrides all of the auth_verbose settings.
Timo Sirainen [Fri, 15 Apr 2016 12:01:20 +0000 (15:01 +0300)]
lib-stats: Handle better write() to stats process failing with EAGAIN
It only means that the stats process is too busy and the FIFO is filled up.
Retrying the write later should work. We also don't want to log too much about
the same warning, so do it only once per 30 seconds.