Command metadata regenerate
[lttng-tools.git] / src / common / kernel-consumer / kernel-consumer.c
index 42d471d1a9a040b10e6ee48b56d66f34544f8091..9e3540426620f64f89cf69c8bbefa3cbe08f8962 100644 (file)
@@ -1093,6 +1093,20 @@ static int get_index_values(struct ctf_packet_index *index, int infd)
        }
        index->stream_id = htobe64(index->stream_id);
 
+       ret = kernctl_get_instance_id(infd, &index->stream_instance_id);
+       if (ret < 0) {
+               PERROR("kernctl_get_instance_id");
+               goto error;
+       }
+       index->stream_instance_id = htobe64(index->stream_instance_id);
+
+       ret = kernctl_get_sequence_number(infd, &index->packet_seq_num);
+       if (ret < 0) {
+               PERROR("kernctl_get_sequence_number");
+               goto error;
+       }
+       index->packet_seq_num = htobe64(index->packet_seq_num);
+
 error:
        return ret;
 }
@@ -1188,6 +1202,37 @@ end:
        return ret;
 }
 
+/*
+ * Check if the local version of the metadata stream matches with the version
+ * of the metadata stream in the kernel. If it was updated, set the reset flag
+ * on the stream.
+ */
+static
+int metadata_stream_check_version(int infd, struct lttng_consumer_stream *stream)
+{
+       int ret;
+       uint64_t cur_version;
+
+       ret = kernctl_get_metadata_version(infd, &cur_version);
+       if (ret < 0) {
+               ERR("Failed to get the metadata version");
+               goto end;
+       }
+
+       if (stream->metadata_version == cur_version) {
+               ret = 0;
+               goto end;
+       }
+
+       DBG("New metadata version detected");
+       stream->metadata_version = cur_version;
+       stream->reset_metadata_flag = 1;
+       ret = 0;
+
+end:
+       return ret;
+}
+
 /*
  * Consume data on a file descriptor and write it on a trace file.
  */
@@ -1258,6 +1303,10 @@ ssize_t lttng_kconsumer_read_subbuffer(struct lttng_consumer_stream *stream,
                }
        } else {
                write_index = 0;
+               ret = metadata_stream_check_version(infd, stream);
+               if (ret < 0) {
+                       goto end;
+               }
        }
 
        switch (stream->chan->output) {
This page took 0.025109 seconds and 5 git commands to generate.