[lttng-dev] [Patch LTTng-ust 5/7] Send and receive serialized metadata for CTF named enumerations

Geneviève Bastien gbastien+lttng at versatic.net
Fri Jan 24 15:04:43 EST 2014


Updates the functions used for the communication between UST and the session
daemon so that named metadata can be sent and received. The description of the
metadata follows the event that use them. The extra fields for each metadata
follow the descriptions of all metadata.

Signed-off-by: Geneviève Bastien <gbastien+lttng at versatic.net>
---
 include/lttng/ust-ctl.h            |   4 +-
 include/ust-comm.h                 |   8 ++-
 liblttng-ust-comm/lttng-ust-comm.c | 110 ++++++++++++++++++++++++++++++++-----
 liblttng-ust-ctl/ustctl.c          |  74 ++++++++++++++++++++++++-
 liblttng-ust/lttng-events.c        |   4 +-
 5 files changed, 181 insertions(+), 19 deletions(-)

diff --git a/include/lttng/ust-ctl.h b/include/lttng/ust-ctl.h
index 29c89fe..1c82111 100644
--- a/include/lttng/ust-ctl.h
+++ b/include/lttng/ust-ctl.h
@@ -421,7 +421,9 @@ int ustctl_recv_register_event(int sock,
 					 */
 	size_t *nr_fields,
 	struct ustctl_field **fields,
-	char **model_emf_uri);
+	char **model_emf_uri,
+	size_t *nr_metadata,
+	struct ustctl_named_metadata **named_metadata);
 
 /*
  * Returns 0 on success, negative error value on error.
diff --git a/include/ust-comm.h b/include/ust-comm.h
index b9bbb39..40ba09b 100644
--- a/include/ust-comm.h
+++ b/include/ust-comm.h
@@ -49,6 +49,7 @@
 #define LTTNG_UST_COMM_REG_MSG_PADDING			64
 
 struct lttng_event_field;
+struct lttng_named_metadata;
 struct lttng_ctx_field;
 
 struct ustctl_reg_msg {
@@ -127,7 +128,7 @@ struct ustcomm_notify_hdr {
 	uint32_t notify_cmd;
 } LTTNG_PACKED;
 
-#define USTCOMM_NOTIFY_EVENT_MSG_PADDING	32
+#define USTCOMM_NOTIFY_EVENT_MSG_PADDING	28
 struct ustcomm_notify_event_msg {
 	uint32_t session_objd;
 	uint32_t channel_objd;
@@ -136,6 +137,7 @@ struct ustcomm_notify_event_msg {
 	uint32_t signature_len;
 	uint32_t fields_len;
 	uint32_t model_emf_uri_len;
+	uint32_t metadata_len;
 	char padding[USTCOMM_NOTIFY_EVENT_MSG_PADDING];
 	/* followed by signature, fields, and model_emf_uri */
 } LTTNG_PACKED;
@@ -221,7 +223,9 @@ int ustcomm_register_event(int sock,
 	size_t nr_fields,		/* fields */
 	const struct lttng_event_field *fields,
 	const char *model_emf_uri,
-	uint32_t *id);			/* event id (output) */
+	uint32_t *id,			/* event id (output) */
+	size_t nr_metadata,
+	const struct lttng_named_metadata *lttng_metadata); /* named metadata */
 
 /*
  * Returns 0 on success, negative error value on error.
diff --git a/liblttng-ust-comm/lttng-ust-comm.c b/liblttng-ust-comm/lttng-ust-comm.c
index 1744b9f..33620fc 100644
--- a/liblttng-ust-comm/lttng-ust-comm.c
+++ b/liblttng-ust-comm/lttng-ust-comm.c
@@ -1012,7 +1012,9 @@ int ustcomm_register_event(int sock,
 	size_t nr_fields,		/* fields */
 	const struct lttng_event_field *lttng_fields,
 	const char *model_emf_uri,
