X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-relayd%2Fmain.c;h=c7760cca45b67feaac6f7e50b0edb03d7d74e72d;hb=23c8ff5013f1e8c132cab7845ca608dbed4fca7f;hp=1e2e9050fef2d6d77ca78e9767a2fea759ba99be;hpb=c6db3843828a8fbf08444a2bc4191291a4807936;p=lttng-tools.git diff --git a/src/bin/lttng-relayd/main.c b/src/bin/lttng-relayd/main.c index 1e2e9050f..c7760cca4 100644 --- a/src/bin/lttng-relayd/main.c +++ b/src/bin/lttng-relayd/main.c @@ -74,6 +74,7 @@ #include "connection.h" #include "tracefile-array.h" #include "tcp_keep_alive.h" +#include "sessiond-trace-chunks.h" static const char *help_msg = #ifdef LTTNG_EMBED_HELP @@ -85,7 +86,7 @@ NULL enum relay_connection_status { RELAY_CONNECTION_STATUS_OK, - /* An error occured while processing an event on the connection. */ + /* An error occurred while processing an event on the connection. */ RELAY_CONNECTION_STATUS_ERROR, /* Connection closed/shutdown cleanly. */ RELAY_CONNECTION_STATUS_CLOSED, @@ -167,6 +168,8 @@ struct lttng_ht *sessions_ht; /* Relayd health monitoring */ struct health_app *health_relayd; +struct sessiond_trace_chunk_registry *sessiond_trace_chunk_registry; + static struct option long_options[] = { { "control-port", 1, 0, 'C', }, { "data-port", 1, 0, 'D', }, @@ -858,14 +861,6 @@ restart: revents = LTTNG_POLL_GETEV(&events, i); pollfd = LTTNG_POLL_GETFD(&events, i); - if (!revents) { - /* - * No activity for this FD (poll - * implementation). - */ - continue; - } - /* Thread quit pipe has been closed. Killing thread. */ ret = check_thread_quit_pipe(pollfd, revents); if (ret) { @@ -1099,12 +1094,14 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr, { int ret = 0; ssize_t send_ret; - struct relay_session *session; + struct relay_session *session = NULL; struct lttcomm_relayd_status_session reply; char session_name[LTTNG_NAME_MAX]; char hostname[LTTNG_HOST_NAME_MAX]; uint32_t live_timer = 0; bool snapshot = false; + /* Left nil for peers < 2.11. */ + lttng_uuid sessiond_uuid = {}; memset(session_name, 0, LTTNG_NAME_MAX); memset(hostname, 0, LTTNG_HOST_NAME_MAX); @@ -1121,7 +1118,14 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr, } else { /* From 2.11 to ... */ ret = cmd_create_session_2_11(payload, session_name, - hostname, &live_timer, &snapshot); + hostname, &live_timer, &snapshot, + sessiond_uuid); + if (lttng_uuid_is_nil(sessiond_uuid)) { + /* The nil UUID is reserved for pre-2.11 clients. */ + ERR("Illegal nil UUID announced by peer in create session command"); + ret = -1; + goto send_reply; + } } if (ret < 0) { @@ -1129,7 +1133,7 @@ static int relay_create_session(const struct lttcomm_relayd_hdr *recv_hdr, } session = session_create(session_name, hostname, live_timer, - snapshot, conn->major, conn->minor); + snapshot, sessiond_uuid, conn->major, conn->minor); if (!session) { ret = -1; goto send_reply; @@ -1153,7 +1157,9 @@ send_reply: send_ret); ret = -1; } - + if (ret < 0 && session) { + session_put(session); + } return ret; } @@ -1640,7 +1646,7 @@ int rotate_truncate_stream(struct relay_stream *stream) /* * Rewind the current tracefile to the position at which the rotation - * should have occured. + * should have occurred. */ lseek_ret = lseek(stream->stream_fd->fd, stream->pos_after_last_complete_data_index, SEEK_SET); @@ -2973,7 +2979,7 @@ int relay_rotate_pending(const struct lttcomm_relayd_hdr *recv_hdr, rotate_pending = true; DBG("Stream %" PRIu64 " is still rotating", stream->stream_handle); - } else if (stream->current_chunk_id.value < chunk_id) { + } else if (stream->current_chunk_id.value <= chunk_id) { /* * Stream closed on the consumer but still active on the * relay. @@ -3811,14 +3817,6 @@ restart: health_code_update(); - if (!revents) { - /* - * No activity for this FD (poll - * implementation). - */ - continue; - } - /* Thread quit pipe has been closed. Killing thread. */ ret = check_thread_quit_pipe(pollfd, revents); if (ret) { @@ -4130,6 +4128,13 @@ int main(int argc, char **argv) } } + sessiond_trace_chunk_registry = sessiond_trace_chunk_registry_create(); + if (!sessiond_trace_chunk_registry) { + ERR("Failed to initialize session daemon trace chunk registry"); + retval = -1; + goto exit_sessiond_trace_chunk_registry; + } + /* Initialize thread health monitoring */ health_relayd = health_app_create(NR_HEALTH_RELAYD_TYPES); if (!health_relayd) { @@ -4279,7 +4284,9 @@ exit_health_quit_pipe: exit_init_data: health_app_destroy(health_relayd); + sessiond_trace_chunk_registry_destroy(sessiond_trace_chunk_registry); exit_health_app_create: +exit_sessiond_trace_chunk_registry: exit_options: /* * Wait for all pending call_rcu work to complete before tearing