All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH lttng-tools v3 2/6] UST command to regenerate the statedump
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
@ 2016-07-05 14:54 ` Julien Desfossez
  2016-07-05 14:54 ` [PATCH lttng-tools v3 3/6] Kernel ioctl " Julien Desfossez
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev

From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 src/bin/lttng-sessiond/lttng-ust-abi.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/bin/lttng-sessiond/lttng-ust-abi.h b/src/bin/lttng-sessiond/lttng-ust-abi.h
index 7bec0c9..9ef7b9a 100644
--- a/src/bin/lttng-sessiond/lttng-ust-abi.h
+++ b/src/bin/lttng-sessiond/lttng-ust-abi.h
@@ -275,6 +275,7 @@ struct lttng_ust_event_exclusion {
 	_UST_CMDW(0x51, struct lttng_ust_channel)
 #define LTTNG_UST_SESSION_START			_UST_CMD(0x52)
 #define LTTNG_UST_SESSION_STOP			_UST_CMD(0x53)
+#define LTTNG_UST_SESSION_STATEDUMP		_UST_CMD(0x54)
 
 /* Channel FD commands */
 #define LTTNG_UST_STREAM			_UST_CMD(0x60)
-- 
1.9.1

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH lttng-tools v3 3/6] Kernel ioctl to regenerate the statedump
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
  2016-07-05 14:54 ` [PATCH lttng-tools v3 2/6] UST command to regenerate the statedump Julien Desfossez
@ 2016-07-05 14:54 ` Julien Desfossez
  2016-07-05 14:54 ` [PATCH lttng-tools v3 4/6] Allow regenerating the statedump of a running session Julien Desfossez
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev

From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 src/common/kernel-ctl/kernel-ioctl.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/common/kernel-ctl/kernel-ioctl.h b/src/common/kernel-ctl/kernel-ioctl.h
index 68056dc..805de02 100644
--- a/src/common/kernel-ctl/kernel-ioctl.h
+++ b/src/common/kernel-ctl/kernel-ioctl.h
@@ -134,6 +134,8 @@
  */
 #define LTTNG_KERNEL_SESSION_LIST_TRACKER_PIDS	_IO(0xF6, 0x58)
 #define LTTNG_KERNEL_SESSION_METADATA_REGEN	_IO(0xF6, 0x59)
+/* 0x5A and 0x5B are reserved for a future ABI-breaking cleanup. */
+#define LTTNG_KERNEL_SESSION_STATEDUMP		_IO(0xF6, 0x5C)
 
 /* Channel FD ioctl */
 #define LTTNG_KERNEL_STREAM			_IO(0xF6, 0x62)
-- 
1.9.1

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH lttng-tools v3 4/6] Allow regenerating the statedump of a running session
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
  2016-07-05 14:54 ` [PATCH lttng-tools v3 2/6] UST command to regenerate the statedump Julien Desfossez
  2016-07-05 14:54 ` [PATCH lttng-tools v3 3/6] Kernel ioctl " Julien Desfossez
@ 2016-07-05 14:54 ` Julien Desfossez
  2016-07-05 14:54 ` [PATCH lttng-tools v3 5/6] Tests for the regenerate statedump command Julien Desfossez
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev, Julien Desfossez

The "lttng regenerate statedump" command can be used to regenerate the
statedump of a running session whenever needed. This is particularly
useful in snapshot and trace-file rotation modes where the original
statedump may be lost.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
---
 include/lttng/lttng-error.h              |  2 +
 include/lttng/lttng.h                    |  9 +++++
 src/bin/lttng-sessiond/cmd.c             | 55 ++++++++++++++++++++++++++
 src/bin/lttng-sessiond/cmd.h             |  1 +
 src/bin/lttng-sessiond/main.c            |  6 +++
 src/bin/lttng-sessiond/ust-app.c         | 66 ++++++++++++++++++++++++++++++++
 src/bin/lttng-sessiond/ust-app.h         |  6 +++
 src/bin/lttng/commands/regenerate.c      | 19 +++++++++
 src/common/error.c                       |  2 +
 src/common/kernel-ctl/kernel-ctl.c       |  5 +++
 src/common/kernel-ctl/kernel-ctl.h       |  1 +
 src/common/sessiond-comm/sessiond-comm.h |  1 +
 src/lib/lttng-ctl/lttng-ctl.c            | 30 +++++++++++++++
 13 files changed, 203 insertions(+)

diff --git a/include/lttng/lttng-error.h b/include/lttng/lttng-error.h
index 72194ef..df59f8f 100644
--- a/include/lttng/lttng-error.h
+++ b/include/lttng/lttng-error.h
@@ -142,6 +142,8 @@ enum lttng_error_code {
 	LTTNG_ERR_LIVE_SESSION           = 119, /* Live session unsupported */
 	LTTNG_ERR_PER_PID_SESSION        = 120, /* Per-PID sessions unsupported */
 	LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE = 121, /* Context unavailable on this kernel */
+	LTTNG_ERR_REGEN_STATEDUMP_FAIL   = 122, /* Failed to regenerate the state dump */
+	LTTNG_ERR_REGEN_STATEDUMP_NOMEM   = 123, /* Failed to regenerate the state dump, not enough memory */
 
 	/* MUST be last element */
 	LTTNG_ERR_NR,                           /* Last element */
diff --git a/include/lttng/lttng.h b/include/lttng/lttng.h
index 09aa969..d37d6c0 100644
--- a/include/lttng/lttng.h
+++ b/include/lttng/lttng.h
@@ -173,6 +173,15 @@ extern int lttng_metadata_regenerate(const char *session_name);
  */
 extern int lttng_regenerate_metadata(const char *session_name);
 
+/*
+ * Trigger the regeneration of the statedump for a session. The new statedump
+ * information is appended to the currently active trace, the session needs to
+ * be active.
+ *
+ * Return 0 on success, a negative LTTng error code on error.
+ */
+extern int lttng_regenerate_statedump(const char *session_name);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c
index bd63389..a57afe2 100644
--- a/src/bin/lttng-sessiond/cmd.c
+++ b/src/bin/lttng-sessiond/cmd.c
@@ -3540,6 +3540,61 @@ end:
 }
 
 /*
+ * Command LTTNG_REGENERATE_STATEDUMP from the lttng-ctl library.
+ *
+ * Ask the tracer to regenerate a new statedump.
+ *
+ * Return 0 on success or else a LTTNG_ERR code.
+ */
+int cmd_regenerate_statedump(struct ltt_session *session)
+{
+	int ret;
+
+	assert(session);
+
+	if (!session->active) {
+		ret = LTTNG_ERR_SESSION_NOT_STARTED;
+		goto end;
+	}
+	ret = 0;
+
+	if (session->kernel_session) {
+		ret = kernctl_session_regenerate_statedump(
+				session->kernel_session->fd);
+		/*
+		 * Currently, the statedump in kernel can only fail if out
+		 * of memory.
+		 */
+		if (ret < 0) {
+			if (ret == -ENOMEM) {
+				ret = LTTNG_ERR_REGEN_STATEDUMP_NOMEM;
+			} else {
+				ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
+			}
+			ERR("Failed to regenerate the kernel statedump");
+			goto end;
+		}
+	}
+
+	if (session->ust_session) {
+		ret = ust_app_regenerate_statedump_all(session->ust_session);
+		/*
+		 * Currently, the statedump in UST always returns 0.
+		 */
+		if (ret < 0) {
+			ret = LTTNG_ERR_REGEN_STATEDUMP_FAIL;
+			ERR("Failed to regenerate the UST statedump");
+			goto end;
+		}
+	}
+	DBG("Cmd regenerate statedump for session %s", session->name);
+	ret = LTTNG_OK;
+
+end:
+	return ret;
+}
+
+/*
  * Send relayd sockets from snapshot output to consumer. Ignore request if the
  * snapshot output is *not* set with a remote destination.
  *
diff --git a/src/bin/lttng-sessiond/cmd.h b/src/bin/lttng-sessiond/cmd.h
index 320d717..975a7f1 100644
--- a/src/bin/lttng-sessiond/cmd.h
+++ b/src/bin/lttng-sessiond/cmd.h
@@ -111,5 +111,6 @@ int cmd_snapshot_record(struct ltt_session *session,
 int cmd_set_session_shm_path(struct ltt_session *session,
 		const char *shm_path);
 int cmd_regenerate_metadata(struct ltt_session *session);
+int cmd_regenerate_statedump(struct ltt_session *session);
 
 #endif /* CMD_H */
diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
index 3623e5d..8309c3f 100644
--- a/src/bin/lttng-sessiond/main.c
+++ b/src/bin/lttng-sessiond/main.c
@@ -3004,6 +3004,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
 	case LTTNG_SAVE_SESSION:
 	case LTTNG_SET_SESSION_SHM_PATH:
 	case LTTNG_REGENERATE_METADATA:
+	case LTTNG_REGENERATE_STATEDUMP:
 		need_domain = 0;
 		break;
 	default:
@@ -4119,6 +4120,11 @@ error_add_context:
 		ret = cmd_regenerate_metadata(cmd_ctx->session);
 		break;
 	}
+	case LTTNG_REGENERATE_STATEDUMP:
+	{
+		ret = cmd_regenerate_statedump(cmd_ctx->session);
+		break;
+	}
 	default:
 		ret = LTTNG_ERR_UND;
 		break;
diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
index f30df20..47bd04c 100644
--- a/src/bin/lttng-sessiond/ust-app.c
+++ b/src/bin/lttng-sessiond/ust-app.c
@@ -6148,3 +6148,69 @@ end:
 	rcu_read_unlock();
 	return ret;
 }
+
+static
+int ust_app_regenerate_statedump(struct ltt_ust_session *usess,
+		struct ust_app *app)
+{
+	int ret = 0;
+	struct ust_app_session *ua_sess;
+
+	DBG("Regenerating the metadata for ust app pid %d", app->pid);
+
+	rcu_read_lock();
+
+	ua_sess = lookup_session_by_app(usess, app);
+	if (ua_sess == NULL) {
+		/* The session is in teardown process. Ignore and continue. */
+		goto end;
+	}
+
+	pthread_mutex_lock(&ua_sess->lock);
+
+	if (ua_sess->deleted) {
+		goto end_unlock;
+	}
+
+	pthread_mutex_lock(&app->sock_lock);
+	ret = ustctl_regenerate_statedump(app->sock, ua_sess->handle);
+	pthread_mutex_unlock(&app->sock_lock);
+
+end_unlock:
+	pthread_mutex_unlock(&ua_sess->lock);
+
+end:
+	rcu_read_unlock();
+	health_code_update();
+	return ret;
+}
+
+/*
+ * Regenerate the statedump for each app in the session.
+ */
+int ust_app_regenerate_statedump_all(struct ltt_ust_session *usess)
+{
+	int ret = 0;
+	struct lttng_ht_iter iter;
+	struct ust_app *app;
+
+	DBG("Regenerating the metadata for all UST apps");
+
+	rcu_read_lock();
+
+	cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
+		if (!app->compatible) {
+			continue;
+		}
+
+		ret = ust_app_regenerate_statedump(usess, app);
+		if (ret < 0) {
+			/* Continue to the next app even on error */
+			continue;
+		}
+	}
+
+	rcu_read_unlock();
+
+	return 0;
+}
diff --git a/src/bin/lttng-sessiond/ust-app.h b/src/bin/lttng-sessiond/ust-app.h
index d02f353..8369d14 100644
--- a/src/bin/lttng-sessiond/ust-app.h
+++ b/src/bin/lttng-sessiond/ust-app.h
@@ -352,6 +352,7 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess,
 		struct ltt_ust_channel *uchan,
 		struct consumer_output *consumer,
 		int overwrite, uint64_t *discarded, uint64_t *lost);
+int ust_app_regenerate_statedump_all(struct ltt_ust_session *usess);
 
 static inline
 int ust_app_supported(void)
@@ -583,6 +584,11 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess,
 {
 	return 0;
 }
+static inline
+int ust_app_regenerate_metadata_all(struct ltt_ust_session *usess)
+{
+	return 0;
+}
 
 #endif /* HAVE_LIBLTTNG_UST_CTL */
 
diff --git a/src/bin/lttng/commands/regenerate.c b/src/bin/lttng/commands/regenerate.c
index c64d8fe..5c982c8 100644
--- a/src/bin/lttng/commands/regenerate.c
+++ b/src/bin/lttng/commands/regenerate.c
@@ -32,6 +32,7 @@ static char *opt_session_name;
 static char *session_name = NULL;
 
 static int regenerate_metadata(int argc, const char **argv);
+static int regenerate_statedump(int argc, const char **argv);
 
 enum {
 	OPT_HELP = 1,
@@ -52,6 +53,7 @@ static struct poptOption long_options[] = {
 
 static struct cmd_struct actions[] = {
 	{ "metadata", regenerate_metadata },
+	{ "statedump", regenerate_statedump },
 	{ NULL, NULL }	/* Array closure */
 };
 
@@ -88,6 +90,23 @@ end:
 	return ret;
 }
 
+static int regenerate_statedump(int argc, const char **argv)
+{
+	int ret;
+
+	if (argc > 1) {
+		ret = -LTTNG_ERR_INVALID;
+		goto end;
+	}
+	ret = lttng_regenerate_statedump(session_name);
+	if (ret == 0) {
+		MSG("State dump successfully regenerated for session %s", session_name);
+	}
+
+end:
+	return ret;
+}
+
 static int handle_command(const char **argv)
 {
 	struct cmd_struct *cmd;
diff --git a/src/common/error.c b/src/common/error.c
index bc42577..d3d952a 100644
--- a/src/common/error.c
+++ b/src/common/error.c
@@ -183,6 +183,8 @@ static const char *error_string_array[] = {
 	[ ERROR_INDEX(LTTNG_ERR_LIVE_SESSION) ] = "Live sessions are not supported",
 	[ ERROR_INDEX(LTTNG_ERR_PER_PID_SESSION) ] = "Per-PID tracing sessions are not supported",
 	[ ERROR_INDEX(LTTNG_ERR_KERN_CONTEXT_UNAVAILABLE) ] = "Context unavailable on this kernel",
+	[ ERROR_INDEX(LTTNG_ERR_REGEN_STATEDUMP_FAIL) ] = "Failed to regenerate the state dump",
+	[ ERROR_INDEX(LTTNG_ERR_REGEN_STATEDUMP_NOMEM) ] = "Failed to regenerate the state dump, not enough memory",
 
 	/* Last element */
 	[ ERROR_INDEX(LTTNG_ERR_NR) ] = "Unknown error code"
diff --git a/src/common/kernel-ctl/kernel-ctl.c b/src/common/kernel-ctl/kernel-ctl.c
index e1de0e7..1c2ab61 100644
--- a/src/common/kernel-ctl/kernel-ctl.c
+++ b/src/common/kernel-ctl/kernel-ctl.c
@@ -230,6 +230,11 @@ int kernctl_session_regenerate_metadata(int fd)
 	return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_METADATA_REGEN);
 }
 
+int kernctl_session_regenerate_statedump(int fd)
+{
+	return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_STATEDUMP);
+}
+
 int kernctl_create_stream(int fd)
 {
 	return compat_ioctl_no_arg(fd, LTTNG_KERNEL_OLD_STREAM,
diff --git a/src/common/kernel-ctl/kernel-ctl.h b/src/common/kernel-ctl/kernel-ctl.h
index f30e6f3..7c25a17 100644
--- a/src/common/kernel-ctl/kernel-ctl.h
+++ b/src/common/kernel-ctl/kernel-ctl.h
@@ -66,6 +66,7 @@ int kernctl_untrack_pid(int fd, int pid);
 int kernctl_list_tracker_pids(int fd);
 
 int kernctl_session_regenerate_metadata(int fd);
+int kernctl_session_regenerate_statedump(int fd);
 
 /* Buffer operations */
 
diff --git a/src/common/sessiond-comm/sessiond-comm.h b/src/common/sessiond-comm/sessiond-comm.h
index 29740c1..628b1ea 100644
--- a/src/common/sessiond-comm/sessiond-comm.h
+++ b/src/common/sessiond-comm/sessiond-comm.h
@@ -95,6 +95,7 @@ enum lttcomm_sessiond_command {
 	LTTNG_LIST_TRACKER_PIDS             = 34,
 	LTTNG_SET_SESSION_SHM_PATH          = 40,
 	LTTNG_REGENERATE_METADATA           = 41,
+	LTTNG_REGENERATE_STATEDUMP          = 42,
 };
 
 enum lttcomm_relayd_command {
diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c
index 8c78e1c..bcd59f0 100644
--- a/src/lib/lttng-ctl/lttng-ctl.c
+++ b/src/lib/lttng-ctl/lttng-ctl.c
@@ -2419,6 +2419,36 @@ int lttng_metadata_regenerate(const char *session_name)
 }
 
 /*
+ * Regenerate the statedump of a session.
+ * Return 0 on success, a negative error code on error.
+ */
+int lttng_regenerate_statedump(const char *session_name)
+{
+	int ret;
+	struct lttcomm_session_msg lsm;
+
+	if (!session_name) {
+		ret = -LTTNG_ERR_INVALID;
+		goto end;
+	}
+
+	memset(&lsm, 0, sizeof(lsm));
+	lsm.cmd_type = LTTNG_REGENERATE_STATEDUMP;
+
+	lttng_ctl_copy_string(lsm.session.name, session_name,
+			sizeof(lsm.session.name));
+
+	ret = lttng_ctl_ask_sessiond(&lsm, NULL);
+	if (ret < 0) {
+		goto end;
+	}
+
+	ret = 0;
+end:
+	return ret;
+}
+
+/*
  * lib constructor.
  */
 static void __attribute__((constructor)) init(void)
-- 
1.9.1

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH lttng-tools v3 5/6] Tests for the regenerate statedump command
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
                   ` (2 preceding siblings ...)
  2016-07-05 14:54 ` [PATCH lttng-tools v3 4/6] Allow regenerating the statedump of a running session Julien Desfossez
@ 2016-07-05 14:54 ` Julien Desfossez
  2016-07-05 14:54 ` [PATCH lttng-tools v3 6/6] Manpage " Julien Desfossez
  2016-07-06 20:30 ` [PATCH lttng-tools v3 1/6] Rename the "metadata regenerate" command to "regenerate metadata" Jérémie Galarneau
  5 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev, Julien Desfossez

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Reviewed-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
 configure.ac                                       |  1 +
 tests/fast_regression                              |  1 +
 tests/regression/tools/Makefile.am                 |  2 +-
 tests/regression/tools/regen-statedump/Makefile.am | 16 ++++
 tests/regression/tools/regen-statedump/test_kernel | 80 +++++++++++++++++++
 tests/regression/tools/regen-statedump/test_ust    | 89 ++++++++++++++++++++++
 tests/root_regression                              |  1 +
 tests/utils/utils.sh                               | 54 +++++++++++++
 8 files changed, 243 insertions(+), 1 deletion(-)
 create mode 100644 tests/regression/tools/regen-statedump/Makefile.am
 create mode 100755 tests/regression/tools/regen-statedump/test_kernel
 create mode 100755 tests/regression/tools/regen-statedump/test_ust

