X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fcommon%2Fkernel-consumer%2Fkernel-consumer.c;h=b1cc03e860a0e9b10d34a5e8f528f3fcb4d90ae5;hb=13a7bce327fb908d2ddafba17cadebbb13389f12;hp=42d471d1a9a040b10e6ee48b56d66f34544f8091;hpb=c13082a921ed95e1039d1e28da35941930b15fb6;p=lttng-tools.git diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c index 42d471d1a..b1cc03e86 100644 --- a/src/common/kernel-consumer/kernel-consumer.c +++ b/src/common/kernel-consumer/kernel-consumer.c @@ -969,18 +969,18 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, uint64_t id = msg.u.discarded_events.session_id; uint64_t key = msg.u.discarded_events.channel_key; + DBG("Kernel consumer discarded events command for session id %" + PRIu64 ", channel key %" PRIu64, id, key); + channel = consumer_find_channel(key); if (!channel) { ERR("Kernel consumer discarded events channel %" PRIu64 " not found", key); - ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND; + ret = 0; + } else { + ret = channel->discarded_events; } - DBG("Kernel consumer discarded events command for session id %" - PRIu64 ", channel key %" PRIu64, id, key); - - ret = channel->discarded_events; - health_code_update(); /* Send back returned value to session daemon */ @@ -999,18 +999,18 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx, uint64_t id = msg.u.lost_packets.session_id; uint64_t key = msg.u.lost_packets.channel_key; + DBG("Kernel consumer lost packets command for session id %" + PRIu64 ", channel key %" PRIu64, id, key); + channel = consumer_find_channel(key); if (!channel) { ERR("Kernel consumer lost packets channel %" PRIu64 " not found", key); - ret_code = LTTCOMM_CONSUMERD_CHAN_NOT_FOUND; + ret = 0; + } else { + ret = channel->lost_packets; } - DBG("Kernel consumer lost packets command for session id %" - PRIu64 ", channel key %" PRIu64, id, key); - - ret = channel->lost_packets; - health_code_update(); /* Send back returned value to session daemon */ @@ -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; } @@ -1172,8 +1186,8 @@ int update_stream_stats(struct lttng_consumer_stream *stream) } if (discarded < stream->last_discarded_events) { /* - * Overflow has occured. We assume only one wrap-around - * has occured. + * Overflow has occurred. We assume only one wrap-around + * has occurred. */ stream->chan->discarded_events += (1ULL << (CAA_BITS_PER_LONG - 1)) - stream->last_discarded_events + discarded; @@ -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) {