#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>
#include <sys/types.h>
#include <unistd.h>
#include <stdbool.h>
+#include <lttng/lttng.h>
#include "../command.h"
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) {
}
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) {
*/
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) {
/*
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)) {
ret = CMD_SUCCESS;
error:
+ lttng_destruction_handle_destroy(handle);
free(session_name);
return ret;
}
{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;
}
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,
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;
+}
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 */