diff --git a/configure.ac b/configure.ac
index 89a7858..6222e2b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -981,6 +981,7 @@ AC_CONFIG_FILES([
 	tests/regression/tools/wildcard/Makefile
 	tests/regression/tools/crash/Makefile
 	tests/regression/tools/regen-metadata/Makefile
+	tests/regression/tools/regen-statedump/Makefile
 	tests/regression/ust/Makefile
 	tests/regression/ust/nprocesses/Makefile
 	tests/regression/ust/high-throughput/Makefile
diff --git a/tests/fast_regression b/tests/fast_regression
index 262c846..8edbeca 100644
--- a/tests/fast_regression
+++ b/tests/fast_regression
@@ -17,6 +17,7 @@ regression/tools/mi/test_mi
 regression/tools/wildcard/test_event_wildcard
 regression/tools/crash/test_crash
 regression/tools/regen-metadata/test_ust
+regression/tools/regen-statedump/test_ust
 regression/ust/before-after/test_before_after
 regression/ust/buffers-pid/test_buffers_pid
 regression/ust/multi-session/test_multi_session
diff --git a/tests/regression/tools/Makefile.am b/tests/regression/tools/Makefile.am
index 91820ad..76374c7 100644
--- a/tests/regression/tools/Makefile.am
+++ b/tests/regression/tools/Makefile.am
@@ -1,2 +1,2 @@
 SUBDIRS = streaming filtering health tracefile-limits snapshots live exclusion save-load mi \
-		wildcard crash regen-metadata
+		wildcard crash regen-metadata regen-statedump
diff --git a/tests/regression/tools/regen-statedump/Makefile.am b/tests/regression/tools/regen-statedump/Makefile.am
new file mode 100644
index 0000000..d4a92eb
--- /dev/null
+++ b/tests/regression/tools/regen-statedump/Makefile.am
@@ -0,0 +1,16 @@
+noinst_SCRIPTS = test_ust test_kernel
+EXTRA_DIST = test_ust test_kernel
+
+all-local:
+	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+		for script in $(EXTRA_DIST); do \
+			cp -f $(srcdir)/$$script $(builddir); \
+		done; \
+	fi
+
+clean-local:
+	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+		for script in $(EXTRA_DIST); do \
+			rm -f $(builddir)/$$script; \
+		done; \
+	fi
diff --git a/tests/regression/tools/regen-statedump/test_kernel b/tests/regression/tools/regen-statedump/test_kernel
new file mode 100755
index 0000000..85afe76
--- /dev/null
+++ b/tests/regression/tools/regen-statedump/test_kernel
@@ -0,0 +1,80 @@
+#!/bin/bash
+#
+# Copyright (C) - 2016 Julien Desfossez <jdesfossez@efficios.com>
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+TEST_DESC="Regenerate the statedump - Kernel tracing"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../../..
+EVENT_NAME="lttng_test_filter_event"
+PID_RELAYD=0
+SESSION_NAME=""
+EVENT_NAME="lttng_statedump_start,lttng_statedump_end"
+
+TRACE_PATH=$(mktemp -d)
+
+NUM_TESTS=11
+
+source $TESTDIR/utils/utils.sh
+
+# LTTng kernel modules check
+out=`ls /lib/modules/$(uname -r)/extra | grep lttng`
+if [ -z "$out" ]; then
+	BAIL_OUT "LTTng modules not detected."
+fi
+
+function test_kernel_local ()
+{
+	diag "Test kernel local with statedump regeneration"
+	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+	lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
+	start_lttng_tracing_ok $SESSION_NAME
+	echo -n "100" > /proc/lttng-test-filter-event
+	regenerate_statedump_ok $SESSION_NAME
+	stop_lttng_tracing_ok $SESSION_NAME
+	validate_trace_count $EVENT_NAME $TRACE_PATH 4
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	destroy_lttng_session_ok $SESSION_NAME
+}
+
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+if [ "$(id -u)" == "0" ]; then
+	isroot=1
+else
+	isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS ||
+{
+	start_lttng_sessiond
+	modprobe lttng-test
+
+	tests=( test_kernel_local )
+
+	for fct_test in ${tests[@]};
+	do
+		SESSION_NAME=$(randstring 16 0)
+		${fct_test}
+	done
+
+	rmmod lttng-test
+	stop_lttng_sessiond
+}
diff --git a/tests/regression/tools/regen-statedump/test_ust b/tests/regression/tools/regen-statedump/test_ust
new file mode 100755
index 0000000..486b9a5
--- /dev/null
+++ b/tests/regression/tools/regen-statedump/test_ust
@@ -0,0 +1,89 @@
+#!/bin/bash
+#
+# Copyright (C) - 2016 Julien Desfossez <jdesfossez@efficios.com>
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+TEST_DESC="Regenerate the statedump - User-space tracing"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../../..
+NR_ITER=10
+NR_USEC_WAIT=0
+TESTAPP_PATH="$TESTDIR/utils/testapp"
+TESTAPP_NAME="gen-ust-events"
+TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
+SESSION_NAME="stream"
+EVENT_NAME="lttng_ust_statedump:start,lttng_ust_statedump:end"
+PID_RELAYD=0
+
+TRACE_PATH=$(mktemp -d)
+
+NUM_TESTS=11
+
+source $TESTDIR/utils/utils.sh
+
+if [ ! -x "$TESTAPP_BIN" ]; then
+	BAIL_OUT "No UST events binary detected."
+fi
+
+function test_ust_local ()
+{
+	local file_sync_after_first=$(mktemp -u)
+	local file_sync_before_last=$(mktemp -u)
+
+	diag "Test UST local with statedump regeneration"
+	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
+
+	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+	start_lttng_tracing_ok $SESSION_NAME
+
+	while [ ! -f "${file_sync_after_first}" ]; do
+		sleep 0.5
+	done
+
+	regenerate_statedump_ok $SESSION_NAME
+
+	touch ${file_sync_before_last}
+
+	stop_lttng_tracing_ok $SESSION_NAME
+	destroy_lttng_session_ok $SESSION_NAME
+	# Validate test
+	validate_trace_count $EVENT_NAME $TRACE_PATH 4
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	rm -f ${file_sync_after_first}
+	rm -f ${file_sync_before_last}
+}
+
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+start_lttng_sessiond
+
+tests=( test_ust_local )
+
+for fct_test in ${tests[@]};
+do
+	SESSION_NAME=$(randstring 16 0)
+	${fct_test}
+done
+
+stop_lttng_sessiond
+
+exit $out
diff --git a/tests/root_regression b/tests/root_regression
index d0fad04..d3eaf23 100644
--- a/tests/root_regression
+++ b/tests/root_regression
@@ -15,4 +15,5 @@ regression/tools/filtering/test_unsupported_op
 regression/tools/filtering/test_valid_filter
 regression/tools/wildcard/test_event_wildcard
 regression/tools/regen-metadata/test_kernel
+regression/tools/regen-statedump/test_kernel
 regression/ust/test_event_perf
diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh
index 3d744e2..c56a8aa 100644
--- a/tests/utils/utils.sh
+++ b/tests/utils/utils.sh
@@ -1294,6 +1294,35 @@ function validate_trace
 	return $ret
 }
 
+function validate_trace_count
+{
+	local event_name=$1
+	local trace_path=$2
+	local expected_count=$3
+
+	which $BABELTRACE_BIN >/dev/null
+	if [ $? -ne 0 ]; then
+	    skip 0 "Babeltrace binary not found. Skipping trace validation"
+	fi
+
+	cnt=0
+	OLDIFS=$IFS
+	IFS=","
+	for i in $event_name; do
+		traced=$($BABELTRACE_BIN $trace_path 2>/dev/null | grep $i | wc -l)
+		if [ "$traced" -ne 0 ]; then
+			pass "Validate trace for event $i, $traced events"
+		else
+			fail "Validate trace for event $i"
+			diag "Found $traced occurences of $i"
+		fi
+		cnt=$(($cnt + $traced))
+	done
+	IFS=$OLDIFS
+	test $cnt -eq $expected_count
+	ok $? "Read a total of $cnt events, expected $expected_count"
+}
+
 function trace_first_line
 {
 	local trace_path=$1
@@ -1391,6 +1420,31 @@ function regenerate_metadata_fail ()
 	regenerate_metadata 1 "$@"
 }
 
+function regenerate_statedump ()
+{
+	local expected_to_fail=$1
+	local sess_name=$2
+
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN regenerate statedump -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST
+	ret=$?
+	if [[ $expected_to_fail -eq "1" ]]; then
+		test "$ret" -ne "0"
+		ok $? "Expected fail on regenerate statedump $sess_name"
+	else
+		ok $ret "Metadata regenerate $sess_name"
+	fi
+}
+
+function regenerate_statedump_ok ()
+{
+	regenerate_statedump 0 "$@"
+}
+
+function regenerate_statedump_fail ()
+{
+	regenerate_statedump 1 "$@"
+}
+
 function destructive_tests_enabled ()
 {
 	if [ ${LTTNG_ENABLE_DESTRUCTIVE_TESTS} = "will-break-my-system" ]; then
-- 
1.9.1

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH lttng-tools v3 6/6] Manpage for the regenerate statedump command
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
                   ` (3 preceding siblings ...)
  2016-07-05 14:54 ` [PATCH lttng-tools v3 5/6] Tests for the regenerate statedump command Julien Desfossez
@ 2016-07-05 14:54 ` Julien Desfossez
  2016-07-06 20:30 ` [PATCH lttng-tools v3 1/6] Rename the "metadata regenerate" command to "regenerate metadata" Jérémie Galarneau
  5 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev, Julien Desfossez

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
---
 doc/man/lttng-regenerate.1.txt | 46 ++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 15 deletions(-)

diff --git a/doc/man/lttng-regenerate.1.txt b/doc/man/lttng-regenerate.1.txt
index dbbfa4d..a3af401 100644
--- a/doc/man/lttng-regenerate.1.txt
+++ b/doc/man/lttng-regenerate.1.txt
@@ -9,35 +9,51 @@ lttng-regenerate - Manage an LTTng tracing session's data regeneration
 
 SYNOPSIS
 --------
-Regenerate the metadata of a session
+Regenerate the metadata of a session:
 
 [verse]
 *lttng* ['linkgenoptions:(GENERAL OPTIONS)'] *regenerate metadata* [option:--session='SESSION']
 
+Regenerate the state dump of a session:
+
+[verse]
+*lttng* ['linkgenoptions:(GENERAL OPTIONS)'] *regenerate statedump* [option:--session='SESSION']
+
 DESCRIPTION
 -----------
-The `lttng regenerate` command manages a tracing session's data regeneration
-options.
+The `lttng regenerate` command regenerates specific data of a tracing session.
+
+As of this version, the `metadata` and `statedump` actions are
+available.
+
+
+Regenerating a tracing session's metadata
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The `lttng regenerate metadata` action can be used to resample the offset
+between the system's monotonic clock and the wall-clock time.
+
+This action is meant to be used to resample the wall-clock time following a
+major link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP] correction.
+As such, a system booting with an incorrect wall time can be traced before its
+wall time is NTP-corrected. Regenerating the tracing session's metadata ensures
+that trace viewers can accurately determine the events time relative to Unix
+Epoch.
 
-As of this version, only the `metadata` command's action is available.
-Regenerating a tracing session's metadata can be used to
-resample the offset between the system's monotonic clock and
-the wall-clock time.
 
-This command is meant to be used to resample the wall-clock time
-following a major
-link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP]
-correction. As such, a system booting with an incorrect wall time can be
-traced before its wall time is NTP-corrected. Regenerating the tracing
-session's metadata ensures that trace viewers can accurately determine
-the events time relative to Unix Epoch.
+Regenerating a tracing session's state dump
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The `lttng regenerate statedump` action can be used to collect up-to-date state
+dump information during the tracing session. This is particularly useful in
+snapshot (see man:lttng-snapshot(1)) or trace file rotation (see
+man:lttng-enable-channel(1)) modes where the state dump information may be
+lost.
 
 
 include::common-cmd-options-head.txt[]
 
 
 option:-s, option:--session='SESSION'::
-    Manage the metadata generation of the tracing session named 'SESSION'
+    Regenerate the data of the tracing session named 'SESSION'
     instead of the current tracing session.
 
 
-- 
1.9.1

