From bbbfd84979130a11aebf172cf7d0d24e28165258 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Mon, 24 Jun 2019 16:41:50 -0400 Subject: [PATCH] Print the location of trace chunk produced at session destruction MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 --- include/lttng/lttng.h | 1 + src/bin/lttng/commands/destroy.c | 94 +++++++++++++++++++++++++++---- src/bin/lttng/commands/rotate.c | 97 +------------------------------- src/bin/lttng/utils.c | 95 +++++++++++++++++++++++++++++++ src/bin/lttng/utils.h | 4 ++ 5 files changed, 185 insertions(+), 106 deletions(-) diff --git a/include/lttng/lttng.h b/include/lttng/lttng.h index bde1547a4..5279bc57d 100644 --- a/include/lttng/lttng.h +++ b/include/lttng/lttng.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include diff --git a/src/bin/lttng/commands/destroy.c b/src/bin/lttng/commands/destroy.c index 77acb180f..7cea7bf23 100644 --- a/src/bin/lttng/commands/destroy.c +++ b/src/bin/lttng/commands/destroy.c @@ -24,6 +24,7 @@ #include #include #include +#include #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; } diff --git a/src/bin/lttng/commands/rotate.c b/src/bin/lttng/commands/rotate.c index e2a4c509a..ab31546f9 100644 --- a/src/bin/lttng/commands/rotate.c +++ b/src/bin/lttng/commands/rotate.c @@ -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, diff --git a/src/bin/lttng/utils.c b/src/bin/lttng/utils.c index 0e96ef0c3..1e3b91344 100644 --- a/src/bin/lttng/utils.c +++ b/src/bin/lttng/utils.c @@ -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; +} diff --git a/src/bin/lttng/utils.h b/src/bin/lttng/utils.h index b1b97d725..784e83577 100644 --- a/src/bin/lttng/utils.h +++ b/src/bin/lttng/utils.h @@ -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 */ -- 2.34.1