[dev] assertion failed: mailbox.c: 2180: !message_guid_isnull(&record->guid)
Michael M Slusarz
slusarz at horde.org
Wed Nov 21 19:59:32 UTC 2012
Quoting Jan Schneider <jan at horde.org>:
> Zitat von Jan Schneider <jan at horde.org>:
>
>> Zitat von Bron Gondwana <brong at fastmail.fm>:
>>
>>> On Tue, Nov 20, 2012, at 07:15 PM, Aleksander Machniak wrote:
>>>> On 11/20/2012 04:07 PM, steffo76 at gmx.de wrote:
>>>>>> 1353423361>* BYE Fatal error: Internal error: assertion failed:
>>>>>> mailbox.c: 2180: !message_guid_isnull(&record->guid)^M
>>>>
>>>> I created a ticket for this yesterday.
>>>> https://bugzilla.cyrusimap.org/show_bug.cgi?id=3755. It looks like a bug
>>>> with APPEND + BINARY implementation.
>>>
>>> I'll have a look soon, promise! I'd like to get a fix into 2.4.17
>>> and release it super-soon. There are a couple of people who have
>>> seen it recently. Did some client switch to using BINARY APPEND?
>>
>> The Horde_Imap_Client library did.
>>
>>> Definitely a bug!
>>>
>>> I'm in the process of moving country this week, so I'm only online
>>> sporadically...
>>>
>>> Bron.
>>
>
> Bron just fixed this in Cyrus, but since this affects major
> functionality (saving sent-mail and drafts) with a version of a
> major IMAP server that is shipped with major distributions, can we
> workaround this bug? It looks like it is triggered with BINARY
> APPEND only.
F***. This is not something that can be easily worked around without
totally destroying performance. Here's why:
1. Previous scanning for null's in data could be accomplished by doing
a strpos(). This is fast, but requires the full message data to be
stored in PHP memory (which is bad as it can cause memory fatal errors).
2. To fix memory usage, data needs to be stored in streams.
3. Now, to search for nulls, we use a stream filter
(Horde_Imap_Client_Data_Format_Filter_String). This stream filter
unfortunately has fairly deplorable performance.
Example: To import a 20MB mbox file in IMP, it would take 30-40
seconds to process.
4. Since #2 can't be reversed, which means going back to #1 is not an
option, a workaround (implemented in Horde_Imap_Client 2.2.0) is to
skip null scanning of the input data and simply output the data as-is.
The reasoning:
- if BINARY is available, we know the server can handle null data
so we can just activate binary literals and output the raw data.
- if BINARY is not available, there's nothing we can do if the data
contains a null character since there is no workaround. So we just
output to the server and hope for the best (it is possible that some
servers could handle that data, or at least ignore the nulls)
These optimizations reduce the time required to import a 20MB mbox
file by a factor of 10.
I think the current method of working around this is still the correct
method (try with BINARY; re-do if the APPEND fails). I see that you
implemented a hotfix (1220a7ed6888eb61d29d8e1228d216dac3e2bb97), but
this hotfix is too broad. NO is a perfectly valid (and possibly
expected) response code from APPEND so we can't lump that in with
BAD/BYE responses.
michael
___________________________________
Michael Slusarz [slusarz at horde.org]
More information about the dev
mailing list