_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH lttng-tools v3 1/6] Rename the "metadata regenerate" command to "regenerate metadata"
       [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
                   ` (4 preceding siblings ...)
  2016-07-05 14:54 ` [PATCH lttng-tools v3 6/6] Manpage " Julien Desfossez
@ 2016-07-06 20:30 ` Jérémie Galarneau
  5 siblings, 0 replies; 7+ messages in thread
From: Jérémie Galarneau @ 2016-07-06 20:30 UTC (permalink / raw)
  To: Julien Desfossez; +Cc: Philippe Proulx, lttng-dev, Jeremie Galarneau

All six patches are merged, thanks!

Jérémie

On Tue, Jul 5, 2016 at 10:54 AM, Julien Desfossez
<jdesfossez@efficios.com> wrote:
> Prepare the deprecation of the "metadata regenerate" command since we
> need to regenerate the statedump as well, so it is more convenient to
> have one command to regenerate various session's attributes.
>
> Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
> ---
>  configure.ac                                      |   2 +-
>  doc/man/Makefile.am                               |   3 +-
>  doc/man/lttng-metadata.1.txt                      |  17 +-
>  doc/man/lttng-regenerate.1.txt                    |  63 +++++
>  include/lttng/lttng.h                             |   8 +-
>  src/bin/lttng-sessiond/cmd.c                      |  15 +-
>  src/bin/lttng-sessiond/cmd.h                      |   2 +-
>  src/bin/lttng-sessiond/main.c                     |   6 +-
>  src/bin/lttng/Makefile.am                         |   1 +
>  src/bin/lttng/command.h                           |   1 +
>  src/bin/lttng/commands/metadata.c                 |   2 +-
>  src/bin/lttng/commands/regenerate.c               | 266 ++++++++++++++++++++++
>  src/bin/lttng/lttng.c                             |   1 +
>  src/common/kernel-ctl/kernel-ctl.c                |   2 +-
>  src/common/kernel-ctl/kernel-ctl.h                |   2 +-
>  src/common/mi-lttng.c                             |   2 +
>  src/common/mi-lttng.h                             |   2 +
>  src/common/sessiond-comm/sessiond-comm.h          |   4 +-
>  src/lib/lttng-ctl/lttng-ctl.c                     |  12 +-
>  tests/destructive/metadata-regeneration           |   8 +-
>  tests/fast_regression                             |   2 +-
>  tests/regression/Makefile.am                      |   2 +-
>  tests/regression/tools/Makefile.am                |   2 +-
>  tests/regression/tools/metadata-regen/Makefile.am |  16 --
>  tests/regression/tools/metadata-regen/test_kernel | 109 ---------
>  tests/regression/tools/metadata-regen/test_ust    | 208 -----------------
>  tests/regression/tools/mi/test_mi                 |   4 +-
>  tests/regression/tools/regen-metadata/Makefile.am |  16 ++
>  tests/regression/tools/regen-metadata/test_kernel | 109 +++++++++
>  tests/regression/tools/regen-metadata/test_ust    | 208 +++++++++++++++++
>  tests/root_regression                             |   2 +-
>  tests/utils/utils.sh                              |  14 +-
>  32 files changed, 724 insertions(+), 387 deletions(-)
>  create mode 100644 doc/man/lttng-regenerate.1.txt
>  create mode 100644 src/bin/lttng/commands/regenerate.c
>  delete mode 100644 tests/regression/tools/metadata-regen/Makefile.am
>  delete mode 100755 tests/regression/tools/metadata-regen/test_kernel
>  delete mode 100755 tests/regression/tools/metadata-regen/test_ust
>  create mode 100644 tests/regression/tools/regen-metadata/Makefile.am
>  create mode 100755 tests/regression/tools/regen-metadata/test_kernel
>  create mode 100755 tests/regression/tools/regen-metadata/test_ust
>
> diff --git a/configure.ac b/configure.ac
> index fb2b013..89a7858 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -980,7 +980,7 @@ AC_CONFIG_FILES([
>         tests/regression/tools/mi/Makefile
>         tests/regression/tools/wildcard/Makefile
>         tests/regression/tools/crash/Makefile
> -       tests/regression/tools/metadata-regen/Makefile
> +       tests/regression/tools/regen-metadata/Makefile
>         tests/regression/ust/Makefile
>         tests/regression/ust/nprocesses/Makefile
>         tests/regression/ust/high-throughput/Makefile
> diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am
> index 1090f1a..f75db6e 100644
> --- a/doc/man/Makefile.am
> +++ b/doc/man/Makefile.am
> @@ -30,7 +30,8 @@ MAN1_NAMES = \
>         lttng-enable-event \
>         lttng-disable-event \
>         lttng-crash \
> -       lttng-metadata
> +       lttng-metadata \
> +       lttng-regenerate
>  MAN3_NAMES =
>  MAN8_NAMES = lttng-sessiond lttng-relayd
>  MAN1_NO_ASCIIDOC_NAMES =
> diff --git a/doc/man/lttng-metadata.1.txt b/doc/man/lttng-metadata.1.txt
> index 0fa240e..5348916 100644
> --- a/doc/man/lttng-metadata.1.txt
> +++ b/doc/man/lttng-metadata.1.txt
> @@ -15,21 +15,8 @@ SYNOPSIS
>
>  DESCRIPTION
>  -----------
> -The `lttng metadata` command manages a tracing session's metadata
> -generation options.
> -
> -As of this version, only the `regenerate` command's action is available.
> -Regenerating a tracing session's metadata can be used to
> -resample the offset between the system's monotonic clock and
> -the wall-clock time.
> -
> -This command is meant to be used to resample the wall-clock time
> -following a major
> -link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP]
> -correction. As such, a system booting with an incorrect wall time can be
> -traced before its wall time is NTP-corrected. Regenerating the tracing
> -session's metadata ensures that trace viewers can accurately determine
> -the events time relative to Unix Epoch.
> +WARNING: This command is **deprecated**; it has been replaced by the *lttng
> +regenerate metadata* command (see man:lttng-regenerate(1)).
>
>
>  include::common-cmd-options-head.txt[]
> diff --git a/doc/man/lttng-regenerate.1.txt b/doc/man/lttng-regenerate.1.txt
> new file mode 100644
> index 0000000..dbbfa4d
> --- /dev/null
> +++ b/doc/man/lttng-regenerate.1.txt
> @@ -0,0 +1,63 @@
> +lttng-regenerate(1)
> +=================
> +
> +
> +NAME
> +----
> +lttng-regenerate - Manage an LTTng tracing session's data regeneration
> +
> +
> +SYNOPSIS
> +--------
> +Regenerate the metadata of a session
> +
> +[verse]
> +*lttng* ['linkgenoptions:(GENERAL OPTIONS)'] *regenerate metadata* [option:--session='SESSION']
> +
> +DESCRIPTION
> +-----------
> +The `lttng regenerate` command manages a tracing session's data regeneration
> +options.
> +
> +As of this version, only the `metadata` command's action is available.
> +Regenerating a tracing session's metadata can be used to
> +resample the offset between the system's monotonic clock and
> +the wall-clock time.
> +
> +This command is meant to be used to resample the wall-clock time
> +following a major
> +link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP]
> +correction. As such, a system booting with an incorrect wall time can be
> +traced before its wall time is NTP-corrected. Regenerating the tracing
> +session's metadata ensures that trace viewers can accurately determine
> +the events time relative to Unix Epoch.
> +
> +
> +include::common-cmd-options-head.txt[]
> +
> +
> +option:-s, option:--session='SESSION'::
> +    Manage the metadata generation of the tracing session named 'SESSION'
> +    instead of the current tracing session.
> +
> +
> +include::common-cmd-help-options.txt[]
> +
> +
> +LIMITATIONS
> +-----------
> +The `lttng regenerate metadata` command can only be used on kernel and
> +user space tracing sessions (using per-user buffering), in non-live
> +mode.
> +
> +See man:lttng-enable-channel(1) for more information about
> +buffering schemes and man:lttng-create(1) for more information
> +about the different tracing session modes.
> +
> +
> +include::common-cmd-footer.txt[]
> +
> +
> +SEE ALSO
> +--------
> +man:lttng(1)
> diff --git a/include/lttng/lttng.h b/include/lttng/lttng.h
> index 2088864..09aa969 100644
> --- a/include/lttng/lttng.h
> +++ b/include/lttng/lttng.h
> @@ -160,12 +160,18 @@ extern int lttng_set_consumer_url(struct lttng_handle *handle,
>  extern int lttng_data_pending(const char *session_name);
>
>  /*
> + * Deprecated, replaced by lttng_regenerate_metadata.
> + */
> +LTTNG_DEPRECATED()
> +extern int lttng_metadata_regenerate(const char *session_name);
> +
> +/*
>   * Trigger the regeneration of the metadata for a session.
>   * The new metadata overwrite the previous one locally or remotely (through
>   * the lttng-relayd). Only kernel, per-uid and non-live sessions are supported.
>   * Return 0 on success, a negative LTTng error code on error.
>   */
> -extern int lttng_metadata_regenerate(const char *session_name);
> +extern int lttng_regenerate_metadata(const char *session_name);
>
>  #ifdef __cplusplus
>  }
> diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c
> index c74da94..bd63389 100644
> --- a/src/bin/lttng-sessiond/cmd.c
> +++ b/src/bin/lttng-sessiond/cmd.c
> @@ -3397,7 +3397,7 @@ error:
>   * Return 0 if the metadata can be generated, a LTTNG_ERR code otherwise.
>   */
>  static
> -int check_metadata_regenerate_support(struct ltt_session *session)
> +int check_regenerate_metadata_support(struct ltt_session *session)
>  {
>         int ret;
>
> @@ -3436,7 +3436,7 @@ end:
>  }
>
>  static
> -int ust_metadata_regenerate(struct ltt_ust_session *usess)
> +int ust_regenerate_metadata(struct ltt_ust_session *usess)
>  {
>         int ret = 0;
>         struct buffer_reg_uid *uid_reg = NULL;
> @@ -3497,7 +3497,7 @@ end:
>  }
>
>  /*
> - * Command LTTNG_METADATA_REGENERATE from the lttng-ctl library.
> + * Command LTTNG_REGENERATE_METADATA from the lttng-ctl library.
>   *
>   * Ask the consumer to truncate the existing metadata file(s) and
>   * then regenerate the metadata. Live and per-pid sessions are not
> @@ -3505,19 +3505,19 @@ end:
>   *
>   * Return 0 on success or else a LTTNG_ERR code.
>   */
> -int cmd_metadata_regenerate(struct ltt_session *session)
> +int cmd_regenerate_metadata(struct ltt_session *session)
>  {
>         int ret;
>
>         assert(session);
>
> -       ret = check_metadata_regenerate_support(session);
> +       ret = check_regenerate_metadata_support(session);
>         if (ret) {
>                 goto end;
>         }
>
>         if (session->kernel_session) {
> -               ret = kernctl_session_metadata_regenerate(
> +               ret = kernctl_session_regenerate_metadata(
>                                 session->kernel_session->fd);
>                 if (ret < 0) {
>                         ERR("Failed to regenerate the kernel metadata");
> @@ -3526,7 +3526,7 @@ int cmd_metadata_regenerate(struct ltt_session *session)
>         }
>
>         if (session->ust_session) {
> -               ret = ust_metadata_regenerate(session->ust_session);
> +               ret = ust_regenerate_metadata(session->ust_session);
>                 if (ret < 0) {
>                         ERR("Failed to regenerate the UST metadata");
>                         goto end;
> @@ -3539,7 +3539,6 @@ end:
>         return ret;
>  }
>
> -
>  /*
>   * Send relayd sockets from snapshot output to consumer. Ignore request if the
>   * snapshot output is *not* set with a remote destination.
> diff --git a/src/bin/lttng-sessiond/cmd.h b/src/bin/lttng-sessiond/cmd.h
> index a220e3a..320d717 100644
> --- a/src/bin/lttng-sessiond/cmd.h
> +++ b/src/bin/lttng-sessiond/cmd.h
> @@ -110,6 +110,6 @@ int cmd_snapshot_record(struct ltt_session *session,
>
>  int cmd_set_session_shm_path(struct ltt_session *session,
>                 const char *shm_path);
> -int cmd_metadata_regenerate(struct ltt_session *session);
> +int cmd_regenerate_metadata(struct ltt_session *session);
>
>  #endif /* CMD_H */
> diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
> index 497f4ee..3623e5d 100644
> --- a/src/bin/lttng-sessiond/main.c
> +++ b/src/bin/lttng-sessiond/main.c
> @@ -3003,7 +3003,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
>         case LTTNG_SNAPSHOT_RECORD:
>         case LTTNG_SAVE_SESSION:
>         case LTTNG_SET_SESSION_SHM_PATH:
> -       case LTTNG_METADATA_REGENERATE:
> +       case LTTNG_REGENERATE_METADATA:
>                 need_domain = 0;
>                 break;
>         default:
> @@ -4114,9 +4114,9 @@ error_add_context:
>                                 cmd_ctx->lsm->u.set_shm_path.shm_path);
>                 break;
>         }
> -       case LTTNG_METADATA_REGENERATE:
> +       case LTTNG_REGENERATE_METADATA:
>         {
> -               ret = cmd_metadata_regenerate(cmd_ctx->session);
> +               ret = cmd_regenerate_metadata(cmd_ctx->session);
>                 break;
>         }
>         default:
> diff --git a/src/bin/lttng/Makefile.am b/src/bin/lttng/Makefile.am
> index b911f33..acd973b 100644
> --- a/src/bin/lttng/Makefile.am
> +++ b/src/bin/lttng/Makefile.am
> @@ -18,6 +18,7 @@ lttng_SOURCES = command.h conf.c conf.h commands/start.c \
>                                 commands/track-untrack.c \
>                                 commands/status.c \
>                                 commands/metadata.c \
> +                               commands/regenerate.c \
>                                 commands/help.c \
>                                 utils.c utils.h lttng.c
>
> diff --git a/src/bin/lttng/command.h b/src/bin/lttng/command.h
> index 72cf4e0..3ac61e1 100644
> --- a/src/bin/lttng/command.h
> +++ b/src/bin/lttng/command.h
> @@ -76,6 +76,7 @@ DECL_COMMAND(load);
>  DECL_COMMAND(track);
>  DECL_COMMAND(untrack);
>  DECL_COMMAND(metadata);
> +DECL_COMMAND(regenerate);
>
>  extern int cmd_help(int argc, const char **argv,
>                 const struct cmd_struct commands[]);
> diff --git a/src/bin/lttng/commands/metadata.c b/src/bin/lttng/commands/metadata.c
> index f6a821a..08d6e58 100644
> --- a/src/bin/lttng/commands/metadata.c
> +++ b/src/bin/lttng/commands/metadata.c
> @@ -79,7 +79,7 @@ static int metadata_regenerate(int argc, const char **argv)
>                 ret = -LTTNG_ERR_INVALID;
>                 goto end;
>         }
> -       ret = lttng_metadata_regenerate(session_name);
> +       ret = lttng_regenerate_metadata(session_name);
>         if (ret == 0) {
>                 MSG("Metadata successfully regenerated for session %s", session_name);
>         }
> diff --git a/src/bin/lttng/commands/regenerate.c b/src/bin/lttng/commands/regenerate.c
> new file mode 100644
> index 0000000..c64d8fe
> --- /dev/null
> +++ b/src/bin/lttng/commands/regenerate.c
> @@ -0,0 +1,266 @@
> +/*
> + * Copyright (C) 2015 - Julien Desfossez <jdesfossez@efficios.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License, version 2 only,
> + * as published by the Free Software Foundation.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, write to the Free Software Foundation, Inc.,
> + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
> + */
> +
> +#define _LGPL_SOURCE
> +#include <assert.h>
> +#include <ctype.h>
> +#include <popt.h>
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +
> +#include <common/mi-lttng.h>
> +
> +#include "../command.h"
> +
> +static char *opt_session_name;
> +static char *session_name = NULL;
> +
> +static int regenerate_metadata(int argc, const char **argv);
> +
> +enum {
> +       OPT_HELP = 1,
> +       OPT_LIST_OPTIONS,
> +       OPT_LIST_COMMANDS,
> +};
> +
> +static struct mi_writer *writer;
> +
> +static struct poptOption long_options[] = {
> +       /* { longName, shortName, argInfo, argPtr, value, descrip, argDesc, } */
> +       { "help",               'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0, },
> +       { "session",            's', POPT_ARG_STRING, &opt_session_name, 0, 0, 0},
> +       { "list-options",       0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, 0, 0, },
> +       { "list-commands",      0, POPT_ARG_NONE, NULL, OPT_LIST_COMMANDS},
> +       { 0, 0, 0, 0, 0, 0, 0, },
> +};
> +
> +static struct cmd_struct actions[] = {
> +       { "metadata", regenerate_metadata },
> +       { NULL, NULL }  /* Array closure */
> +};
> +
> +/*
> + * Count and return the number of arguments in argv.
> + */
> +static int count_arguments(const char **argv)
> +{
> +       int i = 0;
> +
> +       assert(argv);
> +
> +       while (argv[i] != NULL) {
> +               i++;
> +       }
> +
> +       return i;
> +}
> +
> +static int regenerate_metadata(int argc, const char **argv)
> +{
> +       int ret;
> +
> +       if (argc > 1) {
> +               ret = -LTTNG_ERR_INVALID;
> +               goto end;
> +       }
> +       ret = lttng_regenerate_metadata(session_name);
> +       if (ret == 0) {
> +               MSG("Metadata successfully regenerated for session %s", session_name);
> +       }
> +
> +end:
> +       return ret;
> +}
> +
> +static int handle_command(const char **argv)
> +{
> +       struct cmd_struct *cmd;
> +       int ret = CMD_SUCCESS, i = 0, argc, command_ret = CMD_SUCCESS;
> +
> +       if (argv == NULL) {
> +               ERR("argv is null");
> +               command_ret = CMD_ERROR;
> +               goto end;
> +       }
> +
> +       argc = count_arguments(argv);
> +
> +       cmd = &actions[i];
> +       while (cmd->func != NULL) {
> +               /* Find command */
> +               if (strcmp(argv[0], cmd->name) == 0) {
> +                       if (lttng_opt_mi) {
> +                               /* Action element */
> +                               ret = mi_lttng_writer_open_element(writer,
> +                                               mi_lttng_element_command_regenerate_action);
> +                               if (ret) {
> +                                       ret = CMD_ERROR;
> +                                       goto end;
> +                               }
> +
> +                               /* Name of the action */
> +                               ret = mi_lttng_writer_write_element_string(writer,
> +                                               config_element_name, argv[0]);
> +                               if (ret) {
> +                                       ret = CMD_ERROR;
> +                                       goto end;
> +                               }
> +                       }
> +                       command_ret = cmd->func(argc, argv);
> +                       if (lttng_opt_mi) {
> +                               /* Close output and action element */
> +                               ret = mi_lttng_writer_close_element(writer);
> +                               if (ret) {
> +                                       ret = CMD_ERROR;
> +                                       goto end;
> +                               }
> +                       }
> +                       goto end;
> +               }
> +
> +               cmd = &actions[i++];
> +       }
> +
> +       ret = CMD_UNDEFINED;
> +
> +end:
> +       /* Overwrite ret if an error occurred in cmd->func() */
> +       ret = command_ret ? command_ret : ret;
> +       return ret;
> +}
> +
> +/*
> + * regenerate command handling.
> + */
> +int cmd_regenerate(int argc, const char **argv)
> +{
> +       int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
> +       static poptContext pc;
> +
> +       if (argc < 1) {
> +               SHOW_HELP();
> +               ret = CMD_ERROR;
> +               goto end;
> +       }
> +
> +       pc = poptGetContext(NULL, argc, argv, long_options, 0);
> +       poptReadDefaultConfig(pc, 0);
> +
> +       if (lttng_opt_mi) {
> +               writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
> +               if (!writer) {
> +                       ret = -LTTNG_ERR_NOMEM;
> +                       goto end;
> +               }
> +               /* Open command element */
> +               ret = mi_lttng_writer_command_open(writer,
> +                               mi_lttng_element_command_regenerate);
> +               if (ret) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +
> +               /* Open output element */
> +               ret = mi_lttng_writer_open_element(writer,
> +                               mi_lttng_element_command_output);
> +               if (ret) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +       }
> +
> +       while ((opt = poptGetNextOpt(pc)) != -1) {
> +               switch (opt) {
> +               case OPT_HELP:
> +                       SHOW_HELP();
> +                       goto end;
> +               case OPT_LIST_OPTIONS:
> +                       list_cmd_options(stdout, long_options);
> +                       goto end;
> +               case OPT_LIST_COMMANDS:
> +                       list_commands(actions, stdout);
> +                       goto end;
> +               default:
> +                       SHOW_HELP();
> +                       ret = CMD_UNDEFINED;
> +                       goto end;
> +               }
> +       }
> +
> +       if (!opt_session_name) {
> +               session_name = get_session_name();
> +               if (session_name == NULL) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +       } else {
> +               session_name = opt_session_name;
> +       }
> +
> +       command_ret = handle_command(poptGetArgs(pc));
> +       if (command_ret) {
> +               switch (-command_ret) {
> +               default:
> +                       ERR("%s", lttng_strerror(command_ret));
> +                       success = 0;
> +                       break;
> +               }
> +       }
> +
> +       if (lttng_opt_mi) {
> +               /* Close output element */
> +               ret = mi_lttng_writer_close_element(writer);
> +               if (ret) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +
> +               /* Success ? */
> +               ret = mi_lttng_writer_write_element_bool(writer,
> +                               mi_lttng_element_command_success, success);
> +               if (ret) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +
> +               /* Command element close */
> +               ret = mi_lttng_writer_command_close(writer);
> +               if (ret) {
> +                       ret = CMD_ERROR;
> +                       goto end;
> +               }
> +       }
> +
> +end:
> +       /* Mi clean-up */
> +       if (writer && mi_lttng_writer_destroy(writer)) {
> +               /* Preserve original error code */
> +               ret = ret ? ret : -LTTNG_ERR_MI_IO_FAIL;
> +       }
> +
> +       if (!opt_session_name) {
> +               free(session_name);
> +       }
> +
> +       /* Overwrite ret if an error occurred during handle_command() */
> +       ret = command_ret ? command_ret : ret;
> +
> +       poptFreeContext(pc);
> +       return ret;
> +}
> diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c
> index 987a9dd..34816be 100644
> --- a/src/bin/lttng/lttng.c
> +++ b/src/bin/lttng/lttng.c
> @@ -88,6 +88,7 @@ static struct cmd_struct commands[] =  {
>         { "help", NULL},
>         { "version", cmd_version},
>         { "view", cmd_view},
> +       { "regenerate", cmd_regenerate},
>         { NULL, NULL}   /* Array closure */
>  };
>
> diff --git a/src/common/kernel-ctl/kernel-ctl.c b/src/common/kernel-ctl/kernel-ctl.c
> index 3d12df4..e1de0e7 100644
> --- a/src/common/kernel-ctl/kernel-ctl.c
> +++ b/src/common/kernel-ctl/kernel-ctl.c
> @@ -225,7 +225,7 @@ int kernctl_list_tracker_pids(int fd)
>         return LTTNG_IOCTL_NO_CHECK(fd, LTTNG_KERNEL_SESSION_LIST_TRACKER_PIDS);
>  }
>
> -int kernctl_session_metadata_regenerate(int fd)
> +int kernctl_session_regenerate_metadata(int fd)
>  {
>         return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_METADATA_REGEN);
>  }
> diff --git a/src/common/kernel-ctl/kernel-ctl.h b/src/common/kernel-ctl/kernel-ctl.h
> index 6736937..f30e6f3 100644
> --- a/src/common/kernel-ctl/kernel-ctl.h
> +++ b/src/common/kernel-ctl/kernel-ctl.h
> @@ -65,7 +65,7 @@ int kernctl_track_pid(int fd, int pid);
>  int kernctl_untrack_pid(int fd, int pid);
>  int kernctl_list_tracker_pids(int fd);
>
> -int kernctl_session_metadata_regenerate(int fd);
> +int kernctl_session_regenerate_metadata(int fd);
>
>  /* Buffer operations */
>
> diff --git a/src/common/mi-lttng.c b/src/common/mi-lttng.c
> index 109fb41..57678c1 100644
> --- a/src/common/mi-lttng.c
> +++ b/src/common/mi-lttng.c
> @@ -58,6 +58,8 @@ const char * const mi_lttng_element_command_list = "list";
>  const char * const mi_lttng_element_command_load = "load";
>  LTTNG_HIDDEN const char * const mi_lttng_element_command_metadata = "metadata";
>  LTTNG_HIDDEN const char * const mi_lttng_element_command_metadata_action = "metadata_action";
> +LTTNG_HIDDEN const char * const mi_lttng_element_command_regenerate = "regenerate";
> +LTTNG_HIDDEN const char * const mi_lttng_element_command_regenerate_action = "regenerate_action";
>  const char * const mi_lttng_element_command_name = "name";
>  const char * const mi_lttng_element_command_output = "output";
>  const char * const mi_lttng_element_command_save = "save";
> diff --git a/src/common/mi-lttng.h b/src/common/mi-lttng.h
> index 585818d..cf5f468 100644
> --- a/src/common/mi-lttng.h
> +++ b/src/common/mi-lttng.h
> @@ -64,6 +64,8 @@ extern const char * const mi_lttng_element_command_list;
>  extern const char * const mi_lttng_element_command_load;
>  extern const char * const mi_lttng_element_command_metadata;
>  extern const char * const mi_lttng_element_command_metadata_action;
> +extern const char * const mi_lttng_element_command_regenerate;
> +extern const char * const mi_lttng_element_command_regenerate_action;
>  extern const char * const mi_lttng_element_command_name;
>  extern const char * const mi_lttng_element_command_output;
>  extern const char * const mi_lttng_element_command_save;
> diff --git a/src/common/sessiond-comm/sessiond-comm.h b/src/common/sessiond-comm/sessiond-comm.h
> index 0983865..29740c1 100644
> --- a/src/common/sessiond-comm/sessiond-comm.h
> +++ b/src/common/sessiond-comm/sessiond-comm.h
> @@ -94,7 +94,7 @@ enum lttcomm_sessiond_command {
>         LTTNG_UNTRACK_PID                   = 33,
>         LTTNG_LIST_TRACKER_PIDS             = 34,
>         LTTNG_SET_SESSION_SHM_PATH          = 40,
> -       LTTNG_METADATA_REGENERATE           = 41,
> +       LTTNG_REGENERATE_METADATA           = 41,
>  };
>
>  enum lttcomm_relayd_command {
> @@ -526,7 +526,7 @@ struct lttcomm_consumer_msg {
>                 } LTTNG_PACKED lost_packets;
>                 struct {
>                         uint64_t session_id;
> -               } LTTNG_PACKED metadata_regenerate;
> +               } LTTNG_PACKED regenerate_metadata;
>         } u;
>  } LTTNG_PACKED;
>
> diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c
> index 0ae6b0b..8c78e1c 100644
> --- a/src/lib/lttng-ctl/lttng-ctl.c
> +++ b/src/lib/lttng-ctl/lttng-ctl.c
> @@ -2384,7 +2384,7 @@ int lttng_list_tracker_pids(struct lttng_handle *handle,
>   * Regenerate the metadata for a session.
>   * Return 0 on success, a negative error code on error.
>   */
> -int lttng_metadata_regenerate(const char *session_name)
> +int lttng_regenerate_metadata(const char *session_name)
>  {
>         int ret;
>         struct lttcomm_session_msg lsm;
> @@ -2395,7 +2395,7 @@ int lttng_metadata_regenerate(const char *session_name)
>         }
>
>         memset(&lsm, 0, sizeof(lsm));
> -       lsm.cmd_type = LTTNG_METADATA_REGENERATE;
> +       lsm.cmd_type = LTTNG_REGENERATE_METADATA;
>
>         lttng_ctl_copy_string(lsm.session.name, session_name,
>                         sizeof(lsm.session.name));
> @@ -2411,6 +2411,14 @@ end:
>  }
>
>  /*
> + * Deprecated, replaced by lttng_regenerate_metadata.
> + */
> +int lttng_metadata_regenerate(const char *session_name)
> +{
> +       return lttng_regenerate_metadata(session_name);
> +}
> +
> +/*
>   * lib constructor.
>   */
>  static void __attribute__((constructor)) init(void)
> diff --git a/tests/destructive/metadata-regeneration b/tests/destructive/metadata-regeneration
> index 32469b5..d4e632a 100755
> --- a/tests/destructive/metadata-regeneration
> +++ b/tests/destructive/metadata-regeneration
> @@ -89,7 +89,7 @@ function test_kernel_local ()
>         validate_trace_date $DATE1 $TRACE_PATH
>         start_lttng_tracing_ok $SESSION_NAME
>         date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
> -       metadata_regenerate_ok $SESSION_NAME
> +       regenerate_metadata_ok $SESSION_NAME
>         stop_lttng_tracing_ok $SESSION_NAME
>         validate_trace_date $DATE2 $TRACE_PATH
>         if [ $? -eq 0 ]; then
> @@ -111,7 +111,7 @@ function test_kernel_streaming ()
>         validate_trace_date $DATE1 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
>         start_lttng_tracing_ok $SESSION_NAME
>         date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
> -       metadata_regenerate_ok $SESSION_NAME
> +       regenerate_metadata_ok $SESSION_NAME
>         stop_lttng_tracing_ok $SESSION_NAME
>         # Validate test
>         validate_trace_date $DATE2 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
> @@ -147,7 +147,7 @@ function test_ust_local ()
>
>         start_lttng_tracing_ok $SESSION_NAME
>         date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
> -       metadata_regenerate_ok $SESSION_NAME
> +       regenerate_metadata_ok $SESSION_NAME
>
>         stop_lttng_tracing_ok $SESSION_NAME
>         destroy_lttng_session_ok $SESSION_NAME
> @@ -184,7 +184,7 @@ function test_ust_streaming ()
>         start_lttng_tracing_ok $SESSION_NAME
>         date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
>
> -       metadata_regenerate_ok $SESSION_NAME
> +       regenerate_metadata_ok $SESSION_NAME
>
>         stop_lttng_tracing_ok $SESSION_NAME
>         destroy_lttng_session_ok $SESSION_NAME
> diff --git a/tests/fast_regression b/tests/fast_regression
> index 0c4f079..262c846 100644
> --- a/tests/fast_regression
> +++ b/tests/fast_regression
> @@ -16,7 +16,7 @@ regression/tools/save-load/test_load
>  regression/tools/mi/test_mi
>  regression/tools/wildcard/test_event_wildcard
>  regression/tools/crash/test_crash
> -regression/tools/metadata-regen/test_ust
> +regression/tools/regen-metadata/test_ust
>  regression/ust/before-after/test_before_after
>  regression/ust/buffers-pid/test_buffers_pid
>  regression/ust/multi-session/test_multi_session
> diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am
> index 6a2d24c..2297ea1 100644
> --- a/tests/regression/Makefile.am
> +++ b/tests/regression/Makefile.am
> @@ -22,7 +22,7 @@ TESTS = tools/filtering/test_invalid_filter \
>         tools/mi/test_mi \
>         tools/wildcard/test_event_wildcard \
>         tools/crash/test_crash \
> -       tools/metadata-regen/test_ust
> +       tools/regen-metadata/test_ust
>
>  if HAVE_LIBLTTNG_UST_CTL
>  SUBDIRS += ust
> diff --git a/tests/regression/tools/Makefile.am b/tests/regression/tools/Makefile.am
> index 6c39c9f..91820ad 100644
> --- a/tests/regression/tools/Makefile.am
> +++ b/tests/regression/tools/Makefile.am
> @@ -1,2 +1,2 @@
>  SUBDIRS = streaming filtering health tracefile-limits snapshots live exclusion save-load mi \
> -               wildcard crash metadata-regen
> +               wildcard crash regen-metadata
> diff --git a/tests/regression/tools/metadata-regen/Makefile.am b/tests/regression/tools/metadata-regen/Makefile.am
> deleted file mode 100644
> index d4a92eb..0000000
> --- a/tests/regression/tools/metadata-regen/Makefile.am
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -noinst_SCRIPTS = test_ust test_kernel
> -EXTRA_DIST = test_ust test_kernel
> -
> -all-local:
> -       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
> -               for script in $(EXTRA_DIST); do \
> -                       cp -f $(srcdir)/$$script $(builddir); \
> -               done; \
> -       fi
> -
> -clean-local:
> -       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
> -               for script in $(EXTRA_DIST); do \
> -                       rm -f $(builddir)/$$script; \
> -               done; \
> -       fi
> diff --git a/tests/regression/tools/metadata-regen/test_kernel b/tests/regression/tools/metadata-regen/test_kernel
> deleted file mode 100755
> index fb9940a..0000000
> --- a/tests/regression/tools/metadata-regen/test_kernel
> +++ /dev/null
> @@ -1,109 +0,0 @@
> -#!/bin/bash
> -#
> -# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
> -#
> -# This library is free software; you can redistribute it and/or modify it under
> -# the terms of the GNU Lesser General Public License as published by the Free
> -# Software Foundation; version 2.1 of the License.
> -#
> -# This library is distributed in the hope that it will be useful, but WITHOUT
> -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
> -# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
> -# details.
> -#
> -# You should have received a copy of the GNU Lesser General Public License
> -# along with this library; if not, write to the Free Software Foundation, Inc.,
> -# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> -TEST_DESC="Streaming - Kernel tracing"
> -
> -CURDIR=$(dirname $0)/
> -TESTDIR=$CURDIR/../../..
> -EVENT_NAME="lttng_test_filter_event"
> -PID_RELAYD=0
> -SESSION_NAME=""
> -
> -TRACE_PATH=$(mktemp -d)
> -
> -NUM_TESTS=18
> -
> -source $TESTDIR/utils/utils.sh
> -
> -# LTTng kernel modules check
> -out=`ls /lib/modules/$(uname -r)/extra | grep lttng`
> -if [ -z "$out" ]; then
> -       BAIL_OUT "LTTng modules not detected."
> -fi
> -
> -function lttng_create_session_uri
> -{
> -       # Create session with default path
> -       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
> -
> -       ok $? "Create session $SESSION_NAME"
> -}
> -
> -function test_kernel_streaming ()
> -{
> -       diag "Test kernel streaming with metadata regeneration"
> -       lttng_create_session_uri
> -       lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
> -       start_lttng_tracing_ok $SESSION_NAME
> -       echo -n "100" > /proc/lttng-test-filter-event
> -       metadata_regenerate_ok $SESSION_NAME
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       # Validate test
> -       validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       else
> -               break
> -       fi
> -       destroy_lttng_session_ok $SESSION_NAME
> -}
> -
> -function test_kernel_local ()
> -{
> -       diag "Test kernel local with metadata regeneration"
> -       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> -       lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
> -       start_lttng_tracing_ok $SESSION_NAME
> -       echo -n "100" > /proc/lttng-test-filter-event
> -       metadata_regenerate_ok $SESSION_NAME
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       validate_trace $EVENT_NAME $TRACE_PATH
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       fi
> -       destroy_lttng_session_ok $SESSION_NAME
> -}
> -
> -plan_tests $NUM_TESTS
> -
> -print_test_banner "$TEST_DESC"
> -
> -if [ "$(id -u)" == "0" ]; then
> -       isroot=1
> -else
> -       isroot=0
> -fi
> -
> -skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS ||
> -{
> -       start_lttng_relayd "-o $TRACE_PATH"
> -       start_lttng_sessiond
> -       modprobe lttng-test
> -
> -       tests=( test_kernel_streaming test_kernel_local )
> -
> -       for fct_test in ${tests[@]};
> -       do
> -               SESSION_NAME=$(randstring 16 0)
> -               ${fct_test}
> -       done
> -
> -       rmmod lttng-test
> -       stop_lttng_sessiond
> -       stop_lttng_relayd
> -}
> diff --git a/tests/regression/tools/metadata-regen/test_ust b/tests/regression/tools/metadata-regen/test_ust
> deleted file mode 100755
> index fe6ffd8..0000000
> --- a/tests/regression/tools/metadata-regen/test_ust
> +++ /dev/null
> @@ -1,208 +0,0 @@
> -#!/bin/bash
> -#
> -# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
> -#
> -# This library is free software; you can redistribute it and/or modify it under
> -# the terms of the GNU Lesser General Public License as published by the Free
> -# Software Foundation; version 2.1 of the License.
> -#
> -# This library is distributed in the hope that it will be useful, but WITHOUT
> -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
> -# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
> -# details.
> -#
> -# You should have received a copy of the GNU Lesser General Public License
> -# along with this library; if not, write to the Free Software Foundation, Inc.,
> -# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> -TEST_DESC="Streaming - User space tracing"
> -
> -CURDIR=$(dirname $0)/
> -TESTDIR=$CURDIR/../../..
> -NR_ITER=1
> -NR_USEC_WAIT=0
> -TESTAPP_PATH="$TESTDIR/utils/testapp"
> -TESTAPP_NAME="gen-ust-events"
> -TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
> -SESSION_NAME="stream"
> -EVENT_NAME="tp:tptest"
> -PID_RELAYD=0
> -
> -TRACE_PATH=$(mktemp -d)
> -
> -NUM_TESTS=33
> -
> -source $TESTDIR/utils/utils.sh
> -
> -if [ ! -x "$TESTAPP_BIN" ]; then
> -       BAIL_OUT "No UST events binary detected."
> -fi
> -
> -function lttng_create_session_uri
> -{
> -       # Create session with default path
> -       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
> -       ok $? "Create session with default path"
> -}
> -
> -function lttng_create_session_uri_live
> -{
> -       # Create session with default path
> -       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME --live -U net://localhost >/dev/null 2>&1
> -       ok $? "Create live session"
> -}
> -
> -function enable_channel_per_pid()
> -{
> -       sess_name=$1
> -       channel_name=$2
> -
> -       $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name >/dev/null 2>&1
> -       ok $? "Enable channel $channel_name per PID for session $sess_name"
> -}
> -
> -# MUST set TESTDIR before calling those functions
> -
> -function test_ust_streaming ()
> -{
> -       local file_sync_after_first=$(mktemp -u)
> -       local file_sync_before_last=$(mktemp -u)
> -
> -       diag "Test UST streaming with metadata regeneration"
> -       lttng_create_session_uri
> -       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> -
> -       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> -
> -       start_lttng_tracing_ok $SESSION_NAME
> -
> -       touch ${file_sync_before_last}
> -
> -       # Wait for the applications started in background
> -       wait
> -       metadata_regenerate_ok $SESSION_NAME
> -
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       destroy_lttng_session_ok $SESSION_NAME
> -       # Validate test
> -       validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       fi
> -       rm -f ${file_sync_after_first}
> -       rm -f ${file_sync_before_last}
> -}
> -
> -function test_ust_local ()
> -{
> -       local file_sync_after_first=$(mktemp -u)
> -       local file_sync_before_last=$(mktemp -u)
> -
> -       diag "Test UST local with metadata regeneration"
> -       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> -       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> -
> -       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> -
> -       start_lttng_tracing_ok $SESSION_NAME
> -
> -       touch ${file_sync_before_last}
> -
> -       # Wait for the applications started in background
> -       wait
> -       metadata_regenerate_ok $SESSION_NAME
> -
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       destroy_lttng_session_ok $SESSION_NAME
> -       # Validate test
> -       validate_trace $EVENT_NAME $TRACE_PATH
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       fi
> -       rm -f ${file_sync_after_first}
> -       rm -f ${file_sync_before_last}
> -}
> -
> -function test_ust_pid ()
> -{
> -       local file_sync_after_first=$(mktemp -u)
> -       local file_sync_before_last=$(mktemp -u)
> -
> -       diag "Test UST per-pid with metadata regeneration (expect failure)"
> -       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> -       enable_channel_per_pid $SESSION_NAME "channel0"
> -       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
> -
> -       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> -
> -       start_lttng_tracing_ok $SESSION_NAME
> -
> -       touch ${file_sync_before_last}
> -
> -       # Wait for the applications started in background
> -       wait
> -       metadata_regenerate_fail $SESSION_NAME
> -
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       destroy_lttng_session_ok $SESSION_NAME
> -       # Validate test
> -       validate_trace $EVENT_NAME $TRACE_PATH
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       fi
> -       rm -f ${file_sync_after_first}
> -       rm -f ${file_sync_before_last}
> -}
> -
> -function test_ust_live ()
> -{
> -       local file_sync_after_first=$(mktemp -u)
> -       local file_sync_before_last=$(mktemp -u)
> -
> -       diag "Test UST live with metadata regeneration (expect failure)"
> -       lttng_create_session_uri_live $SESSION_NAME $TRACE_PATH
> -       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> -
> -       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> -
> -       start_lttng_tracing_ok $SESSION_NAME
> -
> -       touch ${file_sync_before_last}
> -
> -       # Wait for the applications started in background
> -       wait
> -       metadata_regenerate_fail $SESSION_NAME
> -
> -       stop_lttng_tracing_ok $SESSION_NAME
> -       destroy_lttng_session_ok $SESSION_NAME
> -       # Validate test
> -       validate_trace $EVENT_NAME $TRACE_PATH
> -       if [ $? -eq 0 ]; then
> -               # Only delete if successful
> -               rm -rf $TRACE_PATH
> -       fi
> -       rm -f ${file_sync_after_first}
> -       rm -f ${file_sync_before_last}
> -}
> -
> -plan_tests $NUM_TESTS
> -
> -print_test_banner "$TEST_DESC"
> -
> -start_lttng_relayd "-o $TRACE_PATH"
> -start_lttng_sessiond
> -
> -tests=( test_ust_streaming test_ust_local test_ust_pid test_ust_live )
> -
> -for fct_test in ${tests[@]};
> -do
> -       SESSION_NAME=$(randstring 16 0)
> -       ${fct_test}
> -done
> -
> -stop_lttng_sessiond
> -stop_lttng_relayd
> -
> -exit $out
> diff --git a/tests/regression/tools/mi/test_mi b/tests/regression/tools/mi/test_mi
> index 0e8fa67..380385f 100755
> --- a/tests/regression/tools/mi/test_mi
> +++ b/tests/regression/tools/mi/test_mi
> @@ -631,9 +631,9 @@ function test_start_stop () {
>         ok $? "Mi test: enabled element : $result expected: true"
>
>         #Test metadata regenerate command
> -       metadata_regenerate_ok $session_name
> +       regenerate_metadata_ok $session_name
>         $XML_VALIDATE $OUTPUT_DEST
> -       ok $? "Mi test: metadata regenerate"
> +       ok $? "Mi test: regenerate metadata"
>
>         #Test stop command
>         stop_lttng_tracing_ok $session_name
> diff --git a/tests/regression/tools/regen-metadata/Makefile.am b/tests/regression/tools/regen-metadata/Makefile.am
> new file mode 100644
> index 0000000..d4a92eb
> --- /dev/null
> +++ b/tests/regression/tools/regen-metadata/Makefile.am
> @@ -0,0 +1,16 @@
> +noinst_SCRIPTS = test_ust test_kernel
> +EXTRA_DIST = test_ust test_kernel
> +
> +all-local:
> +       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
> +               for script in $(EXTRA_DIST); do \
> +                       cp -f $(srcdir)/$$script $(builddir); \
> +               done; \
> +       fi
> +
> +clean-local:
> +       @if [ x"$(srcdir)" != x"$(builddir)" ]; then \
> +               for script in $(EXTRA_DIST); do \
> +                       rm -f $(builddir)/$$script; \
> +               done; \
> +       fi
> diff --git a/tests/regression/tools/regen-metadata/test_kernel b/tests/regression/tools/regen-metadata/test_kernel
> new file mode 100755
> index 0000000..fd139ae
> --- /dev/null
> +++ b/tests/regression/tools/regen-metadata/test_kernel
> @@ -0,0 +1,109 @@
> +#!/bin/bash
> +#
> +# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
> +#
> +# This library is free software; you can redistribute it and/or modify it under
> +# the terms of the GNU Lesser General Public License as published by the Free
> +# Software Foundation; version 2.1 of the License.
> +#
> +# This library is distributed in the hope that it will be useful, but WITHOUT
> +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
> +# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
> +# details.
> +#
> +# You should have received a copy of the GNU Lesser General Public License
> +# along with this library; if not, write to the Free Software Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> +TEST_DESC="Streaming - Kernel tracing"
> +
> +CURDIR=$(dirname $0)/
> +TESTDIR=$CURDIR/../../..
> +EVENT_NAME="lttng_test_filter_event"
> +PID_RELAYD=0
> +SESSION_NAME=""
> +
> +TRACE_PATH=$(mktemp -d)
> +
> +NUM_TESTS=18
> +
> +source $TESTDIR/utils/utils.sh
> +
> +# LTTng kernel modules check
> +out=`ls /lib/modules/$(uname -r)/extra | grep lttng`
> +if [ -z "$out" ]; then
> +       BAIL_OUT "LTTng modules not detected."
> +fi
> +
> +function lttng_create_session_uri
> +{
> +       # Create session with default path
> +       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
> +
> +       ok $? "Create session $SESSION_NAME"
> +}
> +
> +function test_kernel_streaming ()
> +{
> +       diag "Test kernel streaming with metadata regeneration"
> +       lttng_create_session_uri
> +       lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
> +       start_lttng_tracing_ok $SESSION_NAME
> +       echo -n "100" > /proc/lttng-test-filter-event
> +       regenerate_metadata_ok $SESSION_NAME
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       # Validate test
> +       validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       else
> +               break
> +       fi
> +       destroy_lttng_session_ok $SESSION_NAME
> +}
> +
> +function test_kernel_local ()
> +{
> +       diag "Test kernel local with metadata regeneration"
> +       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> +       lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
> +       start_lttng_tracing_ok $SESSION_NAME
> +       echo -n "100" > /proc/lttng-test-filter-event
> +       regenerate_metadata_ok $SESSION_NAME
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       validate_trace $EVENT_NAME $TRACE_PATH
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       fi
> +       destroy_lttng_session_ok $SESSION_NAME
> +}
> +
> +plan_tests $NUM_TESTS
> +
> +print_test_banner "$TEST_DESC"
> +
> +if [ "$(id -u)" == "0" ]; then
> +       isroot=1
> +else
> +       isroot=0
> +fi
> +
> +skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS ||
> +{
> +       start_lttng_relayd "-o $TRACE_PATH"
> +       start_lttng_sessiond
> +       modprobe lttng-test
> +
> +       tests=( test_kernel_streaming test_kernel_local )
> +
> +       for fct_test in ${tests[@]};
> +       do
> +               SESSION_NAME=$(randstring 16 0)
> +               ${fct_test}
> +       done
> +
> +       rmmod lttng-test
> +       stop_lttng_sessiond
> +       stop_lttng_relayd
> +}
> diff --git a/tests/regression/tools/regen-metadata/test_ust b/tests/regression/tools/regen-metadata/test_ust
> new file mode 100755
> index 0000000..b7f1af1
> --- /dev/null
> +++ b/tests/regression/tools/regen-metadata/test_ust
> @@ -0,0 +1,208 @@
> +#!/bin/bash
> +#
> +# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
> +#
> +# This library is free software; you can redistribute it and/or modify it under
> +# the terms of the GNU Lesser General Public License as published by the Free
> +# Software Foundation; version 2.1 of the License.
> +#
> +# This library is distributed in the hope that it will be useful, but WITHOUT
> +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
> +# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
> +# details.
> +#
> +# You should have received a copy of the GNU Lesser General Public License
> +# along with this library; if not, write to the Free Software Foundation, Inc.,
> +# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
> +TEST_DESC="Streaming - User space tracing"
> +
> +CURDIR=$(dirname $0)/
> +TESTDIR=$CURDIR/../../..
> +NR_ITER=1
> +NR_USEC_WAIT=0
> +TESTAPP_PATH="$TESTDIR/utils/testapp"
> +TESTAPP_NAME="gen-ust-events"
> +TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
> +SESSION_NAME="stream"
> +EVENT_NAME="tp:tptest"
> +PID_RELAYD=0
> +
> +TRACE_PATH=$(mktemp -d)
> +
> +NUM_TESTS=33
> +
> +source $TESTDIR/utils/utils.sh
> +
> +if [ ! -x "$TESTAPP_BIN" ]; then
> +       BAIL_OUT "No UST events binary detected."
> +fi
> +
> +function lttng_create_session_uri
> +{
> +       # Create session with default path
> +       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
> +       ok $? "Create session with default path"
> +}
> +
> +function lttng_create_session_uri_live
> +{
> +       # Create session with default path
> +       $TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME --live -U net://localhost >/dev/null 2>&1
> +       ok $? "Create live session"
> +}
> +
> +function enable_channel_per_pid()
> +{
> +       sess_name=$1
> +       channel_name=$2
> +
> +       $TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name >/dev/null 2>&1
> +       ok $? "Enable channel $channel_name per PID for session $sess_name"
> +}
> +
> +# MUST set TESTDIR before calling those functions
> +
> +function test_ust_streaming ()
> +{
> +       local file_sync_after_first=$(mktemp -u)
> +       local file_sync_before_last=$(mktemp -u)
> +
> +       diag "Test UST streaming with metadata regeneration"
> +       lttng_create_session_uri
> +       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> +
> +       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> +
> +       start_lttng_tracing_ok $SESSION_NAME
> +
> +       touch ${file_sync_before_last}
> +
> +       # Wait for the applications started in background
> +       wait
> +       regenerate_metadata_ok $SESSION_NAME
> +
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       destroy_lttng_session_ok $SESSION_NAME
> +       # Validate test
> +       validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       fi
> +       rm -f ${file_sync_after_first}
> +       rm -f ${file_sync_before_last}
> +}
> +
> +function test_ust_local ()
> +{
> +       local file_sync_after_first=$(mktemp -u)
> +       local file_sync_before_last=$(mktemp -u)
> +
> +       diag "Test UST local with metadata regeneration"
> +       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> +       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> +
> +       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> +
> +       start_lttng_tracing_ok $SESSION_NAME
> +
> +       touch ${file_sync_before_last}
> +
> +       # Wait for the applications started in background
> +       wait
> +       regenerate_metadata_ok $SESSION_NAME
> +
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       destroy_lttng_session_ok $SESSION_NAME
> +       # Validate test
> +       validate_trace $EVENT_NAME $TRACE_PATH
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       fi
> +       rm -f ${file_sync_after_first}
> +       rm -f ${file_sync_before_last}
> +}
> +
> +function test_ust_pid ()
> +{
> +       local file_sync_after_first=$(mktemp -u)
> +       local file_sync_before_last=$(mktemp -u)
> +
> +       diag "Test UST per-pid with metadata regeneration (expect failure)"
> +       create_lttng_session_ok $SESSION_NAME $TRACE_PATH
> +       enable_channel_per_pid $SESSION_NAME "channel0"
> +       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
> +
> +       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> +
> +       start_lttng_tracing_ok $SESSION_NAME
> +
> +       touch ${file_sync_before_last}
> +
> +       # Wait for the applications started in background
> +       wait
> +       regenerate_metadata_fail $SESSION_NAME
> +
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       destroy_lttng_session_ok $SESSION_NAME
> +       # Validate test
> +       validate_trace $EVENT_NAME $TRACE_PATH
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       fi
> +       rm -f ${file_sync_after_first}
> +       rm -f ${file_sync_before_last}
> +}
> +
> +function test_ust_live ()
> +{
> +       local file_sync_after_first=$(mktemp -u)
> +       local file_sync_before_last=$(mktemp -u)
> +
> +       diag "Test UST live with metadata regeneration (expect failure)"
> +       lttng_create_session_uri_live $SESSION_NAME $TRACE_PATH
> +       enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
> +
> +       $TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
> +
> +       start_lttng_tracing_ok $SESSION_NAME
> +
> +       touch ${file_sync_before_last}
> +
> +       # Wait for the applications started in background
> +       wait
> +       regenerate_metadata_fail $SESSION_NAME
> +
> +       stop_lttng_tracing_ok $SESSION_NAME
> +       destroy_lttng_session_ok $SESSION_NAME
> +       # Validate test
> +       validate_trace $EVENT_NAME $TRACE_PATH
> +       if [ $? -eq 0 ]; then
> +               # Only delete if successful
> +               rm -rf $TRACE_PATH
> +       fi
> +       rm -f ${file_sync_after_first}
> +       rm -f ${file_sync_before_last}
> +}
> +
> +plan_tests $NUM_TESTS
> +
> +print_test_banner "$TEST_DESC"
> +
> +start_lttng_relayd "-o $TRACE_PATH"
> +start_lttng_sessiond
> +
> +tests=( test_ust_streaming test_ust_local test_ust_pid test_ust_live )
> +
> +for fct_test in ${tests[@]};
> +do
> +       SESSION_NAME=$(randstring 16 0)
> +       ${fct_test}
> +done
> +
> +stop_lttng_sessiond
> +stop_lttng_relayd
> +
> +exit $out
> diff --git a/tests/root_regression b/tests/root_regression
> index 2981dc6..d0fad04 100644
> --- a/tests/root_regression
> +++ b/tests/root_regression
> @@ -14,5 +14,5 @@ regression/tools/filtering/test_invalid_filter
>  regression/tools/filtering/test_unsupported_op
>  regression/tools/filtering/test_valid_filter
>  regression/tools/wildcard/test_event_wildcard
> -regression/tools/metadata-regen/test_kernel
> +regression/tools/regen-metadata/test_kernel
>  regression/ust/test_event_perf
> diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh
> index da2efe9..3d744e2 100644
> --- a/tests/utils/utils.sh
> +++ b/tests/utils/utils.sh
> @@ -1366,29 +1366,29 @@ function validate_trace_empty()
>         return $ret
>  }
>
> -function metadata_regenerate ()
> +function regenerate_metadata ()
>  {
>         local expected_to_fail=$1
>         local sess_name=$2
>
> -       $TESTDIR/../src/bin/lttng/$LTTNG_BIN metadata regenerate -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST
> +       $TESTDIR/../src/bin/lttng/$LTTNG_BIN regenerate metadata -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST
>         ret=$?
>         if [[ $expected_to_fail -eq "1" ]]; then
>                 test "$ret" -ne "0"
> -               ok $? "Expected fail on regenerate $sess_name"
> +               ok $? "Expected fail on regenerate metadata $sess_name"
>         else
>                 ok $ret "Metadata regenerate $sess_name"
>         fi
>  }
>
> -function metadata_regenerate_ok ()
> +function regenerate_metadata_ok ()
>  {
> -       metadata_regenerate 0 "$@"
> +       regenerate_metadata 0 "$@"
>  }
>
> -function metadata_regenerate_fail ()
> +function regenerate_metadata_fail ()
>  {
> -       metadata_regenerate 1 "$@"
> +       regenerate_metadata 1 "$@"
>  }
>
>  function destructive_tests_enabled ()
> --
> 1.9.1
>
>
>
>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com
_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH lttng-tools v3 1/6] Rename the "metadata regenerate" command to "regenerate metadata"
@ 2016-07-05 14:54 Julien Desfossez
  0 siblings, 0 replies; 7+ messages in thread
From: Julien Desfossez @ 2016-07-05 14:54 UTC (permalink / raw)
  To: jgalar, mathieu.desnoyers, philippe.proulx; +Cc: lttng-dev, Julien Desfossez

Prepare the deprecation of the "metadata regenerate" command since we
need to regenerate the statedump as well, so it is more convenient to
have one command to regenerate various session's attributes.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
---
 configure.ac                                      |   2 +-
 doc/man/Makefile.am                               |   3 +-
 doc/man/lttng-metadata.1.txt                      |  17 +-
 doc/man/lttng-regenerate.1.txt                    |  63 +++++
 include/lttng/lttng.h                             |   8 +-
 src/bin/lttng-sessiond/cmd.c                      |  15 +-
 src/bin/lttng-sessiond/cmd.h                      |   2 +-
 src/bin/lttng-sessiond/main.c                     |   6 +-
 src/bin/lttng/Makefile.am                         |   1 +
 src/bin/lttng/command.h                           |   1 +
 src/bin/lttng/commands/metadata.c                 |   2 +-
 src/bin/lttng/commands/regenerate.c               | 266 ++++++++++++++++++++++
 src/bin/lttng/lttng.c                             |   1 +
 src/common/kernel-ctl/kernel-ctl.c                |   2 +-
 src/common/kernel-ctl/kernel-ctl.h                |   2 +-
 src/common/mi-lttng.c                             |   2 +
 src/common/mi-lttng.h                             |   2 +
 src/common/sessiond-comm/sessiond-comm.h          |   4 +-
 src/lib/lttng-ctl/lttng-ctl.c                     |  12 +-
 tests/destructive/metadata-regeneration           |   8 +-
 tests/fast_regression                             |   2 +-
 tests/regression/Makefile.am                      |   2 +-
 tests/regression/tools/Makefile.am                |   2 +-
 tests/regression/tools/metadata-regen/Makefile.am |  16 --
 tests/regression/tools/metadata-regen/test_kernel | 109 ---------
 tests/regression/tools/metadata-regen/test_ust    | 208 -----------------
 tests/regression/tools/mi/test_mi                 |   4 +-
 tests/regression/tools/regen-metadata/Makefile.am |  16 ++
 tests/regression/tools/regen-metadata/test_kernel | 109 +++++++++
 tests/regression/tools/regen-metadata/test_ust    | 208 +++++++++++++++++
 tests/root_regression                             |   2 +-
 tests/utils/utils.sh                              |  14 +-
 32 files changed, 724 insertions(+), 387 deletions(-)
 create mode 100644 doc/man/lttng-regenerate.1.txt
 create mode 100644 src/bin/lttng/commands/regenerate.c
 delete mode 100644 tests/regression/tools/metadata-regen/Makefile.am
 delete mode 100755 tests/regression/tools/metadata-regen/test_kernel
 delete mode 100755 tests/regression/tools/metadata-regen/test_ust
 create mode 100644 tests/regression/tools/regen-metadata/Makefile.am
 create mode 100755 tests/regression/tools/regen-metadata/test_kernel
 create mode 100755 tests/regression/tools/regen-metadata/test_ust

diff --git a/configure.ac b/configure.ac
index fb2b013..89a7858 100644
--- a/configure.ac
+++ b/configure.ac
@@ -980,7 +980,7 @@ AC_CONFIG_FILES([
 	tests/regression/tools/mi/Makefile
 	tests/regression/tools/wildcard/Makefile
 	tests/regression/tools/crash/Makefile
-	tests/regression/tools/metadata-regen/Makefile
+	tests/regression/tools/regen-metadata/Makefile
 	tests/regression/ust/Makefile
 	tests/regression/ust/nprocesses/Makefile
 	tests/regression/ust/high-throughput/Makefile
diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am
index 1090f1a..f75db6e 100644
--- a/doc/man/Makefile.am
+++ b/doc/man/Makefile.am
@@ -30,7 +30,8 @@ MAN1_NAMES = \
 	lttng-enable-event \
 	lttng-disable-event \
 	lttng-crash \
-	lttng-metadata
+	lttng-metadata \
+	lttng-regenerate
 MAN3_NAMES =
 MAN8_NAMES = lttng-sessiond lttng-relayd
 MAN1_NO_ASCIIDOC_NAMES =
diff --git a/doc/man/lttng-metadata.1.txt b/doc/man/lttng-metadata.1.txt
index 0fa240e..5348916 100644
--- a/doc/man/lttng-metadata.1.txt
+++ b/doc/man/lttng-metadata.1.txt
@@ -15,21 +15,8 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-The `lttng metadata` command manages a tracing session's metadata
-generation options.
-
-As of this version, only the `regenerate` command's action is available.
-Regenerating a tracing session's metadata can be used to
-resample the offset between the system's monotonic clock and
-the wall-clock time.
-
-This command is meant to be used to resample the wall-clock time
-following a major
-link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP]
-correction. As such, a system booting with an incorrect wall time can be
-traced before its wall time is NTP-corrected. Regenerating the tracing
-session's metadata ensures that trace viewers can accurately determine
-the events time relative to Unix Epoch.
+WARNING: This command is **deprecated**; it has been replaced by the *lttng
+regenerate metadata* command (see man:lttng-regenerate(1)).
 
 
 include::common-cmd-options-head.txt[]
diff --git a/doc/man/lttng-regenerate.1.txt b/doc/man/lttng-regenerate.1.txt
new file mode 100644
index 0000000..dbbfa4d
--- /dev/null
+++ b/doc/man/lttng-regenerate.1.txt
@@ -0,0 +1,63 @@
+lttng-regenerate(1)
+=================
+
+
+NAME
+----
+lttng-regenerate - Manage an LTTng tracing session's data regeneration
+
+
+SYNOPSIS
+--------
+Regenerate the metadata of a session
+
+[verse]
+*lttng* ['linkgenoptions:(GENERAL OPTIONS)'] *regenerate metadata* [option:--session='SESSION']
+
+DESCRIPTION
+-----------
+The `lttng regenerate` command manages a tracing session's data regeneration
+options.
+
+As of this version, only the `metadata` command's action is available.
+Regenerating a tracing session's metadata can be used to
+resample the offset between the system's monotonic clock and
+the wall-clock time.
+
+This command is meant to be used to resample the wall-clock time
+following a major
+link:https://en.wikipedia.org/wiki/Network_Time_Protocol[NTP]
+correction. As such, a system booting with an incorrect wall time can be
+traced before its wall time is NTP-corrected. Regenerating the tracing
+session's metadata ensures that trace viewers can accurately determine
+the events time relative to Unix Epoch.
+
+
+include::common-cmd-options-head.txt[]
+
+
+option:-s, option:--session='SESSION'::
+    Manage the metadata generation of the tracing session named 'SESSION'
+    instead of the current tracing session.
+
+
+include::common-cmd-help-options.txt[]
+
+
+LIMITATIONS
+-----------
+The `lttng regenerate metadata` command can only be used on kernel and
+user space tracing sessions (using per-user buffering), in non-live
+mode.
+
+See man:lttng-enable-channel(1) for more information about
+buffering schemes and man:lttng-create(1) for more information
+about the different tracing session modes.
+
+
+include::common-cmd-footer.txt[]
+
+
+SEE ALSO
+--------
+man:lttng(1)
diff --git a/include/lttng/lttng.h b/include/lttng/lttng.h
index 2088864..09aa969 100644
--- a/include/lttng/lttng.h
+++ b/include/lttng/lttng.h
@@ -160,12 +160,18 @@ extern int lttng_set_consumer_url(struct lttng_handle *handle,
 extern int lttng_data_pending(const char *session_name);
 
 /*
+ * Deprecated, replaced by lttng_regenerate_metadata.
+ */
+LTTNG_DEPRECATED()
+extern int lttng_metadata_regenerate(const char *session_name);
+
+/*
  * Trigger the regeneration of the metadata for a session.
  * The new metadata overwrite the previous one locally or remotely (through
  * the lttng-relayd). Only kernel, per-uid and non-live sessions are supported.
  * Return 0 on success, a negative LTTng error code on error.
  */
-extern int lttng_metadata_regenerate(const char *session_name);
+extern int lttng_regenerate_metadata(const char *session_name);
 
 #ifdef __cplusplus
 }
diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c
index c74da94..bd63389 100644
--- a/src/bin/lttng-sessiond/cmd.c
+++ b/src/bin/lttng-sessiond/cmd.c
@@ -3397,7 +3397,7 @@ error:
  * Return 0 if the metadata can be generated, a LTTNG_ERR code otherwise.
  */
 static
-int check_metadata_regenerate_support(struct ltt_session *session)
+int check_regenerate_metadata_support(struct ltt_session *session)
 {
 	int ret;
 
@@ -3436,7 +3436,7 @@ end:
 }
 
 static
-int ust_metadata_regenerate(struct ltt_ust_session *usess)
+int ust_regenerate_metadata(struct ltt_ust_session *usess)
 {
 	int ret = 0;
 	struct buffer_reg_uid *uid_reg = NULL;
@@ -3497,7 +3497,7 @@ end:
 }
 
 /*
- * Command LTTNG_METADATA_REGENERATE from the lttng-ctl library.
+ * Command LTTNG_REGENERATE_METADATA from the lttng-ctl library.
  *
  * Ask the consumer to truncate the existing metadata file(s) and
  * then regenerate the metadata. Live and per-pid sessions are not
@@ -3505,19 +3505,19 @@ end:
  *
  * Return 0 on success or else a LTTNG_ERR code.
  */
-int cmd_metadata_regenerate(struct ltt_session *session)
+int cmd_regenerate_metadata(struct ltt_session *session)
 {
 	int ret;
 
 	assert(session);
 
-	ret = check_metadata_regenerate_support(session);
+	ret = check_regenerate_metadata_support(session);
 	if (ret) {
 		goto end;
 	}
 
 	if (session->kernel_session) {
-		ret = kernctl_session_metadata_regenerate(
+		ret = kernctl_session_regenerate_metadata(
 				session->kernel_session->fd);
 		if (ret < 0) {
 			ERR("Failed to regenerate the kernel metadata");
@@ -3526,7 +3526,7 @@ int cmd_metadata_regenerate(struct ltt_session *session)
 	}
 
 	if (session->ust_session) {
-		ret = ust_metadata_regenerate(session->ust_session);
+		ret = ust_regenerate_metadata(session->ust_session);
 		if (ret < 0) {
 			ERR("Failed to regenerate the UST metadata");
 			goto end;
@@ -3539,7 +3539,6 @@ end:
 	return ret;
 }
 
-
 /*
  * Send relayd sockets from snapshot output to consumer. Ignore request if the
  * snapshot output is *not* set with a remote destination.
diff --git a/src/bin/lttng-sessiond/cmd.h b/src/bin/lttng-sessiond/cmd.h
index a220e3a..320d717 100644
--- a/src/bin/lttng-sessiond/cmd.h
+++ b/src/bin/lttng-sessiond/cmd.h
@@ -110,6 +110,6 @@ int cmd_snapshot_record(struct ltt_session *session,
 
 int cmd_set_session_shm_path(struct ltt_session *session,
 		const char *shm_path);
-int cmd_metadata_regenerate(struct ltt_session *session);
+int cmd_regenerate_metadata(struct ltt_session *session);
 
 #endif /* CMD_H */
diff --git a/src/bin/lttng-sessiond/main.c b/src/bin/lttng-sessiond/main.c
index 497f4ee..3623e5d 100644
--- a/src/bin/lttng-sessiond/main.c
+++ b/src/bin/lttng-sessiond/main.c
@@ -3003,7 +3003,7 @@ static int process_client_msg(struct command_ctx *cmd_ctx, int sock,
 	case LTTNG_SNAPSHOT_RECORD:
 	case LTTNG_SAVE_SESSION:
 	case LTTNG_SET_SESSION_SHM_PATH:
-	case LTTNG_METADATA_REGENERATE:
+	case LTTNG_REGENERATE_METADATA:
 		need_domain = 0;
 		break;
 	default:
@@ -4114,9 +4114,9 @@ error_add_context:
 				cmd_ctx->lsm->u.set_shm_path.shm_path);
 		break;
 	}
-	case LTTNG_METADATA_REGENERATE:
+	case LTTNG_REGENERATE_METADATA:
 	{
-		ret = cmd_metadata_regenerate(cmd_ctx->session);
+		ret = cmd_regenerate_metadata(cmd_ctx->session);
 		break;
 	}
 	default:
diff --git a/src/bin/lttng/Makefile.am b/src/bin/lttng/Makefile.am
index b911f33..acd973b 100644
--- a/src/bin/lttng/Makefile.am
+++ b/src/bin/lttng/Makefile.am
@@ -18,6 +18,7 @@ lttng_SOURCES = command.h conf.c conf.h commands/start.c \
 				commands/track-untrack.c \
 				commands/status.c \
 				commands/metadata.c \
+				commands/regenerate.c \
 				commands/help.c \
 				utils.c utils.h lttng.c
 
diff --git a/src/bin/lttng/command.h b/src/bin/lttng/command.h
index 72cf4e0..3ac61e1 100644
--- a/src/bin/lttng/command.h
+++ b/src/bin/lttng/command.h
@@ -76,6 +76,7 @@ DECL_COMMAND(load);
 DECL_COMMAND(track);
 DECL_COMMAND(untrack);
 DECL_COMMAND(metadata);
+DECL_COMMAND(regenerate);
 
 extern int cmd_help(int argc, const char **argv,
 		const struct cmd_struct commands[]);
diff --git a/src/bin/lttng/commands/metadata.c b/src/bin/lttng/commands/metadata.c
index f6a821a..08d6e58 100644
--- a/src/bin/lttng/commands/metadata.c
+++ b/src/bin/lttng/commands/metadata.c
@@ -79,7 +79,7 @@ static int metadata_regenerate(int argc, const char **argv)
 		ret = -LTTNG_ERR_INVALID;
 		goto end;
 	}
-	ret = lttng_metadata_regenerate(session_name);
+	ret = lttng_regenerate_metadata(session_name);
 	if (ret == 0) {
 		MSG("Metadata successfully regenerated for session %s", session_name);
 	}
diff --git a/src/bin/lttng/commands/regenerate.c b/src/bin/lttng/commands/regenerate.c
new file mode 100644
index 0000000..c64d8fe
--- /dev/null
+++ b/src/bin/lttng/commands/regenerate.c
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2015 - Julien Desfossez <jdesfossez@efficios.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License, version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#define _LGPL_SOURCE
+#include <assert.h>
+#include <ctype.h>
+#include <popt.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <common/mi-lttng.h>
+
+#include "../command.h"
+
+static char *opt_session_name;
+static char *session_name = NULL;
+
+static int regenerate_metadata(int argc, const char **argv);
+
+enum {
+	OPT_HELP = 1,
+	OPT_LIST_OPTIONS,
+	OPT_LIST_COMMANDS,
+};
+
+static struct mi_writer *writer;
+
+static struct poptOption long_options[] = {
+	/* { longName, shortName, argInfo, argPtr, value, descrip, argDesc, } */
+	{ "help",		'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0, },
+	{ "session",		's', POPT_ARG_STRING, &opt_session_name, 0, 0, 0},
+	{ "list-options",	0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, 0, 0, },
+	{ "list-commands",  	0, POPT_ARG_NONE, NULL, OPT_LIST_COMMANDS},
+	{ 0, 0, 0, 0, 0, 0, 0, },
+};
+
+static struct cmd_struct actions[] = {
+	{ "metadata", regenerate_metadata },
+	{ NULL, NULL }	/* Array closure */
+};
+
+/*
+ * Count and return the number of arguments in argv.
+ */
+static int count_arguments(const char **argv)
+{
+	int i = 0;
+
+	assert(argv);
+
+	while (argv[i] != NULL) {
+		i++;
+	}
+
+	return i;
+}
+
+static int regenerate_metadata(int argc, const char **argv)
+{
+	int ret;
+
+	if (argc > 1) {
+		ret = -LTTNG_ERR_INVALID;
+		goto end;
+	}
+	ret = lttng_regenerate_metadata(session_name);
+	if (ret == 0) {
+		MSG("Metadata successfully regenerated for session %s", session_name);
+	}
+
+end:
+	return ret;
+}
+
+static int handle_command(const char **argv)
+{
+	struct cmd_struct *cmd;
+	int ret = CMD_SUCCESS, i = 0, argc, command_ret = CMD_SUCCESS;
+
+	if (argv == NULL) {
+		ERR("argv is null");
+		command_ret = CMD_ERROR;
+		goto end;
+	}
+
+	argc = count_arguments(argv);
+
+	cmd = &actions[i];
+	while (cmd->func != NULL) {
+		/* Find command */
+		if (strcmp(argv[0], cmd->name) == 0) {
+			if (lttng_opt_mi) {
+				/* Action element */
+				ret = mi_lttng_writer_open_element(writer,
+						mi_lttng_element_command_regenerate_action);
+				if (ret) {
+					ret = CMD_ERROR;
+					goto end;
+				}
+
+				/* Name of the action */
+				ret = mi_lttng_writer_write_element_string(writer,
+						config_element_name, argv[0]);
+				if (ret) {
+					ret = CMD_ERROR;
+					goto end;
+				}
+			}
+			command_ret = cmd->func(argc, argv);
+			if (lttng_opt_mi) {
+				/* Close output and action element */
+				ret = mi_lttng_writer_close_element(writer);
+				if (ret) {
+					ret = CMD_ERROR;
+					goto end;
+				}
+			}
+			goto end;
+		}
+
+		cmd = &actions[i++];
+	}
+
+	ret = CMD_UNDEFINED;
+
+end:
+	/* Overwrite ret if an error occurred in cmd->func() */
+	ret = command_ret ? command_ret : ret;
+	return ret;
+}
+
+/*
+ * regenerate command handling.
+ */
+int cmd_regenerate(int argc, const char **argv)
+{
+	int opt, ret = CMD_SUCCESS, command_ret = CMD_SUCCESS, success = 1;
+	static poptContext pc;
+
+	if (argc < 1) {
+		SHOW_HELP();
+		ret = CMD_ERROR;
+		goto end;
+	}
+
+	pc = poptGetContext(NULL, argc, argv, long_options, 0);
+	poptReadDefaultConfig(pc, 0);
+
+	if (lttng_opt_mi) {
+		writer = mi_lttng_writer_create(fileno(stdout), lttng_opt_mi);
+		if (!writer) {
+			ret = -LTTNG_ERR_NOMEM;
+			goto end;
+		}
+		/* Open command element */
+		ret = mi_lttng_writer_command_open(writer,
+				mi_lttng_element_command_regenerate);
+		if (ret) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+
+		/* Open output element */
+		ret = mi_lttng_writer_open_element(writer,
+				mi_lttng_element_command_output);
+		if (ret) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+	}
+
+	while ((opt = poptGetNextOpt(pc)) != -1) {
+		switch (opt) {
+		case OPT_HELP:
+			SHOW_HELP();
+			goto end;
+		case OPT_LIST_OPTIONS:
+			list_cmd_options(stdout, long_options);
+			goto end;
+		case OPT_LIST_COMMANDS:
+			list_commands(actions, stdout);
+			goto end;
+		default:
+			SHOW_HELP();
+			ret = CMD_UNDEFINED;
+			goto end;
+		}
+	}
+
+	if (!opt_session_name) {
+		session_name = get_session_name();
+		if (session_name == NULL) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+	} else {
+		session_name = opt_session_name;
+	}
+
+	command_ret = handle_command(poptGetArgs(pc));
+	if (command_ret) {
+		switch (-command_ret) {
+		default:
+			ERR("%s", lttng_strerror(command_ret));
+			success = 0;
+			break;
+		}
+	}
+
+	if (lttng_opt_mi) {
+		/* Close output element */
+		ret = mi_lttng_writer_close_element(writer);
+		if (ret) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+
+		/* Success ? */
+		ret = mi_lttng_writer_write_element_bool(writer,
+				mi_lttng_element_command_success, success);
+		if (ret) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+
+		/* Command element close */
+		ret = mi_lttng_writer_command_close(writer);
+		if (ret) {
+			ret = CMD_ERROR;
+			goto end;
+		}
+	}
+
+end:
+	/* Mi clean-up */
+	if (writer && mi_lttng_writer_destroy(writer)) {
+		/* Preserve original error code */
+		ret = ret ? ret : -LTTNG_ERR_MI_IO_FAIL;
+	}
+
+	if (!opt_session_name) {
+		free(session_name);
+	}
+
+	/* Overwrite ret if an error occurred during handle_command() */
+	ret = command_ret ? command_ret : ret;
+
+	poptFreeContext(pc);
+	return ret;
+}
diff --git a/src/bin/lttng/lttng.c b/src/bin/lttng/lttng.c
index 987a9dd..34816be 100644
--- a/src/bin/lttng/lttng.c
+++ b/src/bin/lttng/lttng.c
@@ -88,6 +88,7 @@ static struct cmd_struct commands[] =  {
 	{ "help", NULL},
 	{ "version", cmd_version},
 	{ "view", cmd_view},
+	{ "regenerate", cmd_regenerate},
 	{ NULL, NULL}	/* Array closure */
 };
 
diff --git a/src/common/kernel-ctl/kernel-ctl.c b/src/common/kernel-ctl/kernel-ctl.c
index 3d12df4..e1de0e7 100644
--- a/src/common/kernel-ctl/kernel-ctl.c
+++ b/src/common/kernel-ctl/kernel-ctl.c
@@ -225,7 +225,7 @@ int kernctl_list_tracker_pids(int fd)
 	return LTTNG_IOCTL_NO_CHECK(fd, LTTNG_KERNEL_SESSION_LIST_TRACKER_PIDS);
 }
 
-int kernctl_session_metadata_regenerate(int fd)
+int kernctl_session_regenerate_metadata(int fd)
 {
 	return LTTNG_IOCTL_CHECK(fd, LTTNG_KERNEL_SESSION_METADATA_REGEN);
 }
diff --git a/src/common/kernel-ctl/kernel-ctl.h b/src/common/kernel-ctl/kernel-ctl.h
index 6736937..f30e6f3 100644
--- a/src/common/kernel-ctl/kernel-ctl.h
+++ b/src/common/kernel-ctl/kernel-ctl.h
@@ -65,7 +65,7 @@ int kernctl_track_pid(int fd, int pid);
 int kernctl_untrack_pid(int fd, int pid);
 int kernctl_list_tracker_pids(int fd);
 
-int kernctl_session_metadata_regenerate(int fd);
+int kernctl_session_regenerate_metadata(int fd);
 
 /* Buffer operations */
 
diff --git a/src/common/mi-lttng.c b/src/common/mi-lttng.c
index 109fb41..57678c1 100644
--- a/src/common/mi-lttng.c
+++ b/src/common/mi-lttng.c
@@ -58,6 +58,8 @@ const char * const mi_lttng_element_command_list = "list";
 const char * const mi_lttng_element_command_load = "load";
 LTTNG_HIDDEN const char * const mi_lttng_element_command_metadata = "metadata";
 LTTNG_HIDDEN const char * const mi_lttng_element_command_metadata_action = "metadata_action";
+LTTNG_HIDDEN const char * const mi_lttng_element_command_regenerate = "regenerate";
+LTTNG_HIDDEN const char * const mi_lttng_element_command_regenerate_action = "regenerate_action";
 const char * const mi_lttng_element_command_name = "name";
 const char * const mi_lttng_element_command_output = "output";
 const char * const mi_lttng_element_command_save = "save";
diff --git a/src/common/mi-lttng.h b/src/common/mi-lttng.h
index 585818d..cf5f468 100644
--- a/src/common/mi-lttng.h
+++ b/src/common/mi-lttng.h
@@ -64,6 +64,8 @@ extern const char * const mi_lttng_element_command_list;
 extern const char * const mi_lttng_element_command_load;
 extern const char * const mi_lttng_element_command_metadata;
 extern const char * const mi_lttng_element_command_metadata_action;
+extern const char * const mi_lttng_element_command_regenerate;
+extern const char * const mi_lttng_element_command_regenerate_action;
 extern const char * const mi_lttng_element_command_name;
 extern const char * const mi_lttng_element_command_output;
 extern const char * const mi_lttng_element_command_save;
diff --git a/src/common/sessiond-comm/sessiond-comm.h b/src/common/sessiond-comm/sessiond-comm.h
index 0983865..29740c1 100644
--- a/src/common/sessiond-comm/sessiond-comm.h
+++ b/src/common/sessiond-comm/sessiond-comm.h
@@ -94,7 +94,7 @@ enum lttcomm_sessiond_command {
 	LTTNG_UNTRACK_PID                   = 33,
 	LTTNG_LIST_TRACKER_PIDS             = 34,
 	LTTNG_SET_SESSION_SHM_PATH          = 40,
-	LTTNG_METADATA_REGENERATE           = 41,
+	LTTNG_REGENERATE_METADATA           = 41,
 };
 
 enum lttcomm_relayd_command {
@@ -526,7 +526,7 @@ struct lttcomm_consumer_msg {
 		} LTTNG_PACKED lost_packets;
 		struct {
 			uint64_t session_id;
-		} LTTNG_PACKED metadata_regenerate;
+		} LTTNG_PACKED regenerate_metadata;
 	} u;
 } LTTNG_PACKED;
 
diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c
index 0ae6b0b..8c78e1c 100644
--- a/src/lib/lttng-ctl/lttng-ctl.c
+++ b/src/lib/lttng-ctl/lttng-ctl.c
@@ -2384,7 +2384,7 @@ int lttng_list_tracker_pids(struct lttng_handle *handle,
  * Regenerate the metadata for a session.
  * Return 0 on success, a negative error code on error.
  */
-int lttng_metadata_regenerate(const char *session_name)
+int lttng_regenerate_metadata(const char *session_name)
 {
 	int ret;
 	struct lttcomm_session_msg lsm;
@@ -2395,7 +2395,7 @@ int lttng_metadata_regenerate(const char *session_name)
 	}
 
 	memset(&lsm, 0, sizeof(lsm));
-	lsm.cmd_type = LTTNG_METADATA_REGENERATE;
+	lsm.cmd_type = LTTNG_REGENERATE_METADATA;
 
 	lttng_ctl_copy_string(lsm.session.name, session_name,
 			sizeof(lsm.session.name));
@@ -2411,6 +2411,14 @@ end:
 }
 
 /*
+ * Deprecated, replaced by lttng_regenerate_metadata.
+ */
+int lttng_metadata_regenerate(const char *session_name)
+{
+	return lttng_regenerate_metadata(session_name);
+}
+
+/*
  * lib constructor.
  */
 static void __attribute__((constructor)) init(void)
diff --git a/tests/destructive/metadata-regeneration b/tests/destructive/metadata-regeneration
index 32469b5..d4e632a 100755
--- a/tests/destructive/metadata-regeneration
+++ b/tests/destructive/metadata-regeneration
@@ -89,7 +89,7 @@ function test_kernel_local ()
 	validate_trace_date $DATE1 $TRACE_PATH
 	start_lttng_tracing_ok $SESSION_NAME
 	date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
-	metadata_regenerate_ok $SESSION_NAME
+	regenerate_metadata_ok $SESSION_NAME
 	stop_lttng_tracing_ok $SESSION_NAME
 	validate_trace_date $DATE2 $TRACE_PATH
 	if [ $? -eq 0 ]; then
@@ -111,7 +111,7 @@ function test_kernel_streaming ()
 	validate_trace_date $DATE1 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
 	start_lttng_tracing_ok $SESSION_NAME
 	date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
-	metadata_regenerate_ok $SESSION_NAME
+	regenerate_metadata_ok $SESSION_NAME
 	stop_lttng_tracing_ok $SESSION_NAME
 	# Validate test
 	validate_trace_date $DATE2 $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
@@ -147,7 +147,7 @@ function test_ust_local ()
 
 	start_lttng_tracing_ok $SESSION_NAME
 	date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
-	metadata_regenerate_ok $SESSION_NAME
+	regenerate_metadata_ok $SESSION_NAME
 
 	stop_lttng_tracing_ok $SESSION_NAME
 	destroy_lttng_session_ok $SESSION_NAME
@@ -184,7 +184,7 @@ function test_ust_streaming ()
 	start_lttng_tracing_ok $SESSION_NAME
 	date "+%Y-%m-%d %H:%M" -s "$DATE2 $HOUR" >/dev/null
 
-	metadata_regenerate_ok $SESSION_NAME
+	regenerate_metadata_ok $SESSION_NAME
 
 	stop_lttng_tracing_ok $SESSION_NAME
 	destroy_lttng_session_ok $SESSION_NAME
diff --git a/tests/fast_regression b/tests/fast_regression
index 0c4f079..262c846 100644
--- a/tests/fast_regression
+++ b/tests/fast_regression
@@ -16,7 +16,7 @@ regression/tools/save-load/test_load
 regression/tools/mi/test_mi
 regression/tools/wildcard/test_event_wildcard
 regression/tools/crash/test_crash
-regression/tools/metadata-regen/test_ust
+regression/tools/regen-metadata/test_ust
 regression/ust/before-after/test_before_after
 regression/ust/buffers-pid/test_buffers_pid
 regression/ust/multi-session/test_multi_session
diff --git a/tests/regression/Makefile.am b/tests/regression/Makefile.am
index 6a2d24c..2297ea1 100644
--- a/tests/regression/Makefile.am
+++ b/tests/regression/Makefile.am
@@ -22,7 +22,7 @@ TESTS = tools/filtering/test_invalid_filter \
 	tools/mi/test_mi \
 	tools/wildcard/test_event_wildcard \
 	tools/crash/test_crash \
-	tools/metadata-regen/test_ust
+	tools/regen-metadata/test_ust
 
 if HAVE_LIBLTTNG_UST_CTL
 SUBDIRS += ust
diff --git a/tests/regression/tools/Makefile.am b/tests/regression/tools/Makefile.am
index 6c39c9f..91820ad 100644
--- a/tests/regression/tools/Makefile.am
+++ b/tests/regression/tools/Makefile.am
@@ -1,2 +1,2 @@
 SUBDIRS = streaming filtering health tracefile-limits snapshots live exclusion save-load mi \
-		wildcard crash metadata-regen
+		wildcard crash regen-metadata
diff --git a/tests/regression/tools/metadata-regen/Makefile.am b/tests/regression/tools/metadata-regen/Makefile.am
deleted file mode 100644
index d4a92eb..0000000
--- a/tests/regression/tools/metadata-regen/Makefile.am
+++ /dev/null
@@ -1,16 +0,0 @@
-noinst_SCRIPTS = test_ust test_kernel
-EXTRA_DIST = test_ust test_kernel
-
-all-local:
-	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-		for script in $(EXTRA_DIST); do \
-			cp -f $(srcdir)/$$script $(builddir); \
-		done; \
-	fi
-
-clean-local:
-	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
-		for script in $(EXTRA_DIST); do \
-			rm -f $(builddir)/$$script; \
-		done; \
-	fi
diff --git a/tests/regression/tools/metadata-regen/test_kernel b/tests/regression/tools/metadata-regen/test_kernel
deleted file mode 100755
index fb9940a..0000000
--- a/tests/regression/tools/metadata-regen/test_kernel
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
-#
-# This library is free software; you can redistribute it and/or modify it under
-# the terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation; version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with this library; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
-TEST_DESC="Streaming - Kernel tracing"
-
-CURDIR=$(dirname $0)/
-TESTDIR=$CURDIR/../../..
-EVENT_NAME="lttng_test_filter_event"
-PID_RELAYD=0
-SESSION_NAME=""
-
-TRACE_PATH=$(mktemp -d)
-
-NUM_TESTS=18
-
-source $TESTDIR/utils/utils.sh
-
-# LTTng kernel modules check
-out=`ls /lib/modules/$(uname -r)/extra | grep lttng`
-if [ -z "$out" ]; then
-	BAIL_OUT "LTTng modules not detected."
-fi
-
-function lttng_create_session_uri
-{
-	# Create session with default path
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
-
-	ok $? "Create session $SESSION_NAME"
-}
-
-function test_kernel_streaming ()
-{
-	diag "Test kernel streaming with metadata regeneration"
-	lttng_create_session_uri
-	lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
-	start_lttng_tracing_ok $SESSION_NAME
-	echo -n "100" > /proc/lttng-test-filter-event
-	metadata_regenerate_ok $SESSION_NAME
-	stop_lttng_tracing_ok $SESSION_NAME
-	# Validate test
-	validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	else
-		break
-	fi
-	destroy_lttng_session_ok $SESSION_NAME
-}
-
-function test_kernel_local ()
-{
-	diag "Test kernel local with metadata regeneration"
-	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
-	lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
-	start_lttng_tracing_ok $SESSION_NAME
-	echo -n "100" > /proc/lttng-test-filter-event
-	metadata_regenerate_ok $SESSION_NAME
-	stop_lttng_tracing_ok $SESSION_NAME
-	validate_trace $EVENT_NAME $TRACE_PATH
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	fi
-	destroy_lttng_session_ok $SESSION_NAME
-}
-
-plan_tests $NUM_TESTS
-
-print_test_banner "$TEST_DESC"
-
-if [ "$(id -u)" == "0" ]; then
-	isroot=1
-else
-	isroot=0
-fi
-
-skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS ||
-{
-	start_lttng_relayd "-o $TRACE_PATH"
-	start_lttng_sessiond
-	modprobe lttng-test
-
-	tests=( test_kernel_streaming test_kernel_local )
-
-	for fct_test in ${tests[@]};
-	do
-		SESSION_NAME=$(randstring 16 0)
-		${fct_test}
-	done
-
-	rmmod lttng-test
-	stop_lttng_sessiond
-	stop_lttng_relayd
-}
diff --git a/tests/regression/tools/metadata-regen/test_ust b/tests/regression/tools/metadata-regen/test_ust
deleted file mode 100755
index fe6ffd8..0000000
--- a/tests/regression/tools/metadata-regen/test_ust
+++ /dev/null
@@ -1,208 +0,0 @@
-#!/bin/bash
-#
-# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
-#
-# This library is free software; you can redistribute it and/or modify it under
-# the terms of the GNU Lesser General Public License as published by the Free
-# Software Foundation; version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with this library; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
-TEST_DESC="Streaming - User space tracing"
-
-CURDIR=$(dirname $0)/
-TESTDIR=$CURDIR/../../..
-NR_ITER=1
-NR_USEC_WAIT=0
-TESTAPP_PATH="$TESTDIR/utils/testapp"
-TESTAPP_NAME="gen-ust-events"
-TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
-SESSION_NAME="stream"
-EVENT_NAME="tp:tptest"
-PID_RELAYD=0
-
-TRACE_PATH=$(mktemp -d)
-
-NUM_TESTS=33
-
-source $TESTDIR/utils/utils.sh
-
-if [ ! -x "$TESTAPP_BIN" ]; then
-	BAIL_OUT "No UST events binary detected."
-fi
-
-function lttng_create_session_uri
-{
-	# Create session with default path
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
-	ok $? "Create session with default path"
-}
-
-function lttng_create_session_uri_live
-{
-	# Create session with default path
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME --live -U net://localhost >/dev/null 2>&1
-	ok $? "Create live session"
-}
-
-function enable_channel_per_pid()
-{
-	sess_name=$1
-	channel_name=$2
-
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name >/dev/null 2>&1
-	ok $? "Enable channel $channel_name per PID for session $sess_name"
-}
-
-# MUST set TESTDIR before calling those functions
-
-function test_ust_streaming ()
-{
-	local file_sync_after_first=$(mktemp -u)
-	local file_sync_before_last=$(mktemp -u)
-
-	diag "Test UST streaming with metadata regeneration"
-	lttng_create_session_uri
-	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
-
-	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
-
-	start_lttng_tracing_ok $SESSION_NAME
-
-	touch ${file_sync_before_last}
-
-	# Wait for the applications started in background
-	wait
-	metadata_regenerate_ok $SESSION_NAME
-
-	stop_lttng_tracing_ok $SESSION_NAME
-	destroy_lttng_session_ok $SESSION_NAME
-	# Validate test
-	validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	fi
-	rm -f ${file_sync_after_first}
-	rm -f ${file_sync_before_last}
-}
-
-function test_ust_local ()
-{
-	local file_sync_after_first=$(mktemp -u)
-	local file_sync_before_last=$(mktemp -u)
-
-	diag "Test UST local with metadata regeneration"
-	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
-	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
-
-	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
-
-	start_lttng_tracing_ok $SESSION_NAME
-
-	touch ${file_sync_before_last}
-
-	# Wait for the applications started in background
-	wait
-	metadata_regenerate_ok $SESSION_NAME
-
-	stop_lttng_tracing_ok $SESSION_NAME
-	destroy_lttng_session_ok $SESSION_NAME
-	# Validate test
-	validate_trace $EVENT_NAME $TRACE_PATH
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	fi
-	rm -f ${file_sync_after_first}
-	rm -f ${file_sync_before_last}
-}
-
-function test_ust_pid ()
-{
-	local file_sync_after_first=$(mktemp -u)
-	local file_sync_before_last=$(mktemp -u)
-
-	diag "Test UST per-pid with metadata regeneration (expect failure)"
-	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
-	enable_channel_per_pid $SESSION_NAME "channel0"
-	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
-
-	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
-
-	start_lttng_tracing_ok $SESSION_NAME
-
-	touch ${file_sync_before_last}
-
-	# Wait for the applications started in background
-	wait
-	metadata_regenerate_fail $SESSION_NAME
-
-	stop_lttng_tracing_ok $SESSION_NAME
-	destroy_lttng_session_ok $SESSION_NAME
-	# Validate test
-	validate_trace $EVENT_NAME $TRACE_PATH
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	fi
-	rm -f ${file_sync_after_first}
-	rm -f ${file_sync_before_last}
-}
-
-function test_ust_live ()
-{
-	local file_sync_after_first=$(mktemp -u)
-	local file_sync_before_last=$(mktemp -u)
-
-	diag "Test UST live with metadata regeneration (expect failure)"
-	lttng_create_session_uri_live $SESSION_NAME $TRACE_PATH
-	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
-
-	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
-
-	start_lttng_tracing_ok $SESSION_NAME
-
-	touch ${file_sync_before_last}
-
-	# Wait for the applications started in background
-	wait
-	metadata_regenerate_fail $SESSION_NAME
-
-	stop_lttng_tracing_ok $SESSION_NAME
-	destroy_lttng_session_ok $SESSION_NAME
-	# Validate test
-	validate_trace $EVENT_NAME $TRACE_PATH
-	if [ $? -eq 0 ]; then
-		# Only delete if successful
-		rm -rf $TRACE_PATH
-	fi
-	rm -f ${file_sync_after_first}
-	rm -f ${file_sync_before_last}
-}
-
-plan_tests $NUM_TESTS
-
-print_test_banner "$TEST_DESC"
-
-start_lttng_relayd "-o $TRACE_PATH"
-start_lttng_sessiond
-
-tests=( test_ust_streaming test_ust_local test_ust_pid test_ust_live )
-
-for fct_test in ${tests[@]};
-do
-	SESSION_NAME=$(randstring 16 0)
-	${fct_test}
-done
-
-stop_lttng_sessiond
-stop_lttng_relayd
-
-exit $out
diff --git a/tests/regression/tools/mi/test_mi b/tests/regression/tools/mi/test_mi
index 0e8fa67..380385f 100755
--- a/tests/regression/tools/mi/test_mi
+++ b/tests/regression/tools/mi/test_mi
@@ -631,9 +631,9 @@ function test_start_stop () {
 	ok $? "Mi test: enabled element : $result expected: true"
 
 	#Test metadata regenerate command
-	metadata_regenerate_ok $session_name
+	regenerate_metadata_ok $session_name
 	$XML_VALIDATE $OUTPUT_DEST
-	ok $? "Mi test: metadata regenerate"
+	ok $? "Mi test: regenerate metadata"
 
 	#Test stop command
 	stop_lttng_tracing_ok $session_name
diff --git a/tests/regression/tools/regen-metadata/Makefile.am b/tests/regression/tools/regen-metadata/Makefile.am
new file mode 100644
index 0000000..d4a92eb
--- /dev/null
+++ b/tests/regression/tools/regen-metadata/Makefile.am
@@ -0,0 +1,16 @@
+noinst_SCRIPTS = test_ust test_kernel
+EXTRA_DIST = test_ust test_kernel
+
+all-local:
+	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+		for script in $(EXTRA_DIST); do \
+			cp -f $(srcdir)/$$script $(builddir); \
+		done; \
+	fi
+
+clean-local:
+	@if [ x"$(srcdir)" != x"$(builddir)" ]; then \
+		for script in $(EXTRA_DIST); do \
+			rm -f $(builddir)/$$script; \
+		done; \
+	fi
diff --git a/tests/regression/tools/regen-metadata/test_kernel b/tests/regression/tools/regen-metadata/test_kernel
new file mode 100755
index 0000000..fd139ae
--- /dev/null
+++ b/tests/regression/tools/regen-metadata/test_kernel
@@ -0,0 +1,109 @@
+#!/bin/bash
+#
+# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+TEST_DESC="Streaming - Kernel tracing"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../../..
+EVENT_NAME="lttng_test_filter_event"
+PID_RELAYD=0
+SESSION_NAME=""
+
+TRACE_PATH=$(mktemp -d)
+
+NUM_TESTS=18
+
+source $TESTDIR/utils/utils.sh
+
+# LTTng kernel modules check
+out=`ls /lib/modules/$(uname -r)/extra | grep lttng`
+if [ -z "$out" ]; then
+	BAIL_OUT "LTTng modules not detected."
+fi
+
+function lttng_create_session_uri
+{
+	# Create session with default path
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
+
+	ok $? "Create session $SESSION_NAME"
+}
+
+function test_kernel_streaming ()
+{
+	diag "Test kernel streaming with metadata regeneration"
+	lttng_create_session_uri
+	lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
+	start_lttng_tracing_ok $SESSION_NAME
+	echo -n "100" > /proc/lttng-test-filter-event
+	regenerate_metadata_ok $SESSION_NAME
+	stop_lttng_tracing_ok $SESSION_NAME
+	# Validate test
+	validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	else
+		break
+	fi
+	destroy_lttng_session_ok $SESSION_NAME
+}
+
+function test_kernel_local ()
+{
+	diag "Test kernel local with metadata regeneration"
+	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+	lttng_enable_kernel_event $SESSION_NAME $EVENT_NAME
+	start_lttng_tracing_ok $SESSION_NAME
+	echo -n "100" > /proc/lttng-test-filter-event
+	regenerate_metadata_ok $SESSION_NAME
+	stop_lttng_tracing_ok $SESSION_NAME
+	validate_trace $EVENT_NAME $TRACE_PATH
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	destroy_lttng_session_ok $SESSION_NAME
+}
+
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+if [ "$(id -u)" == "0" ]; then
+	isroot=1
+else
+	isroot=0
+fi
+
+skip $isroot "Root access is needed. Skipping all kernel streaming tests." $NUM_TESTS ||
+{
+	start_lttng_relayd "-o $TRACE_PATH"
+	start_lttng_sessiond
+	modprobe lttng-test
+
+	tests=( test_kernel_streaming test_kernel_local )
+
+	for fct_test in ${tests[@]};
+	do
+		SESSION_NAME=$(randstring 16 0)
+		${fct_test}
+	done
+
+	rmmod lttng-test
+	stop_lttng_sessiond
+	stop_lttng_relayd
+}
diff --git a/tests/regression/tools/regen-metadata/test_ust b/tests/regression/tools/regen-metadata/test_ust
new file mode 100755
index 0000000..b7f1af1
--- /dev/null
+++ b/tests/regression/tools/regen-metadata/test_ust
@@ -0,0 +1,208 @@
+#!/bin/bash
+#
+# Copyright (C) - 2015 Julien Desfossez <jdesfossez@efficios.com>
+#
+# This library is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+TEST_DESC="Streaming - User space tracing"
+
+CURDIR=$(dirname $0)/
+TESTDIR=$CURDIR/../../..
+NR_ITER=1
+NR_USEC_WAIT=0
+TESTAPP_PATH="$TESTDIR/utils/testapp"
+TESTAPP_NAME="gen-ust-events"
+TESTAPP_BIN="$TESTAPP_PATH/$TESTAPP_NAME/$TESTAPP_NAME"
+SESSION_NAME="stream"
+EVENT_NAME="tp:tptest"
+PID_RELAYD=0
+
+TRACE_PATH=$(mktemp -d)
+
+NUM_TESTS=33
+
+source $TESTDIR/utils/utils.sh
+
+if [ ! -x "$TESTAPP_BIN" ]; then
+	BAIL_OUT "No UST events binary detected."
+fi
+
+function lttng_create_session_uri
+{
+	# Create session with default path
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME -U net://localhost >/dev/null 2>&1
+	ok $? "Create session with default path"
+}
+
+function lttng_create_session_uri_live
+{
+	# Create session with default path
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN create $SESSION_NAME --live -U net://localhost >/dev/null 2>&1
+	ok $? "Create live session"
+}
+
+function enable_channel_per_pid()
+{
+	sess_name=$1
+	channel_name=$2
+
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN enable-channel --buffers-pid -u $channel_name -s $sess_name >/dev/null 2>&1
+	ok $? "Enable channel $channel_name per PID for session $sess_name"
+}
+
+# MUST set TESTDIR before calling those functions
+
+function test_ust_streaming ()
+{
+	local file_sync_after_first=$(mktemp -u)
+	local file_sync_before_last=$(mktemp -u)
+
+	diag "Test UST streaming with metadata regeneration"
+	lttng_create_session_uri
+	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
+
+	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+	start_lttng_tracing_ok $SESSION_NAME
+
+	touch ${file_sync_before_last}
+
+	# Wait for the applications started in background
+	wait
+	regenerate_metadata_ok $SESSION_NAME
+
+	stop_lttng_tracing_ok $SESSION_NAME
+	destroy_lttng_session_ok $SESSION_NAME
+	# Validate test
+	validate_trace $EVENT_NAME $TRACE_PATH/$HOSTNAME/$SESSION_NAME*
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	rm -f ${file_sync_after_first}
+	rm -f ${file_sync_before_last}
+}
+
+function test_ust_local ()
+{
+	local file_sync_after_first=$(mktemp -u)
+	local file_sync_before_last=$(mktemp -u)
+
+	diag "Test UST local with metadata regeneration"
+	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
+
+	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+	start_lttng_tracing_ok $SESSION_NAME
+
+	touch ${file_sync_before_last}
+
+	# Wait for the applications started in background
+	wait
+	regenerate_metadata_ok $SESSION_NAME
+
+	stop_lttng_tracing_ok $SESSION_NAME
+	destroy_lttng_session_ok $SESSION_NAME
+	# Validate test
+	validate_trace $EVENT_NAME $TRACE_PATH
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	rm -f ${file_sync_after_first}
+	rm -f ${file_sync_before_last}
+}
+
+function test_ust_pid ()
+{
+	local file_sync_after_first=$(mktemp -u)
+	local file_sync_before_last=$(mktemp -u)
+
+	diag "Test UST per-pid with metadata regeneration (expect failure)"
+	create_lttng_session_ok $SESSION_NAME $TRACE_PATH
+	enable_channel_per_pid $SESSION_NAME "channel0"
+	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME "channel0"
+
+	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+	start_lttng_tracing_ok $SESSION_NAME
+
+	touch ${file_sync_before_last}
+
+	# Wait for the applications started in background
+	wait
+	regenerate_metadata_fail $SESSION_NAME
+
+	stop_lttng_tracing_ok $SESSION_NAME
+	destroy_lttng_session_ok $SESSION_NAME
+	# Validate test
+	validate_trace $EVENT_NAME $TRACE_PATH
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	rm -f ${file_sync_after_first}
+	rm -f ${file_sync_before_last}
+}
+
+function test_ust_live ()
+{
+	local file_sync_after_first=$(mktemp -u)
+	local file_sync_before_last=$(mktemp -u)
+
+	diag "Test UST live with metadata regeneration (expect failure)"
+	lttng_create_session_uri_live $SESSION_NAME $TRACE_PATH
+	enable_ust_lttng_event_ok $SESSION_NAME $EVENT_NAME
+
+	$TESTAPP_BIN $NR_ITER $NR_USEC_WAIT ${file_sync_after_first} ${file_sync_before_last} /dev/null 2>&1 &
+
+	start_lttng_tracing_ok $SESSION_NAME
+
+	touch ${file_sync_before_last}
+
+	# Wait for the applications started in background
+	wait
+	regenerate_metadata_fail $SESSION_NAME
+
+	stop_lttng_tracing_ok $SESSION_NAME
+	destroy_lttng_session_ok $SESSION_NAME
+	# Validate test
+	validate_trace $EVENT_NAME $TRACE_PATH
+	if [ $? -eq 0 ]; then
+		# Only delete if successful
+		rm -rf $TRACE_PATH
+	fi
+	rm -f ${file_sync_after_first}
+	rm -f ${file_sync_before_last}
+}
+
+plan_tests $NUM_TESTS
+
+print_test_banner "$TEST_DESC"
+
+start_lttng_relayd "-o $TRACE_PATH"
+start_lttng_sessiond
+
+tests=( test_ust_streaming test_ust_local test_ust_pid test_ust_live )
+
+for fct_test in ${tests[@]};
+do
+	SESSION_NAME=$(randstring 16 0)
+	${fct_test}
+done
+
+stop_lttng_sessiond
+stop_lttng_relayd
+
+exit $out
diff --git a/tests/root_regression b/tests/root_regression
index 2981dc6..d0fad04 100644
--- a/tests/root_regression
+++ b/tests/root_regression
@@ -14,5 +14,5 @@ regression/tools/filtering/test_invalid_filter
 regression/tools/filtering/test_unsupported_op
 regression/tools/filtering/test_valid_filter
 regression/tools/wildcard/test_event_wildcard
-regression/tools/metadata-regen/test_kernel
+regression/tools/regen-metadata/test_kernel
 regression/ust/test_event_perf
diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh
index da2efe9..3d744e2 100644
--- a/tests/utils/utils.sh
+++ b/tests/utils/utils.sh
@@ -1366,29 +1366,29 @@ function validate_trace_empty()
 	return $ret
 }
 
-function metadata_regenerate ()
+function regenerate_metadata ()
 {
 	local expected_to_fail=$1
 	local sess_name=$2
 
-	$TESTDIR/../src/bin/lttng/$LTTNG_BIN metadata regenerate -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST
+	$TESTDIR/../src/bin/lttng/$LTTNG_BIN regenerate metadata -s $sess_name 1> $OUTPUT_DEST 2> $ERROR_OUTPUT_DEST
 	ret=$?
 	if [[ $expected_to_fail -eq "1" ]]; then
 		test "$ret" -ne "0"
-		ok $? "Expected fail on regenerate $sess_name"
+		ok $? "Expected fail on regenerate metadata $sess_name"
 	else
 		ok $ret "Metadata regenerate $sess_name"
 	fi
 }
 
-function metadata_regenerate_ok ()
+function regenerate_metadata_ok ()
 {
-	metadata_regenerate 0 "$@"
+	regenerate_metadata 0 "$@"
 }
 
-function metadata_regenerate_fail ()
+function regenerate_metadata_fail ()
 {
-	metadata_regenerate 1 "$@"
+	regenerate_metadata 1 "$@"
 }
 
 function destructive_tests_enabled ()
-- 
1.9.1



_______________________________________________
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

^ permalink raw reply related	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2016-07-06 20:30 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1467730478-9524-1-git-send-email-jdesfossez@efficios.com>
2016-07-05 14:54 ` [PATCH lttng-tools v3 2/6] UST command to regenerate the statedump Julien Desfossez
2016-07-05 14:54 ` [PATCH lttng-tools v3 3/6] Kernel ioctl " Julien Desfossez
2016-07-05 14:54 ` [PATCH lttng-tools v3 4/6] Allow regenerating the statedump of a running session Julien Desfossez
2016-07-05 14:54 ` [PATCH lttng-tools v3 5/6] Tests for the regenerate statedump command Julien Desfossez
2016-07-05 14:54 ` [PATCH lttng-tools v3 6/6] Manpage " Julien Desfossez
2016-07-06 20:30 ` [PATCH lttng-tools v3 1/6] Rename the "metadata regenerate" command to "regenerate metadata" Jérémie Galarneau
2016-07-05 14:54 Julien Desfossez

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.