Deferred email with remote protocol error in reply
Ralf Haferkamp
rhafer at suse.de
Mon Oct 30 05:02:26 EST 2006
On Friday 27 October 2006 20:42, Wesley Craig wrote:
> On 27 Oct 2006, at 05:08, Libor Pechacek wrote:
> >> MAIL FROM:<lpechacek at fm.clnet.cz <mailto:lpechacek at suse.de>>
> >> SIZE=15311
> >> RCPT TO:<test at fm.clnet.cz <mailto:flow at tormore.hwlab.suse.de>>
> >> DATA
> >
> > < 250 2.1.0 ok
> > < 250 2.1.5 ok
> > < 354 go ahead
> >
> >> .
> >
> > < 7 lockers
> >
> > In this case the obvious reason for the error is the "7 lockers" line
> > that leaked from BDB. It makes only small harm itself but causes the
> > next message to be bounced due to protocol error in case the LMTP
> > connection is reused. Workaround to the bounces is simple -
> > "lmtp_cache_connection = no" in Postfix's main.cf.
>
> Here's where this happens in BDB 4.3.29:
>
> ./lock/lock_deadlock.c-418- *nlockers = 0;
> ./lock/lock_deadlock.c-419- return (0);
> ./lock/lock_deadlock.c-420- }
> ./lock/lock_deadlock.c-421-
> ./lock/lock_deadlock.c-422- if (FLD_ISSET(dbenv->verbose,
> DB_VERB_DEADLOCK))
> ./lock/lock_deadlock.c:423: __db_msg(dbenv, "%lu
> lockers", (u_long)count);
> ./lock/lock_deadlock.c-424-
> ./lock/lock_deadlock.c-425- count += 20;
> ./lock/lock_deadlock.c-426- nentries = (u_int32_t)DB_ALIGN(count,
> 32) / 32;
> ./lock/lock_deadlock.c-427-
> ./lock/lock_deadlock.c-428- /*
>
> So, first thing is that the message shouldn't be written if this
> DB_VERB_DEADLOCK isn't set. Quickly skimming the BDB code, it
> doesn't appear that this defaults on. I'm wondering if you have:
>
> set_verbose db_verb_deadlock
>
> in your DB_CONFIG file? Once it's on, I don't see a way to turn it
> off, other than calling the set_verbose method from within Cyrus.
cyrus turns on DB_VERB_DEADLOCK itself. See lib/cyrusdb_berkely.c. It seems
that one can turn that off via configure.in before building.
But the real problem turned out to be that with BDB 4.3.* they changed the
"n lockers" message from __db_err() to __db_msg(). To avoid having __db_msg()
messages printed on stdout one needs to install a callback handler with
dbenv->set_msgcall() in older versions dbenv->set_errcall() was enough to
redirect all messages away from stdout.
This problem was BTW fixed with cyrus-imapd-2.2.13. For details see e.g.:
https://bugzilla.andrew.cmu.edu/cgi-bin/cvsweb.cgi/src/cyrus/lib/cyrusdb_berkeley.c.diff?r1=1.10&r2=1.11
--
Ralf Haferkamp
SUSE LINUX Products GmbH, Maxfeldstrasse 5, D-90409 Nuernberg
T: +49-911-74053-0
F: +49-911-74053575 - Ralf.Haferkamp at suse.com
More information about the Info-cyrus
mailing list