[lttng-dev] [PATCH lttng-tools 3/3] Fix: lttng-consumerd: cpu hotplug: send "streams_sent" command

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Thu May 11 20:00:56 UTC 2017


When creating a new channel, the streams being sent to the relayd are
kept invisible to the live client until the "streams_sent" command is
received. This ensures the client does not see a partial stream set.

This "streams_sent" command needs to be sent on CPU hotplug too,
otherwise the live client handling within relayd is not aware of those
streams (they are never published).

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers at efficios.com>
---
 src/common/consumer/consumer.h               |  2 ++
 src/common/kernel-consumer/kernel-consumer.c | 15 +++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/src/common/consumer/consumer.h b/src/common/consumer/consumer.h
index 6a38e50..7375373 100644
--- a/src/common/consumer/consumer.h
+++ b/src/common/consumer/consumer.h
@@ -224,6 +224,8 @@ struct lttng_consumer_channel {
 	uint64_t discarded_events;
 	/* Total number of missed packets due to overwriting (overwrite). */
 	uint64_t lost_packets;
+
+	bool streams_sent_to_relayd;
 };
 
 /*
diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c
index 3554b8f..16aeae1 100644
--- a/src/common/kernel-consumer/kernel-consumer.c
+++ b/src/common/kernel-consumer/kernel-consumer.c
@@ -196,6 +196,7 @@ int lttng_kconsumer_snapshot_channel(uint64_t key, char *path,
 				ERR("sending streams sent to relayd");
 				goto end_unlock;
 			}
+			channel->streams_sent_to_relayd = true;
 		}
 
 		ret = kernctl_buffer_flush(stream->wait_fd);
@@ -741,6 +742,19 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 				consumer_stream_free(new_stream);
 				goto end_nosignal;
 			}
+
+			/*
+			 * If adding an extra stream to an already
+			 * existing channel (e.g. cpu hotplug), we need
+			 * to sent the "streams_sent" command to relayd.
+			 */
+			if (channel->streams_sent_to_relayd) {
+				ret = consumer_send_relayd_streams_sent(
+						new_stream->net_seq_idx);
+				if (ret < 0) {
+					goto end_nosignal;
+				}
+			}
 		}
 
 		/* Get the right pipe where the stream will be sent. */
@@ -834,6 +848,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 			if (ret < 0) {
 				goto end_nosignal;
 			}
+			channel->streams_sent_to_relayd = true;
 		}
 		break;
 	}
-- 
2.1.4



More information about the lttng-dev mailing list