When working in flight-recorder, we cannot rely on the absolute sequence
number because we only extract the content of the ring buffer
periodically. Moreover, we don't want to account the lost packets at the
beginning or the end of the snapshot since the "holes" don't appear in
the resulting snapshot, so we make sure we only account lost packets
located between extracted packets.
Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
}
cds_list_for_each_entry(stream, &channel->streams.head, send_node) {
}
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;
while (consumed_pos < produced_pos) {
ssize_t read_len;
unsigned long len, padded_len;
while (consumed_pos < produced_pos) {
ssize_t read_len;
unsigned long len, padded_len;
}
DBG("Kernel consumer get subbuf failed. Skipping it.");
consumed_pos += stream->max_sb_size;
}
DBG("Kernel 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;
+ }
goto end_unlock;
}
consumed_pos += stream->max_sb_size;
goto end_unlock;
}
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;
}
if (relayd_id == (uint64_t) -1ULL) {
}
if (relayd_id == (uint64_t) -1ULL) {
DBG("UST consumer snapshot channel %" PRIu64, key);
cds_list_for_each_entry(stream, &channel->streams.head, send_node) {
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;
while (consumed_pos < produced_pos) {
ssize_t read_len;
unsigned long len, padded_len;
while (consumed_pos < produced_pos) {
ssize_t read_len;
unsigned long len, padded_len;
}
DBG("UST consumer get subbuf failed. Skipping it.");
consumed_pos += stream->max_sb_size;
}
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;
+ }
goto error_close_stream;
}
consumed_pos += stream->max_sb_size;
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. */
}
/* Simply close the stream so we can use it on the next snapshot. */