Murder confusion -- two mupdate slaves, lmtpproxyd's always connecting to master
Michael Bacon
baconm at email.unc.edu
Tue Nov 10 11:51:42 EST 2009
First off, thank you to everyone who's chimed in with extremely helpful
suggestions in response to my previous message. Some of them have helped
performance, and others mysteriously haven't when I really thought they
would, but it's been very helpful for me in untying this knot. I've been
too busy with a cranky service to respond to everyone personally, but
please know it's appreciated.
I have two questions regarding the Murder architecture. The first is just
a general annoyance at the way master starts up the mupdate processes. In
order to get master to fire off anything, you have to set prefork=1.
However, the result of this is that you generate one mupdate, it reports as
unavailable to the master, and so the master fires off another one. These
two seem to fight with each other over connections to the mupdate master,
over locks to the mailboxes database, and over who gets to serve
connections. I don't think more than one is needed from what I can tell,
but you get two just out of the master architecture. Do I really need two,
and if not, is there some way to keep more than one from starting up?
(maxchild=1 does not do the trick for whatever reason. I'm still
deciphering code on this one.)
The second one is that the code for lmtpproxyd very explicitly connects to
the mupdate master rather than the local slave. I can't really figure out
why it would do this, but here are the two relevant snippets from lmtpd.c:
This is from service_init:
if (config_mupdate_server &&
(config_mupdate_config == IMAP_ENUM_MUPDATE_CONFIG_STANDARD) &&
!config_getstring(IMAPOPT_PROXYSERVERS)) {
/* proxy only -- talk directly to mupdate master */
r = mupdate_connect(config_mupdate_server, NULL, &mhandle, NULL);
if (r) {
syslog(LOG_ERR, "couldn't connect to MUPDATE server %s: %s",
config_mupdate_server, error_message(r));
fatal("error connecting with MUPDATE server", EC_TEMPFAIL);
}
}
and it appears that this runs every time a message delivery is attempted:
static int mlookup(const char *name, char **server, char **aclp, void *tid)
{
int r, type;
if (server) *server = NULL;
if (mhandle) {
/* proxy only, so check the mupdate master */
struct mupdate_mailboxdata *mailboxdata;
/* find what server we're sending this to */
r = mupdate_find(mhandle, name, &mailboxdata);
In short, it looks like, unlike proxyd and pop3proxyd, lmtpproxyd never
even bothers to check the local mailboxes database, and when it wants an
answer, feels the need to go directly to the mupdate master, rather than
querying the handy dandy local slave. Is this intentional? Why can't it
use the local cache?
Thanks much,
Michael Bacon
UNC Chapel Hill
More information about the Info-cyrus
mailing list