diff options
author | 2012-11-02 14:46:43 +0000 | |
---|---|---|
committer | 2012-11-02 14:46:43 +0000 | |
commit | be215280c6b32fa05178766fcb1a2d4fb17b3ace (patch) | |
tree | dc0bcb89b07476bf7d3958891372925d43c6ba17 | |
parent | Watch the non-privileged end of the pipe to the privileged child (diff) | |
download | wireguard-openbsd-be215280c6b32fa05178766fcb1a2d4fb17b3ace.tar.xz wireguard-openbsd-be215280c6b32fa05178766fcb1a2d4fb17b3ace.zip |
Make counters more informative in the scheduler:
- Change the scheduler backend API a bit: commit() and rollback()
API calls return the number of envelopes added or canceled; put
the number of envelopes in the structure returned by batch().
- Properly report the number of incoming, registered, removed and
expired envelopes, as well as the outcome of deliveries.
ok gilles@
-rw-r--r-- | usr.sbin/smtpd/scheduler.c | 46 | ||||
-rw-r--r-- | usr.sbin/smtpd/scheduler_ramqueue.c | 24 | ||||
-rw-r--r-- | usr.sbin/smtpd/smtpd.h | 7 |
3 files changed, 55 insertions, 22 deletions
diff --git a/usr.sbin/smtpd/scheduler.c b/usr.sbin/smtpd/scheduler.c index 104d2837542..feca49392a6 100644 --- a/usr.sbin/smtpd/scheduler.c +++ b/usr.sbin/smtpd/scheduler.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scheduler.c,v 1.21 2012/09/16 16:43:29 chl Exp $ */ +/* $OpenBSD: scheduler.c,v 1.22 2012/11/02 14:46:43 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -67,6 +67,7 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) struct scheduler_info si; uint64_t id; uint32_t msgid; + size_t n; switch (imsg->hdr.type) { @@ -75,6 +76,7 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) log_trace(TRACE_SCHEDULER, "scheduler: inserting evp:%016" PRIx64, e->id); scheduler_info(&si, e); + stat_increment("scheduler.envelope.incoming", 1); backend->insert(&si); return; @@ -82,7 +84,9 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) msgid = *(uint32_t *)(imsg->data); log_trace(TRACE_SCHEDULER, "scheduler: commiting msg:%08" PRIx32, msgid); - backend->commit(msgid); + n = backend->commit(msgid); + stat_decrement("scheduler.envelope.incoming", n); + stat_increment("scheduler.envelope", n); scheduler_reset_events(); return; @@ -90,7 +94,8 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) msgid = *(uint32_t *)(imsg->data); log_trace(TRACE_SCHEDULER, "scheduler: aborting msg:%08" PRIx32, msgid); - backend->rollback(msgid); + n = backend->rollback(msgid); + stat_decrement("scheduler.envelope.incoming", n); scheduler_reset_events(); return; @@ -99,7 +104,9 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) log_trace(TRACE_SCHEDULER, "scheduler: deleting evp:%016" PRIx64 " (ok)", id); backend->delete(id); - stat_decrement("scheduler.inflight", 1); + stat_increment("scheduler.delivery.ok", 1); + stat_decrement("scheduler.envelope.inflight", 1); + stat_decrement("scheduler.envelope", 1); scheduler_reset_events(); return; @@ -109,7 +116,8 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) "scheduler: updating evp:%016" PRIx64, e->id); scheduler_info(&si, e); backend->update(&si); - stat_decrement("scheduler.inflight", 1); + stat_increment("scheduler.delivery.tempfail", 1); + stat_decrement("scheduler.envelope.inflight", 1); scheduler_reset_events(); return; @@ -118,7 +126,9 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) log_trace(TRACE_SCHEDULER, "scheduler: deleting evp:%016" PRIx64 " (fail)", id); backend->delete(id); - stat_decrement("scheduler.inflight", 1); + stat_increment("scheduler.delivery.permfail", 1); + stat_decrement("scheduler.envelope.inflight", 1); + stat_decrement("scheduler.envelope", 1); scheduler_reset_events(); return; @@ -127,7 +137,9 @@ scheduler_imsg(struct imsgev *iev, struct imsg *imsg) log_trace(TRACE_SCHEDULER, "scheduler: deleting evp:%016" PRIx64 " (loop)", id); backend->delete(id); - stat_decrement("scheduler.inflight", 1); + stat_increment("scheduler.delivery.loop", 1); + stat_decrement("scheduler.envelope.inflight", 1); + stat_decrement("scheduler.envelope", 1); scheduler_reset_events(); return; @@ -256,7 +268,8 @@ scheduler(void) env->sc_scheduler = scheduler_backend_lookup(backend_scheduler); if (env->sc_scheduler == NULL) - errx(1, "cannot find scheduler backend \"%s\"", backend_scheduler); + errx(1, "cannot find scheduler backend \"%s\"", + backend_scheduler); backend = env->sc_scheduler; backend->init(); @@ -350,9 +363,11 @@ scheduler_process_remove(struct scheduler_batch *batch) e->id); imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_QUEUE_REMOVE, 0, 0, -1, &e->id, sizeof e->id); - stat_increment("scheduler.removed", 1); free(e); } + + stat_decrement("scheduler.envelope", batch->evpcount); + stat_increment("scheduler.envelope.removed", batch->evpcount); } static void @@ -366,9 +381,11 @@ scheduler_process_expire(struct scheduler_batch *batch) e->id); imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_QUEUE_EXPIRE, 0, 0, -1, &e->id, sizeof e->id); - stat_increment("scheduler.expired", 1); free(e); } + + stat_decrement("scheduler.envelope", batch->evpcount); + stat_increment("scheduler.envelope.expired", batch->evpcount); } static void @@ -382,9 +399,10 @@ scheduler_process_bounce(struct scheduler_batch *batch) e->id); imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_SMTP_ENQUEUE, 0, 0, -1, &e->id, sizeof e->id); - stat_increment("scheduler.inflight", 1); free(e); } + + stat_increment("scheduler.envelope.inflight", batch->evpcount); } static void @@ -398,9 +416,10 @@ scheduler_process_mda(struct scheduler_batch *batch) e->id); imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_MDA_SESS_NEW, 0, 0, -1, &e->id, sizeof e->id); - stat_increment("scheduler.inflight", 1); free(e); } + + stat_increment("scheduler.envelope.inflight", batch->evpcount); } static void @@ -417,10 +436,11 @@ scheduler_process_mta(struct scheduler_batch *batch) e->id); imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_BATCH_APPEND, 0, 0, -1, &e->id, sizeof e->id); - stat_increment("scheduler.inflight", 1); free(e); } + stat_increment("scheduler.envelope.inflight", batch->evpcount); + imsg_compose_event(env->sc_ievs[PROC_QUEUE], IMSG_BATCH_CLOSE, 0, 0, -1, NULL, 0); } diff --git a/usr.sbin/smtpd/scheduler_ramqueue.c b/usr.sbin/smtpd/scheduler_ramqueue.c index 67b463cb350..1425e414fcf 100644 --- a/usr.sbin/smtpd/scheduler_ramqueue.c +++ b/usr.sbin/smtpd/scheduler_ramqueue.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scheduler_ramqueue.c,v 1.22 2012/09/27 19:50:07 eric Exp $ */ +/* $OpenBSD: scheduler_ramqueue.c,v 1.23 2012/11/02 14:46:43 eric Exp $ */ /* * Copyright (c) 2012 Gilles Chehade <gilles@openbsd.org> @@ -70,6 +70,7 @@ struct rq_envelope { }; struct rq_queue { + size_t evpcount; struct tree messages; struct evplist pending; @@ -84,8 +85,8 @@ struct rq_queue { static void scheduler_ramqueue_init(void); static void scheduler_ramqueue_insert(struct scheduler_info *); -static void scheduler_ramqueue_commit(uint32_t); -static void scheduler_ramqueue_rollback(uint32_t); +static size_t scheduler_ramqueue_commit(uint32_t); +static size_t scheduler_ramqueue_rollback(uint32_t); static void scheduler_ramqueue_update(struct scheduler_info *); static void scheduler_ramqueue_delete(uint64_t); static void scheduler_ramqueue_batch(int, struct scheduler_batch *); @@ -172,20 +173,23 @@ scheduler_ramqueue_insert(struct scheduler_info *si) envelope->sched = scheduler_compute_schedule(si); tree_xset(&message->envelopes, envelope->evpid, envelope); + update->evpcount++; stat_increment("scheduler.ramqueue.envelope", 1); envelope->flags = RQ_ENVELOPE_PENDING; sorted_insert(&update->pending, envelope); } -static void +static size_t scheduler_ramqueue_commit(uint32_t msgid) { struct rq_queue *update; + size_t r; currtime = time(NULL); update = tree_xpop(&updates, msgid); + r = update->evpcount; if (verbose & TRACE_SCHEDULER) rq_queue_dump(update, "update to commit"); @@ -195,18 +199,22 @@ scheduler_ramqueue_commit(uint32_t msgid) free(update); stat_decrement("scheduler.ramqueue.update", 1); + + return (r); } -static void +static size_t scheduler_ramqueue_rollback(uint32_t msgid) { struct rq_queue *update; struct rq_envelope *evp; + size_t r; currtime = time(NULL); if ((update = tree_pop(&updates, msgid)) == NULL) - return; + return (0); + r = update->evpcount; while ((evp = TAILQ_FIRST(&update->pending))) { TAILQ_REMOVE(&update->pending, evp, entry); @@ -215,6 +223,8 @@ scheduler_ramqueue_rollback(uint32_t msgid) free(update); stat_decrement("scheduler.ramqueue.update", 1); + + return (r); } static void @@ -310,6 +320,7 @@ scheduler_ramqueue_batch(int typemask, struct scheduler_batch *ret) } ret->evpids = NULL; + ret->evpcount = 0; for(evp = *batch; evp; evp = tmp) { tmp = evp->sched_next; @@ -329,6 +340,7 @@ scheduler_ramqueue_batch(int typemask, struct scheduler_batch *ret) evp->flags |= RQ_ENVELOPE_INFLIGHT; evp->t_inflight = currtime; } + ret->evpcount++; } *batch = NULL; diff --git a/usr.sbin/smtpd/smtpd.h b/usr.sbin/smtpd/smtpd.h index 91d4b403c24..9bac30b1b86 100644 --- a/usr.sbin/smtpd/smtpd.h +++ b/usr.sbin/smtpd/smtpd.h @@ -1,4 +1,4 @@ -/* $OpenBSD: smtpd.h,v 1.391 2012/10/28 08:46:26 eric Exp $ */ +/* $OpenBSD: smtpd.h,v 1.392 2012/11/02 14:46:43 eric Exp $ */ /* * Copyright (c) 2008 Gilles Chehade <gilles@openbsd.org> @@ -844,6 +844,7 @@ struct id_list { struct scheduler_batch { int type; time_t delay; + size_t evpcount; struct id_list *evpids; }; @@ -851,8 +852,8 @@ struct scheduler_backend { void (*init)(void); void (*insert)(struct scheduler_info *); - void (*commit)(uint32_t); - void (*rollback)(uint32_t); + size_t (*commit)(uint32_t); + size_t (*rollback)(uint32_t); void (*update)(struct scheduler_info *); void (*delete)(uint64_t); |