X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fsession.c;fp=src%2Fbin%2Flttng-relayd%2Fsession.c;h=05a1dc215f6d01d070a416cdb2ec483f314072d0;hp=2f65848a9cedc2ed18bd56a630541b6922db8905;hb=a8b66566890a353cc3a89836281541195ad69d73;hpb=a70ac2f49aa47a30abc2b50ec57b582eab4b1028 diff --git a/src/bin/lttng-relayd/session.c b/src/bin/lttng-relayd/session.c index 2f65848a9..05a1dc215 100644 --- a/src/bin/lttng-relayd/session.c +++ b/src/bin/lttng-relayd/session.c @@ -19,8 +19,9 @@ #define _LGPL_SOURCE #include -#include #include +#include +#include #include #include @@ -37,7 +38,7 @@ static uint64_t last_relay_session_id; static pthread_mutex_t last_relay_session_id_lock = PTHREAD_MUTEX_INITIALIZER; -static int init_session_output_path(struct relay_session *session) +static int init_session_output_path_group_by_host(struct relay_session *session) { /* * session_directory: @@ -71,38 +72,18 @@ static int init_session_output_path(struct relay_session *session) ret = asprintf(&session_directory, "%s/%s", session->hostname, session->session_name); } else { - char session_creation_datetime[16]; - size_t strftime_ret; - struct tm *timeinfo; - time_t creation_time; + char session_creation_datetime[DATETIME_STR_LEN]; - /* - * The 2.11+ protocol guarantees that a creation time - * is provided for a session. This would indicate a - * protocol error or an improper use of this util. - */ - if (!session->creation_time.is_set) { - ERR("Creation time missing for session \"%s\" (protocol error)", - session->session_name); - ret = -1; - goto end; - } - creation_time = LTTNG_OPTIONAL_GET(session->creation_time); - - timeinfo = localtime(&creation_time); - if (!timeinfo) { - ERR("Failed to get timeinfo while initializing session output directory handle"); - ret = -1; - goto end; - } - strftime_ret = strftime(session_creation_datetime, - sizeof(session_creation_datetime), - "%Y%m%d-%H%M%S", timeinfo); - if (strftime_ret == 0) { + ret = time_to_datetime_str( + LTTNG_OPTIONAL_GET(session->creation_time), + session_creation_datetime, + sizeof(session_creation_datetime)); + if (ret) { ERR("Failed to format session creation timestamp while initializing session output directory handle"); ret = -1; goto end; } + ret = asprintf(&session_directory, "%s/%s-%s", session->hostname, session->session_name, session_creation_datetime); @@ -125,6 +106,79 @@ end: return ret; } +static int init_session_output_path_group_by_session( + struct relay_session *session) +{ + /* + * session_directory: + * + * session_name/hostname-creation_time/base_path + * + * For session name including the datetime, use it as the complete name + * since. Do not perform modification on it since the datetime is an + * integral part of the name and how a user identify a session. + */ + int ret = 0; + char *session_directory = NULL; + char creation_datetime[DATETIME_STR_LEN]; + + if (session->output_path[0] != '\0') { + /* output_path as been generated already */ + goto end; + } + + ret = time_to_datetime_str(LTTNG_OPTIONAL_GET(session->creation_time), + creation_datetime, sizeof(creation_datetime)); + if (ret) { + ERR("Failed to format session creation timestamp while initializing session output directory handle"); + ret = -1; + goto end; + } + + ret = asprintf(&session_directory, "%s/%s-%s%s%s", + session->session_name, session->hostname, + creation_datetime, + session->base_path[0] != '\0' ? "/" : "", + session->base_path); + if (ret < 0) { + PERROR("Failed to format session directory name"); + goto end; + } + + if (strlen(session_directory) >= LTTNG_PATH_MAX) { + ERR("Session output directory exceeds maximal length"); + ret = -1; + goto end; + } + + strcpy(session->output_path, session_directory); + ret = 0; + +end: + free(session_directory); + return ret; +} + +static int init_session_output_path(struct relay_session *session) +{ + int ret; + + switch (opt_group_output_by) { + case RELAYD_GROUP_OUTPUT_BY_HOST: + ret = init_session_output_path_group_by_host(session); + break; + case RELAYD_GROUP_OUTPUT_BY_SESSION: + ret = init_session_output_path_group_by_session(session); + break; + case RELAYD_GROUP_OUTPUT_BY_UNKNOWN: + default: + abort(); + break; + } + + return ret; +} + static int session_set_anonymous_chunk(struct relay_session *session) { int ret = 0;