[lttng-modules,3/3] Introduce LTTNG_KERNEL_SESSION_SET_CREATION_TIME
diff mbox series

Message ID 20190813181425.9536-3-jonathan.rajotte-julien@efficios.com
State New
Headers show
Series
  • [lttng-modules,1/3] Introduce LTTNG_KERNEL_SESSION_SET_NAME
Related show

Commit Message

Jonathan Rajotte Aug. 13, 2019, 6:14 p.m. UTC
Add trace_creation_datetime to the metadata env field

This allows a viewer to get more information regarding the creation time
of a trace. This information is normally inferred from the trace
hierarchy.

The ABI expects an ISO8601 compliant string value. We leave the
formatting to the trace controller.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
---

This should also be backported to 2.11 allowing Babeltrace 2 to merge
traces from archived data (rotation) and output a trace with similar
lttng tree hierarchy.

---
 lttng-abi.c    | 27 +++++++++++++++++++++++++++
 lttng-abi.h    |  7 +++++++
 lttng-events.c | 13 +++++++++----
 lttng-events.h |  1 +
 4 files changed, 44 insertions(+), 4 deletions(-)

Patch
diff mbox series

diff --git a/lttng-abi.c b/lttng-abi.c
index aab2cac..cc8f183 100644
--- a/lttng-abi.c
+++ b/lttng-abi.c
@@ -470,6 +470,23 @@  int lttng_abi_session_set_name(struct lttng_session *session,
 	return 0;
 }
 
+static
+int lttng_abi_session_set_creation_time(struct lttng_session *session,
+		struct lttng_kernel_session_creation_time *time)
+{
+	size_t len;
+
+	len = strnlen(time->iso8601, LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN);
+
+	if (len == LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN) {
+		/* Time is too long/malformed */
+		return -EINVAL;
+	}
+
+	strcpy(session->creation_time, time->iso8601);
+	return 0;
+}
+
 /**
  *	lttng_session_ioctl - lttng session fd ioctl
  *
@@ -589,6 +606,16 @@  long lttng_session_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 			return -EFAULT;
 		return lttng_abi_session_set_name(session, &name);
 	}
+	case LTTNG_KERNEL_SESSION_SET_CREATION_TIME:
+	{
+		struct lttng_kernel_session_creation_time time;
+
+		if (copy_from_user(&time,
+				(struct lttng_kernel_session_creation_time __user *) arg,
+				sizeof(struct lttng_kernel_session_creation_time)))
+			return -EFAULT;
+		return lttng_abi_session_set_creation_time(session, &time);
+	}
 	default:
 		return -ENOIOCTLCMD;
 	}
diff --git a/lttng-abi.h b/lttng-abi.h
index 0dd9a9f..c292de0 100644
--- a/lttng-abi.h
+++ b/lttng-abi.h
@@ -21,6 +21,7 @@ 
 
 #define LTTNG_KERNEL_SYM_NAME_LEN	256
 #define LTTNG_KERNEL_SESSION_NAME_LEN	256
+#define LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN	26
 
 enum lttng_kernel_instrumentation {
 	LTTNG_KERNEL_TRACEPOINT	= 0,
@@ -124,6 +125,10 @@  struct lttng_kernel_session_name {
 	char name[LTTNG_KERNEL_SESSION_NAME_LEN];
 } __attribute__((packed));
 
+struct lttng_kernel_session_creation_time {
+	char iso8601[LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN];
+} __attribute__((packed));
+
 enum lttng_kernel_calibrate_type {
 	LTTNG_KERNEL_CALIBRATE_KRETPROBE,
 };
@@ -219,6 +224,8 @@  struct lttng_kernel_filter_bytecode {
 #define LTTNG_KERNEL_SESSION_STATEDUMP		_IO(0xF6, 0x5C)
 #define LTTNG_KERNEL_SESSION_SET_NAME		\
 	_IOR(0xF6, 0x5D, struct lttng_kernel_session_name)
+#define LTTNG_KERNEL_SESSION_SET_CREATION_TIME		\
+	_IOR(0xF6, 0x5E, struct lttng_kernel_session_creation_time)
 
 /* Channel FD ioctl */
 #define LTTNG_KERNEL_STREAM			_IO(0xF6, 0x62)
diff --git a/lttng-events.c b/lttng-events.c
index 2e7670b..38cd444 100644
--- a/lttng-events.c
+++ b/lttng-events.c
@@ -2514,15 +2514,16 @@  error:
 }
 
 static
-int print_metadata_session_name(struct lttng_session *session)
+int print_metadata_escaped_field(struct lttng_session *session, const char *field,
+		const char *field_value)
 {
 	int ret;
 
-	ret = lttng_metadata_printf(session, "	trace_name = \"");
+	ret = lttng_metadata_printf(session, "	%s = \"", field);
 	if (ret)
 		goto error;
 
-	ret = print_escaped_ctf_string(session, session->name);
+	ret = print_escaped_ctf_string(session, field_value);
 	if (ret)
 		goto error;
 
@@ -2619,7 +2620,11 @@  int _lttng_session_metadata_statedump(struct lttng_session *session)
 	if (ret)
 		goto end;
 
-	ret = print_metadata_session_name(session);
+	ret = print_metadata_escaped_field(session, "trace_name", session->name);
+	if (ret)
+		goto end;
+	ret = print_metadata_escaped_field(session, "trace_creation_datetime",
+			session->creation_time);
 	if (ret)
 		goto end;
 
diff --git a/lttng-events.h b/lttng-events.h
index bdd73ff..8fe36a7 100644
--- a/lttng-events.h
+++ b/lttng-events.h
@@ -522,6 +522,7 @@  struct lttng_session {
 	/* Hash table of events */
 	struct lttng_event_ht events_ht;
 	char name[LTTNG_KERNEL_SESSION_NAME_LEN];
+	char creation_time[LTTNG_KERNEL_SESSION_CREATION_TIME_ISO8601_LEN];
 };
 
 struct lttng_metadata_cache {