X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsession.c;h=20edd47e4c707a109b350795c0eb1d725406b7bf;hp=61cbb0c1af2f3e10abed78c1394de238706597dd;hb=348a81dcf7b6944b10a813d93dcaf86fdb5194f6;hpb=e5add6d004793894ef4c7e047bc0f8885763b205 diff --git a/src/bin/lttng-sessiond/session.c b/src/bin/lttng-sessiond/session.c index 61cbb0c1a..20edd47e4 100644 --- a/src/bin/lttng-sessiond/session.c +++ b/src/bin/lttng-sessiond/session.c @@ -565,21 +565,11 @@ error: } static -bool output_supports_trace_chunks(const struct ltt_session *session) +bool output_supports_trace_chunks(const struct consumer_output *output) { - if (session->consumer->type == CONSUMER_DST_LOCAL) { + if (output->type == CONSUMER_DST_LOCAL) { return true; } else { - struct consumer_output *output; - - if (session->ust_session) { - output = session->ust_session->consumer; - } else if (session->kernel_session) { - output = session->kernel_session->consumer; - } else { - abort(); - } - if (output->relay_major_version > 2) { return true; } else if (output->relay_major_version == 2 && @@ -591,7 +581,8 @@ bool output_supports_trace_chunks(const struct ltt_session *session) } struct lttng_trace_chunk *session_create_new_trace_chunk( - struct ltt_session *session, + const struct ltt_session *session, + const struct consumer_output *consumer_output_override, const char *session_base_path_override, const char *chunk_name_override) { @@ -599,16 +590,28 @@ struct lttng_trace_chunk *session_create_new_trace_chunk( struct lttng_trace_chunk *trace_chunk = NULL; enum lttng_trace_chunk_status chunk_status; const time_t chunk_creation_ts = time(NULL); - const bool is_local_trace = - session->consumer->type == CONSUMER_DST_LOCAL; - const char *base_path = session_base_path_override ? : - session_get_base_path(session); + bool is_local_trace; + const char *base_path; struct lttng_directory_handle session_output_directory; const struct lttng_credentials session_credentials = { .uid = session->uid, .gid = session->gid, }; uint64_t next_chunk_id; + const struct consumer_output *output; + + if (consumer_output_override) { + output = consumer_output_override; + } else { + assert(session->ust_session || session->kernel_session); + output = session->ust_session ? + session->ust_session->consumer : + session->kernel_session->consumer; + } + + is_local_trace = output->type == CONSUMER_DST_LOCAL; + base_path = session_base_path_override ? : + consumer_output_get_base_path(output); if (chunk_creation_ts == (time_t) -1) { PERROR("Failed to sample time while creation session \"%s\" trace chunk", @@ -616,7 +619,7 @@ struct lttng_trace_chunk *session_create_new_trace_chunk( goto error; } - if (!output_supports_trace_chunks(session)) { + if (!output_supports_trace_chunks(output)) { goto end; } next_chunk_id = session->most_recent_chunk_id.is_set ? @@ -677,7 +680,8 @@ error: } int session_close_trace_chunk(const struct ltt_session *session, - struct lttng_trace_chunk *trace_chunk) + struct lttng_trace_chunk *trace_chunk, + const enum lttng_trace_chunk_command_type *close_command) { int ret = 0; bool error_occurred = false; @@ -686,6 +690,15 @@ int session_close_trace_chunk(const struct ltt_session *session, enum lttng_trace_chunk_status chunk_status; const time_t chunk_close_timestamp = time(NULL); + if (close_command) { + chunk_status = lttng_trace_chunk_set_close_command( + trace_chunk, *close_command); + if (chunk_status != LTTNG_TRACE_CHUNK_STATUS_OK) { + ret = -1; + goto end; + } + } + if (chunk_close_timestamp == (time_t) -1) { ERR("Failed to sample the close timestamp of the current trace chunk of session \"%s\"", session->name); @@ -784,7 +797,7 @@ void session_release(struct urcu_ref *ref) session_notify_destruction(session); lttng_dynamic_array_reset(&session->destroy_notifiers); if (session->current_trace_chunk) { - ret = session_close_trace_chunk(session, session->current_trace_chunk); + ret = session_close_trace_chunk(session, session->current_trace_chunk, NULL); if (ret) { ERR("Failed to close the current trace chunk of session \"%s\" during its release", session->name);