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.
This commit is contained in:
Willy Tarreau 2018-10-28 13:44:36 +01:00
parent 80512b186f
commit cda7f3f5c2
2 changed files with 12 additions and 6 deletions

View File

@ -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 */

View File

@ -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 @@ struct task *process_stream(struct task *t, void *context, unsigned short state)
/* 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 {