Print the location of trace chunk produced at session destruction
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 24 Jun 2019 20:41:50 +0000 (16:41 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 5 Sep 2019 20:39:14 +0000 (16:39 -0400)
The destruction of a session that was rotated during its lifetime
will cause an "implicit" rotation to close the last trace archive.

This change makes the CLI client use the newly added destruction
handle interface of liblttng-ctl to print the location of the
last trace archive produced during the destruction of a session
(when applicable).

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
include/lttng/lttng.h
src/bin/lttng/commands/destroy.c
src/bin/lttng/commands/rotate.c
src/bin/lttng/utils.c
src/bin/lttng/utils.h

index bde1547a479d244ba52b5790bfc13cbb76bb172c..5279bc57d5d2b79b45cd6bfa98291d67ab7f8358 100644 (file)
@@ -36,6 +36,7 @@
 #include <lttng/snapshot.h>
 #include <lttng/endpoint.h>
 #include <lttng/session-descriptor.h>
+#include <lttng/destruction-handle.h>
 #include <lttng/action/action.h>
 #include <lttng/action/notify.h>
 #include <lttng/condition/condition.h>
index 77acb180f8b8d91ee44bfd6249f86c4c8cc696b1..7cea7bf23303a6a2cadf48709f881f58c79964f5 100644 (file)
@@ -24,6 +24,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include <stdbool.h>
+#include <lttng/lttng.h>
 
 #include "../command.h"
 
@@ -69,6 +70,11 @@ static int destroy_session(struct lttng_session *session)
        int ret;
        char *session_name = NULL;
        bool session_was_stopped;
+       enum lttng_error_code ret_code;
+       struct lttng_destruction_handle *handle = NULL;
+        enum lttng_destruction_handle_status status;
+       bool printed_wait_msg = false;
+       enum lttng_rotation_state rotation_state;
 
        ret = lttng_stop_tracing_no_wait(session->name);
        if (ret < 0 && ret != -LTTNG_ERR_TRACE_ALREADY_STOPPED) {
@@ -76,8 +82,6 @@ static int destroy_session(struct lttng_session *session)
        }
        session_was_stopped = ret == -LTTNG_ERR_TRACE_ALREADY_STOPPED;
        if (!opt_no_wait) {
-               bool printed_wait_msg = false;
-
                do {
                        ret = lttng_data_pending(session->name);
                        if (ret < 0) {
@@ -91,19 +95,17 @@ static int destroy_session(struct lttng_session *session)
                         */
                        if (ret) {
                                if (!printed_wait_msg) {
-                                       _MSG("Waiting for data availability");
+                                       _MSG("Waiting for destruction of session \"%s\"",
+                                                       session->name);
+                                       printed_wait_msg = true;
                                        fflush(stdout);
                                }
 
-                               printed_wait_msg = true;
                                usleep(DEFAULT_DATA_AVAILABILITY_WAIT_TIME);
                                _MSG(".");
                                fflush(stdout);
                        }
                } while (ret != 0);
-               if (printed_wait_msg) {
-                       MSG("");
-               }
        }
        if (!session_was_stopped) {
                /*
@@ -113,12 +115,83 @@ static int destroy_session(struct lttng_session *session)
                print_session_stats(session->name);
        }
 
-       ret = lttng_destroy_session(session->name);
-       if (ret < 0) {
+       ret_code = lttng_destroy_session_ext(session->name, &handle);
+       if (ret_code != LTTNG_OK) {
+               ret = -ret_code;
+               goto error;
+       }
+
+       if (opt_no_wait) {
+               goto skip_wait_rotation;
+       }
+
+       do {
+               status = lttng_destruction_handle_wait_for_completion(handle,
+                               DEFAULT_DATA_AVAILABILITY_WAIT_TIME);
+               switch (status) {
+               case LTTNG_DESTRUCTION_HANDLE_STATUS_TIMEOUT:
+                       if (!printed_wait_msg) {
+                               _MSG("Waiting for destruction of session \"%s\"",
+                                               session->name);
+                               printed_wait_msg = true;
+                       }
+                       _MSG(".");
+                       fflush(stdout);
+                       break;
+               case LTTNG_DESTRUCTION_HANDLE_STATUS_COMPLETED:
+                       break;
+               default:
+                       ERR("Failed to wait for the completion of the destruction of session \"%s\"",
+                                       session->name);
+                       ret = -1;
+                       goto error;
+               }
+       } while (status == LTTNG_DESTRUCTION_HANDLE_STATUS_TIMEOUT);
+
+       status = lttng_destruction_handle_get_result(handle, &ret_code);
+       if (status != LTTNG_DESTRUCTION_HANDLE_STATUS_OK) {
+               ERR("Failed to get the result of session destruction");
+               ret = -1;
+               goto error;
+       }
+       if (ret_code != LTTNG_OK) {
+               ret = -LTTNG_OK;
                goto error;
        }
 
-       MSG("Session %s destroyed", session->name);
+       status = lttng_destruction_handle_get_rotation_state(handle,
+                       &rotation_state);
+       switch (rotation_state) {
+       case LTTNG_ROTATION_STATE_NO_ROTATION:
+               break;
+        case LTTNG_ROTATION_STATE_COMPLETED:
+       {
+               const struct lttng_trace_archive_location *location;
+
+               status = lttng_destruction_handle_get_archive_location(handle,
+                               &location);
+               if (status == LTTNG_DESTRUCTION_HANDLE_STATUS_OK) {
+                       if (printed_wait_msg) {
+                               MSG("");
+                               printed_wait_msg = false;
+                       }
+                       ret = print_trace_archive_location(location,
+                                       session->name);
+                       if (ret) {
+                               ERR("Failed to print the location of trace archive");
+                               goto skip_wait_rotation;
+                       }
+                       break;
+               }
+               /* fall-through. */
+        }
+        default:
+               ERR("Failed to get the location of the rotation performed during the session's destruction");
+               goto skip_wait_rotation;
+       }
+skip_wait_rotation:
+       MSG("%sSession \"%s\" destroyed", printed_wait_msg ? "\n" : "",
+                       session->name);
 
        session_name = get_session_name_quiet();
        if (session_name && !strncmp(session->name, session_name, NAME_MAX)) {
@@ -135,6 +208,7 @@ static int destroy_session(struct lttng_session *session)
 
        ret = CMD_SUCCESS;
 error:
+       lttng_destruction_handle_destroy(handle);
        free(session_name);
        return ret;
 }
index e2a4c509ae6464ce04cd6c182fd789a9d02692d1..ab31546f9372e29bd63077077635bc30995f11a4 100644 (file)
@@ -57,101 +57,6 @@ static struct poptOption long_options[] = {
        {0, 0, 0, 0, 0, 0, 0}
 };
 
-static int output_trace_archive_location(
-               const struct lttng_trace_archive_location *location,
-               const char *session_name)
-{
-       int ret = 0;
-       enum lttng_trace_archive_location_type location_type;
-       enum lttng_trace_archive_location_status status;
-       bool printed_location = false;
-
-       location_type = lttng_trace_archive_location_get_type(location);
-
-       _MSG("Trace chunk archive for session %s is now readable",
-                       session_name);
-       switch (location_type) {
-       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
-       {
-               const char *absolute_path;
-
-               status = lttng_trace_archive_location_local_get_absolute_path(
-                               location, &absolute_path);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-               MSG(" at %s", absolute_path);
-               printed_location = true;
-               break;
-       }
-       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY:
-       {
-               uint16_t control_port, data_port;
-               const char *host, *relative_path, *protocol_str;
-               enum lttng_trace_archive_location_relay_protocol_type protocol;
-
-               /* Fetch all relay location parameters. */
-               status = lttng_trace_archive_location_relay_get_protocol_type(
-                               location, &protocol);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-
-               status = lttng_trace_archive_location_relay_get_host(
-                               location, &host);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-
-               status = lttng_trace_archive_location_relay_get_control_port(
-                               location, &control_port);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-
-               status = lttng_trace_archive_location_relay_get_data_port(
-                               location, &data_port);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-
-               status = lttng_trace_archive_location_relay_get_relative_path(
-                               location, &relative_path);
-               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
-                       ret = -1;
-                       goto end;
-               }
-
-               switch (protocol) {
-               case LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP:
-                       protocol_str = "tcp";
-                       break;
-               default:
-                       protocol_str = "unknown";
-                       break;
-               }
-
-               MSG(" on relay %s://%s/%s [control port %" PRIu16 ", data port %"
-                               PRIu16 "]", protocol_str, host,
-                               relative_path, control_port, data_port);
-               printed_location = true;
-               break;
-       }
-       default:
-               break;
-       }
-end:
-       if (!printed_location) {
-               MSG(" at an unknown location");
-       }
-       return ret;
-}
-
 static int rotate_tracing(char *session_name)
 {
        int ret;
@@ -240,7 +145,7 @@ skip_wait:
        }
 
        if (!lttng_opt_mi && print_location) {
-               ret = output_trace_archive_location(location,
+               ret = print_trace_archive_location(location,
                                session_name);
        } else if (lttng_opt_mi) {
                ret = mi_lttng_rotate(writer, session_name, rotation_state,
index 0e96ef0c3daf36f08b41c26749356a56705dac01..1e3b91344d24ae58470b2cb966758402bd41c322 100644 (file)
@@ -554,3 +554,98 @@ int show_cmd_help(const char *cmd_name, const char *help_msg)
 
        return ret;
 }
+
+int print_trace_archive_location(
+               const struct lttng_trace_archive_location *location,
+               const char *session_name)
+{
+       int ret = 0;
+       enum lttng_trace_archive_location_type location_type;
+       enum lttng_trace_archive_location_status status;
+       bool printed_location = false;
+
+       location_type = lttng_trace_archive_location_get_type(location);
+
+       _MSG("Trace chunk archive for session %s is now readable",
+                       session_name);
+       switch (location_type) {
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_LOCAL:
+       {
+               const char *absolute_path;
+
+               status = lttng_trace_archive_location_local_get_absolute_path(
+                               location, &absolute_path);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+               MSG(" at %s", absolute_path);
+               printed_location = true;
+               break;
+       }
+       case LTTNG_TRACE_ARCHIVE_LOCATION_TYPE_RELAY:
+       {
+               uint16_t control_port, data_port;
+               const char *host, *relative_path, *protocol_str;
+               enum lttng_trace_archive_location_relay_protocol_type protocol;
+
+               /* Fetch all relay location parameters. */
+               status = lttng_trace_archive_location_relay_get_protocol_type(
+                               location, &protocol);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+
+               status = lttng_trace_archive_location_relay_get_host(
+                               location, &host);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+
+               status = lttng_trace_archive_location_relay_get_control_port(
+                               location, &control_port);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+
+               status = lttng_trace_archive_location_relay_get_data_port(
+                               location, &data_port);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+
+               status = lttng_trace_archive_location_relay_get_relative_path(
+                               location, &relative_path);
+               if (status != LTTNG_TRACE_ARCHIVE_LOCATION_STATUS_OK) {
+                       ret = -1;
+                       goto end;
+               }
+
+               switch (protocol) {
+               case LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP:
+                       protocol_str = "tcp";
+                       break;
+               default:
+                       protocol_str = "unknown";
+                       break;
+               }
+
+               MSG(" on relay %s://%s/%s [control port %" PRIu16 ", data port %"
+                               PRIu16 "]", protocol_str, host,
+                               relative_path, control_port, data_port);
+               printed_location = true;
+               break;
+       }
+       default:
+               break;
+       }
+end:
+       if (!printed_location) {
+               MSG(" at an unknown location");
+       }
+       return ret;
+}
index b1b97d725d9c0617aeee631ca8fa93447b62fdf7..784e835771dfa1d5de96328f530b667c24581748 100644 (file)
@@ -62,4 +62,8 @@ int check_relayd(void);
 void print_session_stats(const char *session_name);
 int show_cmd_help(const char *cmd_name, const char *help_msg);
 
+int print_trace_archive_location(
+               const struct lttng_trace_archive_location *location,
+               const char *session_name);
+
 #endif /* _LTTNG_UTILS_H */
This page took 0.030634 seconds and 4 git commands to generate.