Explicitly stop the session on lttng destroy
authorJulien Desfossez <jdesfossez@efficios.com>
Fri, 3 Jul 2015 21:08:27 +0000 (17:08 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 25 Feb 2016 18:07:57 +0000 (13:07 -0500)
This changes the default behavior of the "destroy" command and API: now
it implicitely stops the tracing and waits for the data to be available
on disk or the network. Like the "stop" command and API, a no_wait
option is available to skip the waiting and destroy directly the
session.

Signed-off-by: Julien Desfossez <jdesfossez@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/lttng/session.h
src/bin/lttng/commands/destroy.c
src/lib/lttng-ctl/lttng-ctl.c

index 4e515ad7703bc03b3bb5530118063f29ac7051f5..599892d13508d7470f829f6c89da84b18aea6b9c 100644 (file)
@@ -90,12 +90,25 @@ extern int lttng_create_session_live(const char *name, const char *url,
  * The session will not be usable, tracing will be stopped thus buffers will be
  * flushed.
  *
+ * This call will wait for data availability for each domain of the session,
+ * which can take an arbitrary amount of time. However, when returning the
+ * tracing data is guaranteed to be ready to be read and analyzed.
+ *
+ * lttng_destroy_session_no_wait() may be used if such a guarantee is not
+ * needed.
+ *
  * The name can't be NULL here.
  *
  * Return 0 on success else a negative LTTng error code.
  */
 extern int lttng_destroy_session(const char *name);
 
+/*
+ * Behaves exactly like lttng_destroy_session but does not wait for data
+ * availability.
+ */
+extern int lttng_destroy_session_no_wait(const char *name);
+
 /*
  * List all the tracing sessions.
  *
index f74bf515c79ae44c7668e8cd674156ce24159da0..87231858f96ded25cb05c189b1c0464dc2f09c3f 100644 (file)
@@ -32,6 +32,7 @@
 
 static char *opt_session_name;
 static int opt_destroy_all;
+static int opt_no_wait;
 
 /* Mi writer */
 static struct mi_writer *writer;
@@ -46,6 +47,7 @@ static struct poptOption long_options[] = {
        {"help",      'h', POPT_ARG_NONE, 0, OPT_HELP, 0, 0},
        {"all",       'a', POPT_ARG_VAL, &opt_destroy_all, 1, 0, 0},
        {"list-options", 0, POPT_ARG_NONE, NULL, OPT_LIST_OPTIONS, NULL, NULL},
+       {"no-wait",   'n', POPT_ARG_VAL, &opt_no_wait, 1, 0, 0},
        {0, 0, 0, 0, 0, 0, 0}
 };
 
@@ -63,6 +65,7 @@ static void usage(FILE *ofp)
        fprintf(ofp, "  -h, --help           Show this help\n");
        fprintf(ofp, "  -a, --all            Destroy all sessions\n");
        fprintf(ofp, "      --list-options   Simple listing of options\n");
+       fprintf(ofp, "  -n, --no-wait        Don't wait for data availability\n");
        fprintf(ofp, "\n");
 }
 
@@ -77,16 +80,35 @@ static int destroy_session(struct lttng_session *session)
        int ret;
        char *session_name = NULL;
 
-       ret = lttng_destroy_session(session->name);
+       ret = lttng_stop_tracing_no_wait(session->name);
+       if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) {
+               ERR("%s", lttng_strerror(ret));
+       }
+       if (!opt_no_wait) {
+               _MSG("Waiting for data availability");
+               fflush(stdout);
+               do {
+                       ret = lttng_data_pending(session->name);
+                       if (ret < 0) {
+                               /* Return the data available call error. */
+                               goto error;
+                       }
+
+                       /*
+                        * Data sleep time before retrying (in usec). Don't sleep if the call
+                        * returned value indicates availability.
+                        */
+                       if (ret) {
+                               usleep(DEFAULT_DATA_AVAILABILITY_WAIT_TIME);
+                               _MSG(".");
+                               fflush(stdout);
+                       }
+               } while (ret != 0);
+               MSG("");
+       }
+
+       ret = lttng_destroy_session_no_wait(session->name);
        if (ret < 0) {
-               switch (-ret) {
-               case LTTNG_ERR_SESS_NOT_FOUND:
-                       WARN("Session name %s not found", session->name);
-                       break;
-               default:
-                       ERR("%s", lttng_strerror(ret));
-                       break;
-               }
                goto error;
        }
 
index 14bb7b32dab3f1559a0468cdc484c456961fdbd5..afa741c05b93554c00ec5dd70d90472123176a8b 100644 (file)
@@ -1525,7 +1525,7 @@ int lttng_create_session(const char *name, const char *url)
  * Destroy session using name.
  * Returns size of returned session payload data or a negative error code.
  */
-int lttng_destroy_session(const char *session_name)
+int _lttng_destroy_session(const char *session_name)
 {
        struct lttcomm_session_msg lsm;
 
@@ -1542,6 +1542,48 @@ int lttng_destroy_session(const char *session_name)
        return lttng_ctl_ask_sessiond(&lsm, NULL);
 }
 
+/*
+ * Stop the session and wait for the data before destroying it
+ */
+int lttng_destroy_session(const char *session_name)
+{
+       int ret;
+
+       /*
+        * Stop the tracing and wait for the data.
+        */
+       ret = _lttng_stop_tracing(session_name, 1);
+       if (ret && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) {
+               goto end;
+       }
+
+       ret = _lttng_destroy_session(session_name);
+end:
+       return ret;
+}
+
+/*
+ * Destroy the session without waiting for the data.
+ */
+int lttng_destroy_session_no_wait(const char *session_name)
+{
+       int ret;
+
+       /*
+        * Stop the tracing without waiting for the data.
+        * The session might already have been stopped, so just
+        * skip this error.
+        */
+       ret = _lttng_stop_tracing(session_name, 0);
+       if (ret && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) {
+               goto end;
+       }
+
+       ret = _lttng_destroy_session(session_name);
+end:
+       return ret;
+}
+
 /*
  * Ask the session daemon for all available sessions.
  * Sets the contents of the sessions array.
This page took 0.028818 seconds and 4 git commands to generate.