From d68ec9741e83c99eea549243eec46c37b4eea61f Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 9 Mar 2016 15:34:52 -0500 Subject: [PATCH] Fix: session_find_by_id can return NULL legitimately MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit session_find_by_id can return NULL when the backing hash table is NULL. This is not an error in the context of its caller, save_per_pid_lost_discarded_counters(), since the ltt_session can be destroyed before an ust app session is torn down. See the comment in save_per_pid_lost_discarded_counters() for more information. Signed-off-by: Jérémie Galarneau --- src/bin/lttng-sessiond/session.c | 8 ++++++-- src/bin/lttng-sessiond/ust-app.c | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/bin/lttng-sessiond/session.c b/src/bin/lttng-sessiond/session.c index 456901685..5a10340a7 100644 --- a/src/bin/lttng-sessiond/session.c +++ b/src/bin/lttng-sessiond/session.c @@ -298,17 +298,21 @@ struct ltt_session *session_find_by_id(uint64_t id) struct lttng_ht_iter iter; struct ltt_session *ls; + if (!ltt_sessions_ht_by_id) { + goto end; + } + lttng_ht_lookup(ltt_sessions_ht_by_id, &id, &iter); node = lttng_ht_iter_get_node_u64(&iter); if (node == NULL) { - goto error; + goto end; } ls = caa_container_of(node, struct ltt_session, node); DBG3("Session %" PRIu64 " found by id.", id); return ls; -error: +end: DBG3("Session %" PRIu64 " NOT found by id", id); return NULL; } diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 331a9d671..9b634facc 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -392,12 +392,22 @@ void save_per_pid_lost_discarded_counters(struct ust_app_channel *ua_chan) rcu_read_lock(); session = session_find_by_id(ua_chan->session->tracing_id); - if (!session) { - ERR("Missing LTT session to get discarded events"); - goto end; - } - if (!session->ust_session) { - ERR("Missing UST session to get discarded events"); + if (!session || !session->ust_session) { + /* + * Not finding the session is not an error because there are + * multiple ways the channels can be torn down. + * + * 1) The session daemon can initiate the destruction of the + * ust app session after receiving a destroy command or + * during its shutdown/teardown. + * 2) The application, since we are in per-pid tracing, is + * unregistering and tearing down its ust app session. + * + * Both paths are protected by the session list lock which + * ensures that the accounting of lost packets and discarded + * events is done exactly once. The session is then unpublished + * from the session list, resulting in this condition. + */ goto end; } -- 2.34.1