Store the instance id and packet_seq_num in indexes
[lttng-tools.git] / src / common / ust-consumer / ust-consumer.c
index a17c48f2f9ba2639fd39754550e8c1eacddacb86..5686fbd09fe58966cebf3f3be70bf8ec9acd339e 100644 (file)
@@ -1029,6 +1029,8 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
        DBG("UST consumer snapshot channel %" PRIu64, key);
 
        cds_list_for_each_entry(stream, &channel->streams.head, send_node) {
+               /* Are we at a position _before_ the first available packet ? */
+               bool before_first_packet = true;
 
                health_code_update();
 
@@ -1095,6 +1097,7 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
                while (consumed_pos < produced_pos) {
                        ssize_t read_len;
                        unsigned long len, padded_len;
+                       int lost_packet = 0;
 
                        health_code_update();
 
@@ -1108,6 +1111,15 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
                                }
                                DBG("UST consumer get subbuf failed. Skipping it.");
                                consumed_pos += stream->max_sb_size;
+
+                               /*
+                                * Start accounting lost packets only when we
+                                * already have extracted packets (to match the
+                                * content of the final snapshot).
+                                */
+                               if (!before_first_packet) {
+                                       lost_packet = 1;
+                               }
                                continue;
                        }
 
@@ -1143,6 +1155,16 @@ static int snapshot_channel(uint64_t key, char *path, uint64_t relayd_id,
                                goto error_close_stream;
                        }
                        consumed_pos += stream->max_sb_size;
+
+                       /*
+                        * Only account lost packets located between
+                        * succesfully extracted packets (do not account before
+                        * and after since they are not visible in the
+                        * resulting snapshot).
+                        */
+                       stream->chan->lost_packets += lost_packet;
+                       lost_packet = 0;
+                       before_first_packet = false;
                }
 
                /* Simply close the stream so we can use it on the next snapshot. */
@@ -1718,7 +1740,8 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
        }
        case LTTNG_CONSUMER_LOST_PACKETS:
        {
-               uint64_t ret;
+               int ret;
+               uint64_t lost_packets;
                struct lttng_ht_iter iter;
                struct lttng_ht *ht;
                struct lttng_consumer_stream *stream;
@@ -1738,13 +1761,13 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                 * to extract the information we need, we default to 0 if not
                 * found (no packets lost if the channel is not yet in use).
                 */
-               ret = 0;
+               lost_packets = 0;
                cds_lfht_for_each_entry_duplicate(ht->ht,
                                ht->hash_fct(&id, lttng_ht_seed),
                                ht->match_fct, &id,
                                &iter.iter, stream, node_session_id.node) {
                        if (stream->chan->key == key) {
-                               ret = stream->chan->lost_packets;
+                               lost_packets = stream->chan->lost_packets;
                                break;
                        }
                }
@@ -1757,7 +1780,8 @@ int lttng_ustconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
                health_code_update();
 
                /* Send back returned value to session daemon */
-               ret = lttcomm_send_unix_sock(sock, &ret, sizeof(ret));
+               ret = lttcomm_send_unix_sock(sock, &lost_packets,
+                               sizeof(lost_packets));
                if (ret < 0) {
                        PERROR("send lost packets");
                        goto error_fatal;
@@ -2055,6 +2079,20 @@ static int get_index_values(struct ctf_packet_index *index,
        }
        index->stream_id = htobe64(index->stream_id);
 
+       ret = ustctl_get_instance_id(ustream, &index->stream_instance_id);
+       if (ret < 0) {
+               PERROR("ustctl_get_instance_id");
+               goto error;
+       }
+       index->stream_instance_id = htobe64(index->stream_instance_id);
+
+       ret = ustctl_get_sequence_number(ustream, &index->packet_seq_num);
+       if (ret < 0) {
+               PERROR("ustctl_get_sequence_number");
+               goto error;
+       }
+       index->packet_seq_num = htobe64(index->packet_seq_num);
+
 error:
        return ret;
 }
This page took 0.034743 seconds and 4 git commands to generate.