Always choose large event header for UST channels
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 0a8ce6b02572fc01326fe2223438c481fd095116..1caaf55cfd584f8fbc10931bcfaaddb828df03f9 100644 (file)
@@ -5324,7 +5324,7 @@ static int reply_ust_register_channel(int sock, int sobjd, int cobjd,
                size_t nr_fields, struct ustctl_field *fields)
 {
        int ret, ret_code = 0;
-       uint32_t chan_id, reg_count;
+       uint32_t chan_id;
        uint64_t chan_reg_key;
        enum ustctl_channel_header type;
        struct ust_app *app;
@@ -5376,13 +5376,12 @@ static int reply_ust_register_channel(int sock, int sobjd, int cobjd,
        assert(chan_reg);
 
        if (!chan_reg->register_done) {
-               reg_count = ust_registry_get_event_count(chan_reg);
-               if (reg_count < 31) {
-                       type = USTCTL_CHANNEL_HEADER_COMPACT;
-               } else {
-                       type = USTCTL_CHANNEL_HEADER_LARGE;
-               }
-
+               /*
+                * TODO: eventually use the registry event count for
+                * this channel to better guess header type for per-pid
+                * buffers.
+                */
+               type = USTCTL_CHANNEL_HEADER_LARGE;
                chan_reg->nr_ctx_fields = nr_fields;
                chan_reg->ctx_fields = fields;
                fields = NULL;
@@ -5862,6 +5861,11 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                        struct buffer_reg_channel *reg_chan;
                        struct consumer_socket *socket;
 
+                       if (!reg->registry->reg.ust->metadata_key) {
+                               /* Skip since no metadata is present */
+                               continue;
+                       }
+
                        /* Get consumer socket to use to push the metadata.*/
                        socket = consumer_find_socket_by_bitness(reg->bits_per_long,
                                        usess->consumer);
@@ -6045,21 +6049,24 @@ int ust_app_uid_get_channel_runtime_stats(uint64_t ust_session_id,
        int ret;
        uint64_t consumer_chan_key;
 
+       *discarded = 0;
+       *lost = 0;
+
        ret = buffer_reg_uid_consumer_channel_key(
                        buffer_reg_uid_list, ust_session_id,
                        uchan_id, &consumer_chan_key);
        if (ret < 0) {
+               /* Not found */
+               ret = 0;
                goto end;
        }
 
        if (overwrite) {
                ret = consumer_get_lost_packets(ust_session_id,
                                consumer_chan_key, consumer, lost);
-               *discarded = 0;
        } else {
                ret = consumer_get_discarded_events(ust_session_id,
                                consumer_chan_key, consumer, discarded);
-               *lost = 0;
        }
 
 end:
@@ -6078,10 +6085,13 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess,
        struct ust_app_session *ua_sess;
        struct ust_app_channel *ua_chan;
 
+       *discarded = 0;
+       *lost = 0;
+
        rcu_read_lock();
        /*
-        * Iterate over every registered applications, return when we
-        * found one in the right session and channel.
+        * Iterate over every registered applications. Sum counters for
+        * all applications containing requested session and channel.
         */
        cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
                struct lttng_ht_iter uiter;
@@ -6100,19 +6110,26 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess,
                ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
 
                if (overwrite) {
+                       uint64_t _lost;
+
                        ret = consumer_get_lost_packets(usess->id, ua_chan->key,
-                                       consumer, lost);
-                       *discarded = 0;
-                       goto end;
+                                       consumer, &_lost);
+                       if (ret < 0) {
+                               break;
+                       }
+                       (*lost) += _lost;
                } else {
+                       uint64_t _discarded;
+
                        ret = consumer_get_discarded_events(usess->id,
-                                       ua_chan->key, consumer, discarded);
-                       *lost = 0;
-                       goto end;
+                                       ua_chan->key, consumer, &_discarded);
+                       if (ret < 0) {
+                               break;
+                       }
+                       (*discarded) += _discarded;
                }
        }
 
-end:
        rcu_read_unlock();
        return ret;
 }
This page took 0.025714 seconds and 4 git commands to generate.