From cda7f3f5c2f2bb0b9d9e74e0e3ec11df27bb4c6d Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 28 Oct 2018 13:44:36 +0100 Subject: [PATCH] MINOR: stream: don't prune variables if the list is empty The vars_prune() and vars_init() functions involve locking while most of the time there is no variable at all in streams nor sessions. Let's check for emptiness before calling these functions. Simply doing this has increased the multithreaded performance from 1.5 to 5% depending on the workload. --- src/proto_http.c | 6 ++++-- src/stream.c | 12 ++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/proto_http.c b/src/proto_http.c index 48cb383a0d..39900deac1 100644 --- a/src/proto_http.c +++ b/src/proto_http.c @@ -7566,8 +7566,10 @@ void http_end_txn(struct stream *s) memset(s->res_cap, 0, fe->nb_rsp_cap * sizeof(void *)); } - vars_prune(&s->vars_txn, s->sess, s); - vars_prune(&s->vars_reqres, s->sess, s); + if (!LIST_ISEMPTY(&s->vars_txn.head)) + vars_prune(&s->vars_txn, s->sess, s); + if (!LIST_ISEMPTY(&s->vars_reqres.head)) + vars_prune(&s->vars_reqres, s->sess, s); } /* to be used at the end of a transaction to prepare a new one */ diff --git a/src/stream.c b/src/stream.c index ad1ccbee40..d27dae3a22 100644 --- a/src/stream.c +++ b/src/stream.c @@ -376,8 +376,10 @@ static void stream_free(struct stream *s) } /* Cleanup all variable contexts. */ - vars_prune(&s->vars_txn, s->sess, s); - vars_prune(&s->vars_reqres, s->sess, s); + if (!LIST_ISEMPTY(&s->vars_txn.head)) + vars_prune(&s->vars_txn, s->sess, s); + if (!LIST_ISEMPTY(&s->vars_reqres.head)) + vars_prune(&s->vars_reqres, s->sess, s); stream_store_counters(s); @@ -2258,8 +2260,10 @@ redo: /* prune the request variables and swap to the response variables. */ if (s->vars_reqres.scope != SCOPE_RES) { - vars_prune(&s->vars_reqres, s->sess, s); - vars_init(&s->vars_reqres, SCOPE_RES); + if (!LIST_ISEMPTY(&s->vars_reqres.head)) { + vars_prune(&s->vars_reqres, s->sess, s); + vars_init(&s->vars_reqres, SCOPE_RES); + } } do { -- 2.39.5