X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fsession.c;h=31f27184f5e1abeefb0908dcb330b23d138b9c09;hp=c4a62c986946ac09f73fe66108b060b534915ff3;hb=ecd1a12fac39784bded85c0f06e47ace2dc98cde;hpb=070b6a86970c981e8f79cbd3dc199008b25cc0dc diff --git a/src/bin/lttng-relayd/session.c b/src/bin/lttng-relayd/session.c index c4a62c986..31f27184f 100644 --- a/src/bin/lttng-relayd/session.c +++ b/src/bin/lttng-relayd/session.c @@ -34,6 +34,94 @@ 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) +{ + /* + * session_directory: + * + * if base_path is \0' + * hostname/session_name + * else + * hostname/base_path + */ + char *session_directory = NULL; + int ret = 0; + + if (session->output_path[0] != '\0') { + goto end; + } + /* + * If base path is set, it overrides the session name for the + * session relative base path. No timestamp is appended if the + * base path is overridden. + * + * If the session name already contains the creation time (e.g. + * auto-, don't append yet another timestamp after + * the session name in the generated path. + * + * Otherwise, generate the path with session_name-. + */ + if (session->base_path[0] != '\0') { + ret = asprintf(&session_directory, "%s/%s", session->hostname, + session->base_path); + } else if (session->session_name_contains_creation_time) { + 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; + + /* + * 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) { + 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); + } + 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 session_set_anonymous_chunk(struct relay_session *session) { int ret = 0; @@ -183,6 +271,10 @@ struct relay_session *session_create(const char *session_name, LTTNG_OPTIONAL_SET(&session->id_sessiond, *id_sessiond); } + ret = init_session_output_path(session); + if (ret) { + goto error; + } ret = sessiond_trace_chunk_registry_session_created( sessiond_trace_chunk_registry, sessiond_uuid); if (ret) {