-	uint32_t *id)			/* event id (output) */
+	uint32_t *id,			/* event id (output) */
+	size_t nr_metadata,
+	const struct lttng_named_metadata *lttng_metadata) /* named metadata */
 {
 	ssize_t len;
 	struct {
@@ -1023,10 +1025,12 @@ int ustcomm_register_event(int sock,
 		struct ustcomm_notify_hdr header;
 		struct ustcomm_notify_event_reply r;
 	} reply;
-	size_t signature_len, fields_len, model_emf_uri_len;
+	size_t signature_len, fields_len, model_emf_uri_len, metadata_len;
 	struct ustctl_field *fields = NULL;
+	struct ustctl_named_metadata *metadata = NULL;
 	size_t nr_write_fields = 0;
-	int ret;
+	size_t nr_write_metadata = 0;
+	int ret, i;
 
 	memset(&msg, 0, sizeof(msg));
 	msg.header.notify_cmd = USTCTL_NOTIFY_CMD_EVENT;
@@ -1054,14 +1058,26 @@ int ustcomm_register_event(int sock,
 		model_emf_uri_len = 0;
 	}
 	msg.m.model_emf_uri_len = model_emf_uri_len;
+	/* Calculate metadata len, serialize metadata. */
+	if (nr_metadata > 0) {
+		ret = serialize_metadata(&nr_write_metadata, &metadata,
+				nr_metadata, lttng_metadata);
+		if (ret) {
+			free(fields);
+			return ret;
+		}
+	}
+	metadata_len = sizeof(*metadata) * nr_write_metadata;
+	msg.m.metadata_len = metadata_len;
+
 	len = ustcomm_send_unix_sock(sock, &msg, sizeof(msg));
 	if (len > 0 && len != sizeof(msg)) {
-		free(fields);
-		return -EIO;
+		ret = -EIO;
+		goto error_fields;
 	}
 	if (len < 0) {
-		free(fields);
-		return len;
+		ret = len;
+		goto error_fields;
 	}
 
 	/* send signature */
@@ -1080,10 +1096,12 @@ int ustcomm_register_event(int sock,
 		len = ustcomm_send_unix_sock(sock, fields, fields_len);
 		free(fields);
 		if (len > 0 && len != fields_len) {
-			return -EIO;
+			ret = -EIO;
+			goto error_metadata;
 		}
 		if (len < 0) {
-			return len;
+			ret = len;
+			goto error_metadata;
 		}
 	} else {
 		free(fields);
@@ -1093,10 +1111,57 @@ int ustcomm_register_event(int sock,
 		/* send model_emf_uri */
 		len = ustcomm_send_unix_sock(sock, model_emf_uri,
 				model_emf_uri_len);
-		if (len > 0 && len != model_emf_uri_len)
-			return -EIO;
-		if (len < 0)
-			return len;
+		if (len > 0 && len != model_emf_uri_len) {
+			ret = -EIO;
+			goto error_metadata;
+		}
+		if (len < 0) {
+			ret = len;
+			goto error_metadata;
+		}
+	}
+
+	/* Send metadata */
+	if (metadata_len > 0) {
+		len = ustcomm_send_unix_sock(sock, metadata, metadata_len);
+		DBG("Sending named metadata for event %s.\n", event_name);
+		if (len > 0 && len != metadata_len) {
+			goto error_metadata;
+		}
+		if (len < 0) {
+			goto error_metadata;
+		}
+		/* Send extra metadata information */
+		for (i = 0; i < nr_write_metadata; i++) {
+			struct ustctl_named_metadata *one_metadata;
+			one_metadata = &metadata[i];
+
+			switch (one_metadata->mtype) {
+			case ustctl_mtype_enum:
+			{
+				int entry_len = one_metadata->u.ctf_enum.len * sizeof(*one_metadata->u.ctf_enum.entries);
+				DBG("Sending entries for enum metadata %s.\n",
+						one_metadata->u.ctf_enum.name);
+				/* Send the entries */
+				len = ustcomm_send_unix_sock(sock, one_metadata->u.ctf_enum.entries, entry_len);
+				free(one_metadata->u.ctf_enum.entries);
+				one_metadata->u.ctf_enum.entries = NULL;
+				if (len > 0 && len != entry_len) {
+					goto error_metadata;
+				}
+				if (len < 0) {
+					goto error_metadata;
+				}
+				break;
+			}
+			default:
+				break;
+			}
+		}
+		free(metadata);
+
+	} else {
+		free(metadata);
 	}
 
 	/* receive reply */
@@ -1130,6 +1195,25 @@ int ustcomm_register_event(int sock,
 			return len;
 		}
 	}
+
+error_fields:
+	free(fields);
+error_metadata:
+	/* First free dynamically allocated content in metadata */
+	for (i = 0; i < nr_write_metadata; i++) {
+		struct ustctl_named_metadata *one_metadata;
+		one_metadata = &metadata[i];
+
+		switch (one_metadata->mtype) {
+		case ustctl_mtype_enum:
+			free(one_metadata->u.ctf_enum.entries);
+			break;
+		default:
+			break;
+		}
+	}
+	free(metadata);
+	return ret;
 }
 
 /*
diff --git a/liblttng-ust-ctl/ustctl.c b/liblttng-ust-ctl/ustctl.c
index 00d9802..9f8ca87 100644
--- a/liblttng-ust-ctl/ustctl.c
+++ b/liblttng-ust-ctl/ustctl.c
@@ -1724,13 +1724,17 @@ int ustctl_recv_register_event(int sock,
 	char **signature,
 	size_t *nr_fields,
 	struct ustctl_field **fields,
-	char **model_emf_uri)
+	char **model_emf_uri,
+	size_t *nr_metadata,
+	struct ustctl_named_metadata **named_metadata)
 {
 	ssize_t len;
 	struct ustcomm_notify_event_msg msg;
-	size_t signature_len, fields_len, model_emf_uri_len;
+	size_t signature_len, fields_len, model_emf_uri_len, metadata_len;
 	char *a_sign = NULL, *a_model_emf_uri = NULL;
 	struct ustctl_field *a_fields = NULL;
+	struct ustctl_named_metadata *a_metadata = NULL;
+	int i;
 
 	len = ustcomm_recv_unix_sock(sock, &msg, sizeof(msg));
 	if (len > 0 && len != sizeof(msg))
@@ -1754,6 +1758,12 @@ int ustctl_recv_register_event(int sock,
 
 	model_emf_uri_len = msg.model_emf_uri_len;
 
+	metadata_len = msg.metadata_len;
+
+	if (metadata_len % sizeof(*a_metadata) != 0) {
+		return -EINVAL;
+	}
+
 	/* recv signature. contains at least \0. */
 	a_sign = zmalloc(signature_len);
 	if (!a_sign)
@@ -1818,13 +1828,73 @@ int ustctl_recv_register_event(int sock,
 		a_model_emf_uri[model_emf_uri_len - 1] = '\0';
 	}
 
+	/* recv metadata */
+	if (metadata_len) {
+		a_metadata = zmalloc(metadata_len);
+		if (!a_metadata) {
+			len = -ENOMEM;
+			goto signature_error;
+		}
+		len = ustcomm_recv_unix_sock(sock, a_metadata, metadata_len);
+		DBG("Received named metadata for event %s.\n", event_name);
+		if (len > 0 && len != metadata_len) {
+			len = -EIO;
+			goto metadata_error;
+		}
+		if (len == 0) {
+			len = -EPIPE;
+			goto metadata_error;
+		}
+		if (len < 0) {
+			goto metadata_error;
+		}
+		/* Receive extra metadata information */
+		for (i = 0; i < metadata_len / sizeof(*a_metadata); i++) {
+			struct ustctl_named_metadata *one_metadata;
+			one_metadata = &a_metadata[i];
+
+			switch (one_metadata->mtype) {
+			case ustctl_mtype_enum:
+			{
+				int entry_len = one_metadata->u.ctf_enum.len * sizeof(*one_metadata->u.ctf_enum.entries);
+				/* Send the entries */
+				one_metadata->u.ctf_enum.entries = zmalloc(entry_len);
+				if (!one_metadata->u.ctf_enum.entries) {
+					len = -ENOMEM;
+					goto metadata_error;
+				}
+				len = ustcomm_recv_unix_sock(sock, one_metadata->u.ctf_enum.entries, entry_len);
+				DBG("Received entries for enum %s.\n", one_metadata->u.ctf_enum.name);
+				if (len > 0 && len != entry_len) {
+					len = -EIO;
+					goto metadata_error;
+				}
+				if (len == 0) {
+					len = -EPIPE;
+					goto metadata_error;
+				}
+				if (len < 0) {
+					goto metadata_error;
+				}
+				break;
+			}
+			default:
+				break;
+			}
+		}
+	}
+
 	*signature = a_sign;
 	*nr_fields = fields_len / sizeof(*a_fields);
 	*fields = a_fields;
 	*model_emf_uri = a_model_emf_uri;
+	*nr_metadata = metadata_len / sizeof(*a_metadata);
+	*named_metadata = a_metadata;
 
 	return 0;
 
+metadata_error:
+	free(a_metadata);
 model_error:
 	free(a_model_emf_uri);
 fields_error:
diff --git a/liblttng-ust/lttng-events.c b/liblttng-ust/lttng-events.c
index 6e16cf2..26a4427 100644
--- a/liblttng-ust/lttng-events.c
+++ b/liblttng-ust/lttng-events.c
@@ -430,7 +430,9 @@ int lttng_event_create(const struct lttng_event_desc *desc,
 		desc->nr_fields,
 		desc->fields,
 		uri,
-		&event->id);
+		&event->id,
+		desc->u.ext.nr_metadata,
+		desc->u.ext.named_metadata);
 	if (ret < 0) {
 		DBG("Error (%d) registering event to sessiond", ret);
 		goto sessiond_register_error;
-- 
1.8.5.3




More information about the lttng-dev mailing list