X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fsession.c;h=0a535cf877b581945260266f117cab69071f751d;hb=a0377dfefe40662ba7d68617bce6ff467114136c;hp=5d5aa4c643d8e0d289fd9499d177277fdd068c81;hpb=7145f5e9af16907c65a514fe9112e99564cf6333;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/session.c b/src/bin/lttng-relayd/session.c index 5d5aa4c64..0a535cf87 100644 --- a/src/bin/lttng-relayd/session.c +++ b/src/bin/lttng-relayd/session.c @@ -1,29 +1,19 @@ /* - * Copyright (C) 2013 - Julien Desfossez - * David Goulet - * 2015 - Mathieu Desnoyers + * Copyright (C) 2013 Julien Desfossez + * Copyright (C) 2013 David Goulet + * Copyright (C) 2015 Mathieu Desnoyers * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License, version 2 only, as - * published by the Free Software Foundation. + * SPDX-License-Identifier: GPL-2.0-only * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 51 - * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #define _LGPL_SOURCE #include -#include +#include +#include #include #include #include -#include #include #include @@ -206,7 +196,7 @@ static struct lttng_directory_handle *session_create_output_directory_handle( goto end; } - handle = lttng_directory_handle_create(full_session_path); + handle = fd_tracker_create_directory_handle(the_fd_tracker, full_session_path); end: pthread_mutex_unlock(&session->lock); free(full_session_path); @@ -230,6 +220,7 @@ static int session_set_anonymous_chunk(struct relay_session *session) goto end; } + lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker); status = lttng_trace_chunk_set_credentials_current_user(chunk); if (status != LTTNG_TRACE_CHUNK_STATUS_OK) { ret = -1; @@ -242,8 +233,6 @@ static int session_set_anonymous_chunk(struct relay_session *session) goto end; } - lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker); - output_directory = NULL; session->current_trace_chunk = chunk; chunk = NULL; end: @@ -303,9 +292,9 @@ struct relay_session *session_create(const char *session_name, int ret; struct relay_session *session = NULL; - assert(session_name); - assert(hostname); - assert(base_path); + LTTNG_ASSERT(session_name); + LTTNG_ASSERT(hostname); + LTTNG_ASSERT(base_path); if (!is_name_path_safe(session_name)) { ERR("Refusing to create session as the provided session name is not path-safe"); @@ -326,9 +315,20 @@ struct relay_session *session_create(const char *session_name, PERROR("Failed to allocate session"); goto error; } + + pthread_mutex_lock(&last_relay_session_id_lock); + session->id = ++last_relay_session_id; + pthread_mutex_unlock(&last_relay_session_id_lock); + + lttng_ht_node_init_u64(&session->session_n, session->id); + urcu_ref_init(&session->ref); + CDS_INIT_LIST_HEAD(&session->recv_list); + pthread_mutex_init(&session->lock, NULL); + pthread_mutex_init(&session->recv_list_lock, NULL); + if (lttng_strncpy(session->session_name, session_name, sizeof(session->session_name))) { - WARN("Session name exceeds maximal allowed length"); + WARN("Session name exceeds maximal allowed length"); goto error; } if (lttng_strncpy(session->hostname, hostname, @@ -343,6 +343,12 @@ struct relay_session *session_create(const char *session_name, } if (creation_time) { LTTNG_OPTIONAL_SET(&session->creation_time, *creation_time); + } else { + LTTNG_OPTIONAL_SET(&session->creation_time, time(NULL)); + if (session->creation_time.value == (time_t) -1) { + PERROR("Failed to sample session creation time"); + goto error; + } } session->session_name_contains_creation_time = session_name_contains_creation_time; @@ -352,17 +358,8 @@ struct relay_session *session_create(const char *session_name, goto error; } - pthread_mutex_lock(&last_relay_session_id_lock); - session->id = ++last_relay_session_id; - pthread_mutex_unlock(&last_relay_session_id_lock); - session->major = major; session->minor = minor; - lttng_ht_node_init_u64(&session->session_n, session->id); - urcu_ref_init(&session->ref); - CDS_INIT_LIST_HEAD(&session->recv_list); - pthread_mutex_init(&session->lock, NULL); - pthread_mutex_init(&session->recv_list_lock, NULL); session->live_timer = live_timer; session->snapshot = snapshot; @@ -397,14 +394,14 @@ struct relay_session *session_create(const char *session_name, session->id_sessiond.value, *current_chunk_id); if (!session->current_trace_chunk) { - char uuid_str[LTTNG_UUID_STR_LEN]; + char uuid_str[LTTNG_UUID_STR_LEN]; lttng_uuid_to_str(sessiond_uuid, uuid_str); ERR("Could not find trace chunk: sessiond = {%s}, sessiond session id = %" PRIu64 ", trace chunk id = %" PRIu64, uuid_str, *id_sessiond, *current_chunk_id); goto error; - } + } chunk_status = lttng_trace_chunk_get_session_output_directory_handle( session->current_trace_chunk, @@ -413,7 +410,7 @@ struct relay_session *session_create(const char *session_name, goto error; } - assert(session_output_directory); + LTTNG_ASSERT(session_output_directory); session->output_directory = session_output_directory; } else if (!id_sessiond) { /* @@ -512,14 +509,14 @@ static void destroy_session(struct relay_session *session) int ret; ret = session_delete(session); - assert(!ret); + LTTNG_ASSERT(!ret); lttng_trace_chunk_put(session->current_trace_chunk); session->current_trace_chunk = NULL; lttng_trace_chunk_put(session->pending_closure_trace_chunk); session->pending_closure_trace_chunk = NULL; ret = sessiond_trace_chunk_registry_session_destroyed( sessiond_trace_chunk_registry, session->sessiond_uuid); - assert(!ret); + LTTNG_ASSERT(!ret); lttng_directory_handle_put(session->output_directory); session->output_directory = NULL; call_rcu(&session->rcu_node, rcu_destroy_session);