From: Jérémie Galarneau Date: Tue, 21 May 2019 23:44:30 +0000 (-0400) Subject: Maintain a channel-per-session_id hash table in the consumers X-Git-Tag: v2.12.0-rc1~578 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=5c3892a6b0083de585509b7c71b76068b2f110bc Maintain a channel-per-session_id hash table in the consumers 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 --- 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.