ret = kernctl_snapshot(infd);
if (ret != 0) {
PERROR("Getting sub-buffer snapshot.");
- ret = -errno;
}
return ret;
ret = kernctl_snapshot_get_produced(infd, pos);
if (ret != 0) {
PERROR("kernctl_snapshot_get_produced");
- ret = -errno;
}
return ret;
ret = kernctl_snapshot_get_consumed(infd, pos);
if (ret != 0) {
PERROR("kernctl_snapshot_get_consumed");
- ret = -errno;
}
return ret;
struct lttng_consumer_local_data *ctx)
{
int ret;
- unsigned long consumed_pos, produced_pos;
struct lttng_consumer_channel *channel;
struct lttng_consumer_stream *stream;
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;
+ unsigned long consumed_pos, produced_pos;
health_code_update();
ret = kernctl_buffer_flush(stream->wait_fd);
if (ret < 0) {
ERR("Failed to flush kernel stream");
- ret = -errno;
goto end_unlock;
}
&stream->max_sb_size);
if (ret < 0) {
ERR("Getting kernel max_sb_size");
- ret = -errno;
goto end_unlock;
}
}
ret = kernctl_get_subbuf(stream->wait_fd, &consumed_pos);
if (ret < 0) {
- if (errno != EAGAIN) {
+ if (ret != -EAGAIN) {
PERROR("kernctl_get_subbuf snapshot");
- ret = -errno;
goto end_unlock;
}
DBG("Kernel consumer get subbuf failed. Skipping it.");
ret = kernctl_get_subbuf_size(stream->wait_fd, &len);
if (ret < 0) {
ERR("Snapshot kernctl_get_subbuf_size");
- ret = -errno;
goto error_put_subbuf;
}
ret = kernctl_get_padded_subbuf_size(stream->wait_fd, &padded_len);
if (ret < 0) {
ERR("Snapshot kernctl_get_padded_subbuf_size");
- ret = -errno;
goto error_put_subbuf;
}
ret = kernctl_put_subbuf(stream->wait_fd);
if (ret < 0) {
ERR("Snapshot kernctl_put_subbuf");
- ret = -errno;
goto end_unlock;
}
consumed_pos += stream->max_sb_size;
error_put_subbuf:
ret = kernctl_put_subbuf(stream->wait_fd);
if (ret < 0) {
- ret = -errno;
ERR("Snapshot kernctl_put_subbuf error path");
}
end_unlock:
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 */
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 */
ret = kernctl_snapshot(metadata->wait_fd);
if (ret < 0) {
- if (errno != EAGAIN) {
+ if (ret != -EAGAIN) {
ERR("Sync metadata, taking kernel snapshot failed.");
goto end;
}
}
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;
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.
*/
*/
DBG("Reserving sub buffer failed (everything is normal, "
"it is due to concurrency)");
- ret = -errno;
+ ret = err;
goto end;
}
PERROR("Getting sub-buffer len failed.");
err = kernctl_put_subbuf(infd);
if (err != 0) {
- if (errno == EFAULT) {
+ if (err == -EFAULT) {
PERROR("Error in unreserving sub buffer\n");
- } else if (errno == EIO) {
+ } else if (err == -EIO) {
/* Should never happen with newer LTTng versions */
PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
}
- ret = -errno;
+ ret = err;
goto end;
}
- ret = -errno;
+ ret = err;
goto end;
}
if (ret < 0) {
err = kernctl_put_subbuf(infd);
if (err != 0) {
- if (errno == EFAULT) {
+ if (err == -EFAULT) {
PERROR("Error in unreserving sub buffer\n");
- } else if (errno == EIO) {
+ } else if (err == -EIO) {
/* Should never happen with newer LTTng versions */
PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
}
- ret = -errno;
+ ret = err;
goto end;
}
goto end;
}
} else {
write_index = 0;
+ ret = metadata_stream_check_version(infd, stream);
+ if (ret < 0) {
+ goto end;
+ }
}
switch (stream->chan->output) {
PERROR("Getting sub-buffer len failed.");
err = kernctl_put_subbuf(infd);
if (err != 0) {
- if (errno == EFAULT) {
+ if (err == -EFAULT) {
PERROR("Error in unreserving sub buffer\n");
- } else if (errno == EIO) {
+ } else if (err == -EIO) {
/* Should never happen with newer LTTng versions */
PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
}
- ret = -errno;
+ ret = err;
goto end;
}
- ret = -errno;
+ ret = err;
goto end;
}
err = kernctl_put_next_subbuf(infd);
if (err != 0) {
- if (errno == EFAULT) {
+ if (err == -EFAULT) {
PERROR("Error in unreserving sub buffer\n");
- } else if (errno == EIO) {
+ } else if (err == -EIO) {
/* Should never happen with newer LTTng versions */
PERROR("Reader has been pushed by the writer, last sub-buffer corrupted.");
}
- ret = -errno;
+ ret = err;
goto end;
}
ret = kernctl_get_mmap_len(stream->wait_fd, &mmap_len);
if (ret != 0) {
PERROR("kernctl_get_mmap_len");
- ret = -errno;
goto error_close_fd;
}
stream->mmap_len = (size_t) mmap_len;