diff options
| -rw-r--r-- | usr.sbin/smtpd/ramqueue.c | 14 | ||||
| -rw-r--r-- | usr.sbin/smtpd/runner.c | 11 |
2 files changed, 16 insertions, 9 deletions
diff --git a/usr.sbin/smtpd/ramqueue.c b/usr.sbin/smtpd/ramqueue.c index 8d21afb75f3..929c9cd6ab6 100644 --- a/usr.sbin/smtpd/ramqueue.c +++ b/usr.sbin/smtpd/ramqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ramqueue.c,v 1.29 2012/01/12 22:00:21 gilles Exp $ */ +/* $OpenBSD: ramqueue.c,v 1.30 2012/01/12 22:40:16 gilles Exp $ */ /* * Copyright (c) 2011 Gilles Chehade <gilles@openbsd.org> @@ -133,7 +133,7 @@ ramqueue_load(struct ramqueue *rqueue, time_t *nsched) while (qwalk(q, &evpid)) { curtm = time(NULL); if (! queue_envelope_load(Q_QUEUE, evpid, &envelope)) { - log_debug("failed to load envelope"); + log_debug("ramqueue: moved envelope to /corrupt"); queue_message_corrupt(Q_QUEUE, evpid_to_msgid(evpid)); continue; } @@ -141,10 +141,14 @@ ramqueue_load(struct ramqueue *rqueue, time_t *nsched) continue; ramqueue_insert(rqueue, &envelope, curtm); - rq_evp = TAILQ_FIRST(&rqueue->queue); - *nsched = rq_evp->sched; + rq_evp = ramqueue_next_envelope(rqueue); + if (rq_evp == NULL) + continue; + + if (rq_evp->sched <= *nsched) + *nsched = rq_evp->sched; - if (rq_evp->sched <= *nsched) { + if (*nsched <= curtm) { log_debug("ramqueue: loading interrupted"); return (0); } diff --git a/usr.sbin/smtpd/runner.c b/usr.sbin/smtpd/runner.c index 7c41816d17e..f551856a8f3 100644 --- a/usr.sbin/smtpd/runner.c +++ b/usr.sbin/smtpd/runner.c @@ -1,4 +1,4 @@ -/* $OpenBSD: runner.c,v 1.128 2012/01/12 22:00:21 gilles Exp $ */ +/* $OpenBSD: runner.c,v 1.129 2012/01/12 22:40:16 gilles Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -297,6 +297,8 @@ runner_timeout(int fd, short event, void *p) time_t curtm; nsched = 0; + +again: rq_evp = ramqueue_first_envelope(rqueue); if (rq_evp) nsched = rq_evp->sched; @@ -307,7 +309,6 @@ runner_timeout(int fd, short event, void *p) if (! rq_done) rq_done = ramqueue_load(rqueue, &nsched); - /* let's do the schedule dance baby ! */ curtm = time(NULL); rq_evp = ramqueue_next_envelope(rqueue); @@ -320,8 +321,7 @@ runner_timeout(int fd, short event, void *p) rq_evp = ramqueue_next_envelope(rqueue); } - if (rq_evp == NULL || - (rq_done && ramqueue_is_empty(rqueue))) { + if (rq_evp == NULL && rq_done) { log_debug("runner: nothing to schedule, wake me up. zZzZzZ"); return; } @@ -335,6 +335,9 @@ runner_timeout(int fd, short event, void *p) nsched = 0; } + if (nsched == 0) + goto again; + log_debug("runner: nothing to do for the next %lld seconds, zZzZzZ", (long long int) nsched); |
