From b4a4d9aed4342e387ead87e8c43ea88acaa70d64 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Wed, 15 Nov 2017 22:14:49 +0100 Subject: [PATCH] MEDIUM: applets: Don't process more than 200 active applets at once Now, we process at most 200 active applets per call to applet_run_active. We use the same limit as the tasks. With the cache filter and the SPOE, the number of active applets can now be huge. So, it is important to limit the number of applets processed in applet_run_active. --- src/applet.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/applet.c b/src/applet.c index 84ffde6b83..77f984d91f 100644 --- a/src/applet.c +++ b/src/applet.c @@ -32,13 +32,18 @@ void applet_run_active() struct appctx *curr, *next; struct stream_interface *si; struct list applet_cur_queue = LIST_HEAD_INIT(applet_cur_queue); + int max_processed; + + max_processed = applets_active_queue; + if (max_processed > 200) + max_processed = 200; HA_SPIN_LOCK(APPLETS_LOCK, &applet_active_lock); if (!(active_applets_mask & tid_bit)) { HA_SPIN_UNLOCK(APPLETS_LOCK, &applet_active_lock); return; } - + active_applets_mask &= ~tid_bit; curr = LIST_NEXT(&applet_active_queue, typeof(curr), runq); while (&curr->runq != &applet_active_queue) { next = LIST_NEXT(&curr->runq, typeof(next), runq); @@ -47,10 +52,14 @@ void applet_run_active() curr->state = APPLET_RUNNING; LIST_ADDQ(&applet_cur_queue, &curr->runq); applets_active_queue--; + max_processed--; } curr = next; + if (max_processed <= 0) { + active_applets_mask |= tid_bit; + break; + } } - active_applets_mask &= ~tid_bit; HA_SPIN_UNLOCK(APPLETS_LOCK, &applet_active_lock); /* The list is only scanned from the head. This guarantees that if any -- 2.47.3