Re: [Exim] How to get the queue-runner to unfreeze messages?…

Page principale
Supprimer ce message
Répondre à ce message
Auteur: Owen Boyle
Date:  
À: exim
Sujet: Re: [Exim] How to get the queue-runner to unfreeze messages? - BugFix?
Tamas TEVESZ wrote:
>
> > Any way to force the queue-runner to deliver frozen messages?
>
> look around auto_thaw


Thanks Tamas - auto_thaw worked nicely.

However... I began to wonder why my original solution wouldn't work.
That is, if I started exim like this:

    /usr/exim/bin/exim -bd -qff 15m


I found in the logs:

    2002-05-16 10:25:55 Start queue run: pid=21255 -qf


And messages stayed frozen. What happened to the second "f" which is
supposed to force-thaw?

Anyway, I had a look in the source and found that the presence of a
second "f" sets the global "deliver_force_thaw" which has to be set for
the queue-runner to attempt delivery of frozen messages. When the daemon
starts the queue-runner, it does so by rebuilding the argv[] array then
doing an execv() to run a second instance of itself. Since this is not a
fork, it doesn't inherit the globals, which is why the argument list
gets rebuilt.

However, the second "f" was not copied to the argument list which is why
it didn't make it into the queue-runner process.

Is this a bug? I can't think of any reason why you'd want to suppress
passing the force-thaw option in the queue-runner... Anyway, sticking in
the appropriate line (see below) got the "f" back and force-thawing
works in the queue-runner now.

Rgds,

Owen Boyle

Bug Details:
--------------------------------------------------------------
Version: Exim 3.36
program: src/daemon.c

Description:

When exim is started with the options "-bd -qff", subsequent queue-runs
execute only with the options "-qf". Thus force-thawing (as defined by
the second "f") is not enabled.

Analysis:

Before execv() on line 1126, certain globals are used to set option
switches. However, the global, deliver_force_thaw, is omitted from the
list. Adding the line marked below, re-instates it:

    if (queue_2stage) *p++ = 'q';
    if (queue_run_force) *p++ = 'f';

>>>>    if (deliver_force_thaw) *p++ = 'f';

    if (queue_run_local) *p++ = 'l';


Patch:

1122a1123
>           if (deliver_force_thaw) *p++ = 'f';


--------------------------------------------------------------