goto end;
}
- ret = asprintf(&chunk_path, "%s/" DEFAULT_ARCHIVED_TRACE_CHUNKS_DIRECTORY "/%s",
- session_get_base_path(session),
- session->last_archived_chunk_name);
- if (ret == -1) {
- goto end;
- }
-
switch (session_get_consumer_destination_type(session)) {
case CONSUMER_DST_LOCAL:
+ ret = asprintf(&chunk_path,
+ "%s/" DEFAULT_ARCHIVED_TRACE_CHUNKS_DIRECTORY "/%s",
+ session_get_base_path(session),
+ session->last_archived_chunk_name);
+ if (ret == -1) {
+ goto end;
+ }
location = lttng_trace_archive_location_local_create(
chunk_path);
break;
location = lttng_trace_archive_location_relay_create(
hostname,
LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP,
- control_port, data_port, chunk_path);
+ control_port, data_port, session->last_chunk_path);
break;
}
default:
struct lttng_trace_chunk *new_trace_chunk,
struct lttng_trace_chunk **_current_trace_chunk)
{
- int ret;
+ int ret = 0;
unsigned int i, refs_to_acquire = 0, refs_acquired = 0, refs_to_release = 0;
struct cds_lfht_iter iter;
struct consumer_socket *socket;
ret_error_code = ust_app_create_channel_subdirectories(
session->ust_session);
if (ret_error_code != LTTNG_OK) {
- ret = -ret_error_code;
goto error;
}
}
ret_error_code = kernel_create_channel_subdirectories(
session->kernel_session);
if (ret_error_code != LTTNG_OK) {
- ret = -ret_error_code;
goto error;
}
}
goto end_no_move;
}
-bool session_output_supports_trace_chunks(const struct ltt_session *session)
-{
- const struct consumer_output *output = session->kernel_session ?
- session->kernel_session->consumer :
- session->ust_session->consumer;
-
- if (output->type == CONSUMER_DST_LOCAL) {
- return true;
- } else {
- if (output->relay_major_version > 2) {
- return true;
- } else if (output->relay_major_version == 2 &&
- output->relay_minor_version >= 11) {
- return true;
- }
- }
- return false;
-}
-
struct lttng_trace_chunk *session_create_new_trace_chunk(
const struct ltt_session *session,
const struct consumer_output *consumer_output_override,
int session_close_trace_chunk(const struct ltt_session *session,
struct lttng_trace_chunk *trace_chunk,
- const enum lttng_trace_chunk_command_type *close_command)
+ const enum lttng_trace_chunk_command_type *close_command,
+ char *closed_trace_chunk_path)
{
int ret = 0;
bool error_occurred = false;
ret = consumer_close_trace_chunk(socket,
relayd_id,
session->id,
- trace_chunk);
+ trace_chunk, closed_trace_chunk_path);
pthread_mutex_unlock(socket->lock);
if (ret) {
ERR("Failed to close trace chunk on user space consumer");
ret = consumer_close_trace_chunk(socket,
relayd_id,
session->id,
- trace_chunk);
+ trace_chunk, closed_trace_chunk_path);
pthread_mutex_unlock(socket->lock);
if (ret) {
ERR("Failed to close trace chunk on kernel consumer");
DBG("Destroying session %s (id %" PRIu64 ")", session->name, session->id);
- consumer_output_put(session->consumer);
snapshot_destroy(&session->snapshot);
pthread_mutex_destroy(&session->lock);
}
session_notify_destruction(session);
+ consumer_output_put(session->consumer);
kernel_free_session(ksess);
session->kernel_session = NULL;
if (usess) {
}
lttng_dynamic_array_reset(&session->destroy_notifiers);
free(session->last_archived_chunk_name);
+ free(session->base_path);
free(session);
if (session_published) {
/*
* Session list lock must be held by the caller.
*/
enum lttng_error_code session_create(const char *name, uid_t uid, gid_t gid,
- struct ltt_session **out_session)
+ const char *base_path, struct ltt_session **out_session)
{
int ret;
enum lttng_error_code ret_code;
DEFAULT_SESSION_NAME, i,
datetime);
}
+ new_session->name_contains_creation_time = true;
if (ret == -1 || ret >= sizeof(new_session->name)) {
/*
* Null-terminate in case the name is used
}
}
+ if (base_path) {
+ new_session->base_path = strdup(base_path);
+ if (!new_session->base_path) {
+ ERR("Failed to allocate base path of session \"%s\"",
+ name);
+ ret_code = LTTNG_ERR_SESSION_FAIL;
+ goto error;
+ }
+ }
+
new_session->uid = uid;
new_session->gid = gid;
*
* Be careful of the result passed to this function. For instance,
* on failure to launch a rotation, a client will expect the rotation
- * state to be set to "NO_ROTATION". If an error occured while the
+ * state to be set to "NO_ROTATION". If an error occurred while the
* rotation was "ONGOING", result should be set to "ERROR", which will
* allow a client to report it.
*