X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fsession.c;h=56c38714fc6c6ccad7ef56b3a39820f34062d2ca;hp=0f62ab49fc4acccd824e78e8bbaad3a205583660;hb=a7333da73c2083281c5ec833d041b7acf0d10d0b;hpb=d88744a44aa5f2ca90ab87946692b9eed3120641 diff --git a/src/bin/lttng-sessiond/session.c b/src/bin/lttng-sessiond/session.c index 0f62ab49f..56c38714f 100644 --- a/src/bin/lttng-sessiond/session.c +++ b/src/bin/lttng-sessiond/session.c @@ -28,9 +28,12 @@ #include #include +#include #include "session.h" #include "utils.h" +#include "trace-ust.h" +#include "timer.h" /* * NOTES: @@ -133,6 +136,14 @@ void session_lock_list(void) pthread_mutex_lock(<t_session_list.lock); } +/* + * Try to acquire session list lock + */ +int session_trylock_list(void) +{ + return pthread_mutex_trylock(<t_session_list.lock); +} + /* * Release session list lock */ @@ -141,6 +152,116 @@ void session_unlock_list(void) pthread_mutex_unlock(<t_session_list.lock); } +/* + * Get the session's consumer destination type. + * + * The caller must hold the session lock. + */ +enum consumer_dst_type session_get_consumer_destination_type( + const struct ltt_session *session) +{ + /* + * The output information is duplicated in both of those session types. + * Hence, it doesn't matter from which it is retrieved. However, it is + * possible for only one of them to be set. + */ + return session->kernel_session ? + session->kernel_session->consumer->type : + session->ust_session->consumer->type; +} + +/* + * Get the session's consumer network hostname. + * The caller must ensure that the destination is of type "net". + * + * The caller must hold the session lock. + */ +const char *session_get_net_consumer_hostname(const struct ltt_session *session) +{ + const char *hostname = NULL; + const struct consumer_output *output; + + output = session->kernel_session ? + session->kernel_session->consumer : + session->ust_session->consumer; + + /* + * hostname is assumed to be the same for both control and data + * connections. + */ + switch (output->dst.net.control.dtype) { + case LTTNG_DST_IPV4: + hostname = output->dst.net.control.dst.ipv4; + break; + case LTTNG_DST_IPV6: + hostname = output->dst.net.control.dst.ipv6; + break; + default: + abort(); + } + return hostname; +} + +/* + * Get the session's consumer network control and data ports. + * The caller must ensure that the destination is of type "net". + * + * The caller must hold the session lock. + */ +void session_get_net_consumer_ports(const struct ltt_session *session, + uint16_t *control_port, uint16_t *data_port) +{ + const struct consumer_output *output; + + output = session->kernel_session ? + session->kernel_session->consumer : + session->ust_session->consumer; + *control_port = output->dst.net.control.port; + *data_port = output->dst.net.data.port; +} + +/* + * Get the location of the latest trace archive produced by a rotation. + * + * The caller must hold the session lock. + */ +struct lttng_trace_archive_location *session_get_trace_archive_location( + struct ltt_session *session) +{ + struct lttng_trace_archive_location *location = NULL; + + if (session->rotation_state != LTTNG_ROTATION_STATE_COMPLETED) { + goto end; + } + + switch (session_get_consumer_destination_type(session)) { + case CONSUMER_DST_LOCAL: + location = lttng_trace_archive_location_local_create( + session->rotation_chunk.current_rotate_path); + break; + case CONSUMER_DST_NET: + { + const char *hostname; + uint16_t control_port, data_port; + + hostname = session_get_net_consumer_hostname(session); + session_get_net_consumer_ports(session, + &control_port, + &data_port); + location = lttng_trace_archive_location_relay_create( + hostname, + LTTNG_TRACE_ARCHIVE_LOCATION_RELAY_PROTOCOL_TYPE_TCP, + control_port, data_port, + session->rotation_chunk.current_rotate_path); + break; + } + default: + abort(); + } +end: + return location; +} + /* * Allocate the ltt_sessions_ht_by_id HT. * @@ -400,9 +521,12 @@ int session_create(char *name, uid_t uid, gid_t gid) goto error; } - new_session->rotate_pending = false; - new_session->rotate_pending_relay = false; - new_session->rotate_relay_pending_timer_enabled = false; + new_session->rotation_pending_local = false; + new_session->rotation_pending_relay = false; + new_session->rotation_state = LTTNG_ROTATION_STATE_NO_ROTATION; + + new_session->rotation_pending_check_timer_enabled = false; + new_session->rotation_schedule_timer_enabled = false; /* Add new session to the session list */ session_lock_list();