summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoreric <eric@openbsd.org>2012-11-02 14:46:43 +0000
committereric <eric@openbsd.org>2012-11-02 14:46:43 +0000
commitbe215280c6b32fa05178766fcb1a2d4fb17b3ace (patch)
treedc0bcb89b07476bf7d3958891372925d43c6ba17
parentWatch the non-privileged end of the pipe to the privileged child (diff)
downloadwireguard-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.c46
-rw-r--r--usr.sbin/smtpd/scheduler_ramqueue.c24
-rw-r--r--usr.sbin/smtpd/smtpd.h7
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);