From 5c3892a6b0083de585509b7c71b76068b2f110bc Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 21 May 2019 19:44:30 -0400 Subject: [PATCH] Maintain a channel-per-session_id hash table in the consumers MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Add and maintain an hash table indexed by `session_id` that allows the consumer daemons to perform actions on a set of channels belonging to a given session. This hash table holds no ownership of the channels; it is merely an "index" to the existing set of channels maintained in the channel_ht. Signed-off-by: Jérémie Galarneau --- src/common/consumer/consumer.c | 15 +++++++++++++++ src/common/consumer/consumer.h | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/src/common/consumer/consumer.c b/src/common/consumer/consumer.c index c70d95a58..9d25d83a3 100644 --- a/src/common/consumer/consumer.c +++ b/src/common/consumer/consumer.c @@ -393,6 +393,10 @@ void consumer_del_channel(struct lttng_consumer_channel *channel) iter.iter.node = &channel->node.node; ret = lttng_ht_del(consumer_data.channel_ht, &iter); assert(!ret); + + iter.iter.node = &channel->channels_by_session_id_ht_node.node; + ret = lttng_ht_del(consumer_data.channels_by_session_id_ht, &iter); + assert(!ret); rcu_read_unlock(); call_rcu(&channel->node.head, free_channel_rcu); @@ -1035,6 +1039,8 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key, } lttng_ht_node_init_u64(&channel->node, channel->key); + lttng_ht_node_init_u64(&channel->channels_by_session_id_ht_node, + channel->session_id); channel->wait_fd = -1; @@ -1067,6 +1073,8 @@ int consumer_add_channel(struct lttng_consumer_channel *channel, rcu_read_lock(); lttng_ht_add_unique_u64(consumer_data.channel_ht, &channel->node); + lttng_ht_add_u64(consumer_data.channels_by_session_id_ht, + &channel->channels_by_session_id_ht_node); rcu_read_unlock(); pthread_mutex_unlock(&channel->timer_lock); @@ -1225,6 +1233,7 @@ void lttng_consumer_cleanup(void) rcu_read_unlock(); lttng_ht_destroy(consumer_data.channel_ht); + lttng_ht_destroy(consumer_data.channels_by_session_id_ht); cleanup_relayd_ht(); @@ -3423,6 +3432,12 @@ int lttng_consumer_init(void) goto error; } + consumer_data.channels_by_session_id_ht = + lttng_ht_new(0, LTTNG_HT_TYPE_U64); + if (!consumer_data.channels_by_session_id_ht) { + goto error; + } + consumer_data.relayd_ht = lttng_ht_new(0, LTTNG_HT_TYPE_U64); if (!consumer_data.relayd_ht) { goto error; diff --git a/src/common/consumer/consumer.h b/src/common/consumer/consumer.h index b940036f6..1c1d01de9 100644 --- a/src/common/consumer/consumer.h +++ b/src/common/consumer/consumer.h @@ -112,6 +112,8 @@ struct consumer_metadata_cache; struct lttng_consumer_channel { /* HT node used for consumer_data.channel_ht */ struct lttng_ht_node_u64 node; + /* HT node used for consumer_data.channels_by_session_id_ht */ + struct lttng_ht_node_u64 channels_by_session_id_ht_node; /* Indexed key. Incremented value in the consumer. */ uint64_t key; /* Number of streams referencing this channel */ @@ -621,6 +623,8 @@ struct lttng_consumer_global_data { /* Channel hash table protected by consumer_data.lock. */ struct lttng_ht *channel_ht; + /* Channel hash table indexed by session id. */ + struct lttng_ht *channels_by_session_id_ht; /* * Flag specifying if the local array of FDs needs update in the * poll function. Protected by consumer_data.lock. -- 2.34.1