X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fconsumer.c;h=a856f030efe63c3553c820d96012b065e9817e8b;hp=8730e39fbbda7db3fda89758cbd8b5f01385f9f7;hb=38476d240b5de15dea9b9bd1c8691f64cd1c69be;hpb=886224ffff69ab7b9fb772bc7c8bedc7982e8f40 diff --git a/src/common/consumer.c b/src/common/consumer.c index 8730e39fb..a856f030e 100644 --- a/src/common/consumer.c +++ b/src/common/consumer.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -49,12 +50,14 @@ struct lttng_consumer_global_data consumer_data = { enum consumer_channel_action { CONSUMER_CHANNEL_ADD, + CONSUMER_CHANNEL_DEL, CONSUMER_CHANNEL_QUIT, }; struct consumer_channel_msg { enum consumer_channel_action action; - struct lttng_consumer_channel *chan; + struct lttng_consumer_channel *chan; /* add */ + uint64_t key; /* del */ }; /* @@ -74,36 +77,46 @@ static struct lttng_ht *metadata_ht; static struct lttng_ht *data_ht; /* - * Notify a thread pipe to poll back again. This usually means that some global - * state has changed so we just send back the thread in a poll wait call. + * Notify a thread lttng pipe to poll back again. This usually means that some + * global state has changed so we just send back the thread in a poll wait + * call. */ -static void notify_thread_pipe(int wpipe) +static void notify_thread_lttng_pipe(struct lttng_pipe *pipe) { - int ret; + struct lttng_consumer_stream *null_stream = NULL; - do { - struct lttng_consumer_stream *null_stream = NULL; + assert(pipe); - ret = write(wpipe, &null_stream, sizeof(null_stream)); - } while (ret < 0 && errno == EINTR); + (void) lttng_pipe_write(pipe, &null_stream, sizeof(null_stream)); } static void notify_channel_pipe(struct lttng_consumer_local_data *ctx, struct lttng_consumer_channel *chan, + uint64_t key, enum consumer_channel_action action) { struct consumer_channel_msg msg; int ret; + memset(&msg, 0, sizeof(msg)); + msg.action = action; msg.chan = chan; + msg.key = key; do { ret = write(ctx->consumer_channel_pipe[1], &msg, sizeof(msg)); } while (ret < 0 && errno == EINTR); } +void notify_thread_del_channel(struct lttng_consumer_local_data *ctx, + uint64_t key) +{ + notify_channel_pipe(ctx, NULL, key, CONSUMER_CHANNEL_DEL); +} + static int read_channel_pipe(struct lttng_consumer_local_data *ctx, struct lttng_consumer_channel **chan, + uint64_t *key, enum consumer_channel_action *action) { struct consumer_channel_msg msg; @@ -115,6 +128,7 @@ static int read_channel_pipe(struct lttng_consumer_local_data *ctx, if (ret > 0) { *action = msg.action; *chan = msg.chan; + *key = msg.key; } return ret; } @@ -318,9 +332,9 @@ static void cleanup_relayd_ht(void) destroy_relayd(relayd); } - lttng_ht_destroy(consumer_data.relayd_ht); - rcu_read_unlock(); + + lttng_ht_destroy(consumer_data.relayd_ht); } /* @@ -394,8 +408,8 @@ static void cleanup_relayd(struct consumer_relayd_sock_pair *relayd, * read of this status which happens AFTER receiving this notify. */ if (ctx) { - notify_thread_pipe(ctx->consumer_data_pipe[1]); - notify_thread_pipe(ctx->consumer_metadata_pipe[1]); + notify_thread_lttng_pipe(ctx->consumer_data_pipe); + notify_thread_lttng_pipe(ctx->consumer_metadata_pipe); } } @@ -450,6 +464,13 @@ void consumer_del_stream(struct lttng_consumer_stream *stream, PERROR("munmap"); } } + + if (stream->wait_fd >= 0) { + ret = close(stream->wait_fd); + if (ret) { + PERROR("close"); + } + } break; case LTTNG_CONSUMER32_UST: case LTTNG_CONSUMER64_UST: @@ -515,8 +536,7 @@ void consumer_del_stream(struct lttng_consumer_stream *stream, } rcu_read_unlock(); - uatomic_dec(&stream->chan->refcount); - if (!uatomic_read(&stream->chan->refcount) + if (!uatomic_sub_return(&stream->chan->refcount, 1) && !uatomic_read(&stream->chan->nb_init_stream_left)) { free_chan = stream->chan; } @@ -647,9 +667,6 @@ static int add_stream(struct lttng_consumer_stream *stream, uatomic_inc(&relayd->refcount); } - /* Update channel refcount once added without error(s). */ - uatomic_inc(&stream->chan->refcount); - /* * When nb_init_stream_left reaches 0, we don't need to trigger any action * in terms of destroying the associated channel, because the action that @@ -658,6 +675,8 @@ static int add_stream(struct lttng_consumer_stream *stream, * stream. */ if (uatomic_read(&stream->chan->nb_init_stream_left) > 0) { + /* Increment refcount before decrementing nb_init_stream_left */ + cmm_smp_wmb(); uatomic_dec(&stream->chan->nb_init_stream_left); } @@ -718,6 +737,8 @@ struct consumer_relayd_sock_pair *consumer_allocate_relayd_sock_pair( obj->net_seq_idx = net_seq_idx; obj->refcount = 0; obj->destroy_flag = 0; + obj->control_sock.sock.fd = -1; + obj->data_sock.sock.fd = -1; lttng_ht_node_init_u64(&obj->node, obj->net_seq_idx); pthread_mutex_init(&obj->ctrl_sock_mutex, NULL); @@ -782,7 +803,7 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream, } /* Metadata are always sent on the control socket. */ - outfd = relayd->control_sock.fd; + outfd = relayd->control_sock.sock.fd; } else { /* Set header with stream information */ data_hdr.stream_id = htobe64(stream->relayd_stream_id); @@ -807,7 +828,7 @@ static int write_relayd_stream_header(struct lttng_consumer_stream *stream, ++stream->next_net_seq_num; /* Set to go on data socket */ - outfd = relayd->data_sock.fd; + outfd = relayd->data_sock.sock.fd; } error: @@ -827,7 +848,9 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key, uid_t uid, gid_t gid, int relayd_id, - enum lttng_event_output output) + enum lttng_event_output output, + uint64_t tracefile_size, + uint64_t tracefile_count) { struct lttng_consumer_channel *channel; @@ -844,6 +867,8 @@ struct lttng_consumer_channel *consumer_allocate_channel(uint64_t key, channel->gid = gid; channel->relayd_id = relayd_id; channel->output = output; + channel->tracefile_size = tracefile_size; + channel->tracefile_count = tracefile_count; strncpy(channel->pathname, pathname, sizeof(channel->pathname)); channel->pathname[sizeof(channel->pathname) - 1] = '\0'; @@ -876,14 +901,13 @@ int consumer_add_channel(struct lttng_consumer_channel *channel, pthread_mutex_lock(&consumer_data.lock); rcu_read_lock(); - lttng_ht_lookup(consumer_data.channel_ht, - &channel->key, &iter); + lttng_ht_lookup(consumer_data.channel_ht, &channel->key, &iter); node = lttng_ht_iter_get_node_u64(&iter); if (node != NULL) { /* Channel already exist. Ignore the insertion */ ERR("Consumer add channel key %" PRIu64 " already exists!", channel->key); - ret = -1; + ret = LTTNG_ERR_KERN_CHAN_EXIST; goto end; } @@ -895,7 +919,7 @@ end: if (!ret && channel->wait_fd != -1 && channel->metadata_stream == NULL) { - notify_channel_pipe(ctx, channel, CONSUMER_CHANNEL_ADD); + notify_channel_pipe(ctx, channel, -1, CONSUMER_CHANNEL_ADD); } return ret; } @@ -936,7 +960,12 @@ static int update_poll_array(struct lttng_consumer_local_data *ctx, stream->endpoint_status == CONSUMER_ENDPOINT_INACTIVE) { continue; } - DBG("Active FD %d", stream->wait_fd); + /* + * This clobbers way too much the debug output. Uncomment that if you + * need it for debugging purposes. + * + * DBG("Active FD %d", stream->wait_fd); + */ (*pollfd)[i].fd = stream->wait_fd; (*pollfd)[i].events = POLLIN | POLLPRI; local_stream[i] = stream; @@ -948,7 +977,7 @@ static int update_poll_array(struct lttng_consumer_local_data *ctx, * Insert the consumer_data_pipe at the end of the array and don't * increment i so nb_fd is the number of real FD. */ - (*pollfd)[i].fd = ctx->consumer_data_pipe[0]; + (*pollfd)[i].fd = lttng_pipe_get_readfd(ctx->consumer_data_pipe); (*pollfd)[i].events = POLLIN | POLLPRI; return i; } @@ -1137,32 +1166,18 @@ struct lttng_consumer_local_data *lttng_consumer_create( } ctx->consumer_error_socket = -1; + ctx->consumer_metadata_socket = -1; /* assign the callbacks */ ctx->on_buffer_ready = buffer_ready; ctx->on_recv_channel = recv_channel; ctx->on_recv_stream = recv_stream; ctx->on_update_stream = update_stream; - ret = pipe(ctx->consumer_data_pipe); - if (ret < 0) { - PERROR("Error creating poll pipe"); + ctx->consumer_data_pipe = lttng_pipe_open(0); + if (!ctx->consumer_data_pipe) { goto error_poll_pipe; } - /* set read end of the pipe to non-blocking */ - ret = fcntl(ctx->consumer_data_pipe[0], F_SETFL, O_NONBLOCK); - if (ret < 0) { - PERROR("fcntl O_NONBLOCK"); - goto error_poll_fcntl; - } - - /* set write end of the pipe to non-blocking */ - ret = fcntl(ctx->consumer_data_pipe[1], F_SETFL, O_NONBLOCK); - if (ret < 0) { - PERROR("fcntl O_NONBLOCK"); - goto error_poll_fcntl; - } - ret = pipe(ctx->consumer_should_quit); if (ret < 0) { PERROR("Error creating recv pipe"); @@ -1181,8 +1196,8 @@ struct lttng_consumer_local_data *lttng_consumer_create( goto error_channel_pipe; } - ret = utils_create_pipe(ctx->consumer_metadata_pipe); - if (ret < 0) { + ctx->consumer_metadata_pipe = lttng_pipe_open(0); + if (!ctx->consumer_metadata_pipe) { goto error_metadata_pipe; } @@ -1194,16 +1209,15 @@ struct lttng_consumer_local_data *lttng_consumer_create( return ctx; error_splice_pipe: - utils_close_pipe(ctx->consumer_metadata_pipe); + lttng_pipe_destroy(ctx->consumer_metadata_pipe); error_metadata_pipe: utils_close_pipe(ctx->consumer_channel_pipe); error_channel_pipe: utils_close_pipe(ctx->consumer_thread_pipe); error_thread_pipe: utils_close_pipe(ctx->consumer_should_quit); -error_poll_fcntl: error_quit_pipe: - utils_close_pipe(ctx->consumer_data_pipe); + lttng_pipe_destroy(ctx->consumer_data_pipe); error_poll_pipe: free(ctx); error: @@ -1223,9 +1237,14 @@ void lttng_consumer_destroy(struct lttng_consumer_local_data *ctx) if (ret) { PERROR("close"); } + ret = close(ctx->consumer_metadata_socket); + if (ret) { + PERROR("close"); + } utils_close_pipe(ctx->consumer_thread_pipe); utils_close_pipe(ctx->consumer_channel_pipe); - utils_close_pipe(ctx->consumer_data_pipe); + lttng_pipe_destroy(ctx->consumer_data_pipe); + lttng_pipe_destroy(ctx->consumer_metadata_pipe); utils_close_pipe(ctx->consumer_should_quit); utils_close_pipe(ctx->consumer_splice_metadata_pipe); @@ -1324,6 +1343,7 @@ ssize_t lttng_consumer_on_read_subbuffer_mmap( goto end; } ret = lttng_ustctl_get_mmap_read_offset(stream, &mmap_offset); + break; default: ERR("Unknown consumer_data type"); @@ -1379,6 +1399,26 @@ ssize_t lttng_consumer_on_read_subbuffer_mmap( } else { /* No streaming, we have to set the len with the full padding */ len += padding; + + /* + * Check if we need to change the tracefile before writing the packet. + */ + if (stream->chan->tracefile_size > 0 && + (stream->tracefile_size_current + len) > + stream->chan->tracefile_size) { + ret = utils_rotate_stream_file(stream->chan->pathname, + stream->name, stream->chan->tracefile_size, + stream->chan->tracefile_count, stream->uid, stream->gid, + stream->out_fd, &(stream->tracefile_count_current)); + if (ret < 0) { + ERR("Rotating output file"); + goto end; + } + outfd = stream->out_fd = ret; + /* Reset current size because we just perform a rotation. */ + stream->tracefile_size_current = 0; + } + stream->tracefile_size_current += len; } while (len > 0) { @@ -1541,6 +1581,26 @@ ssize_t lttng_consumer_on_read_subbuffer_splice( } else { /* No streaming, we have to set the len with the full padding */ len += padding; + + /* + * Check if we need to change the tracefile before writing the packet. + */ + if (stream->chan->tracefile_size > 0 && + (stream->tracefile_size_current + len) > + stream->chan->tracefile_size) { + ret = utils_rotate_stream_file(stream->chan->pathname, + stream->name, stream->chan->tracefile_size, + stream->chan->tracefile_count, stream->uid, stream->gid, + stream->out_fd, &(stream->tracefile_count_current)); + if (ret < 0) { + ERR("Rotating output file"); + goto end; + } + outfd = stream->out_fd = ret; + /* Reset current size because we just perform a rotation. */ + stream->tracefile_size_current = 0; + } + stream->tracefile_size_current += len; } while (len > 0) { @@ -1824,6 +1884,13 @@ void consumer_del_metadata_stream(struct lttng_consumer_stream *stream, PERROR("munmap metadata stream"); } } + + if (stream->wait_fd >= 0) { + ret = close(stream->wait_fd); + if (ret < 0) { + PERROR("close kernel metadata wait_fd"); + } + } break; case LTTNG_CONSUMER32_UST: case LTTNG_CONSUMER64_UST: @@ -1886,14 +1953,20 @@ void consumer_del_metadata_stream(struct lttng_consumer_stream *stream, rcu_read_unlock(); /* Atomically decrement channel refcount since other threads can use it. */ - uatomic_dec(&stream->chan->refcount); - if (!uatomic_read(&stream->chan->refcount) + if (!uatomic_sub_return(&stream->chan->refcount, 1) && !uatomic_read(&stream->chan->nb_init_stream_left)) { /* Go for channel deletion! */ free_chan = stream->chan; } end: + /* + * Nullify the stream reference so it is not used after deletion. The + * consumer data lock MUST be acquired before being able to check for a + * NULL pointer value. + */ + stream->chan->metadata_stream = NULL; + pthread_mutex_unlock(&stream->lock); pthread_mutex_unlock(&consumer_data.lock); @@ -1957,6 +2030,8 @@ static int add_metadata_stream(struct lttng_consumer_stream *stream, * stream. */ if (uatomic_read(&stream->chan->nb_init_stream_left) > 0) { + /* Increment refcount before decrementing nb_init_stream_left */ + cmm_smp_wmb(); uatomic_dec(&stream->chan->nb_init_stream_left); } @@ -2064,7 +2139,8 @@ void *consumer_thread_metadata_poll(void *data) goto end_poll; } - ret = lttng_poll_add(&events, ctx->consumer_metadata_pipe[0], LPOLLIN); + ret = lttng_poll_add(&events, + lttng_pipe_get_readfd(ctx->consumer_metadata_pipe), LPOLLIN); if (ret < 0) { goto end; } @@ -2102,30 +2178,26 @@ restart: continue; } - if (pollfd == ctx->consumer_metadata_pipe[0]) { + if (pollfd == lttng_pipe_get_readfd(ctx->consumer_metadata_pipe)) { if (revents & (LPOLLERR | LPOLLHUP )) { DBG("Metadata thread pipe hung up"); /* * Remove the pipe from the poll set and continue the loop * since their might be data to consume. */ - lttng_poll_del(&events, ctx->consumer_metadata_pipe[0]); - ret = close(ctx->consumer_metadata_pipe[0]); - if (ret < 0) { - PERROR("close metadata pipe"); - } + lttng_poll_del(&events, + lttng_pipe_get_readfd(ctx->consumer_metadata_pipe)); + lttng_pipe_read_close(ctx->consumer_metadata_pipe); continue; } else if (revents & LPOLLIN) { - do { - /* Get the stream pointer received */ - ret = read(pollfd, &stream, sizeof(stream)); - } while (ret < 0 && errno == EINTR); - if (ret < 0 || - ret < sizeof(struct lttng_consumer_stream *)) { - PERROR("read metadata stream"); + ssize_t pipe_len; + + pipe_len = lttng_pipe_read(ctx->consumer_metadata_pipe, + &stream, sizeof(stream)); + if (pipe_len < 0) { + ERR("read metadata stream, ret: %ld", pipe_len); /* - * Let's continue here and hope we can still work - * without stopping the consumer. XXX: Should we? + * Continue here to handle the rest of the streams. */ continue; } @@ -2332,13 +2404,10 @@ void *consumer_thread_data_poll(void *data) ssize_t pipe_readlen; DBG("consumer_data_pipe wake up"); - /* Consume 1 byte of pipe data */ - do { - pipe_readlen = read(ctx->consumer_data_pipe[0], &new_stream, - sizeof(new_stream)); - } while (pipe_readlen == -1 && errno == EINTR); + pipe_readlen = lttng_pipe_read(ctx->consumer_data_pipe, + &new_stream, sizeof(new_stream)); if (pipe_readlen < 0) { - PERROR("read consumer data pipe"); + ERR("Consumer data pipe ret %ld", pipe_readlen); /* Continue so we can at least handle the current stream(s). */ continue; } @@ -2476,10 +2545,7 @@ end: * only tracked fd in the poll set. The thread will take care of closing * the read side. */ - ret = close(ctx->consumer_metadata_pipe[1]); - if (ret < 0) { - PERROR("close data pipe"); - } + (void) lttng_pipe_write_close(ctx->consumer_metadata_pipe); destroy_data_stream_ht(data_ht); @@ -2506,6 +2572,13 @@ void consumer_close_channel_streams(struct lttng_consumer_channel *channel) ht->hash_fct(&channel->key, lttng_ht_seed), ht->match_fct, &channel->key, &iter.iter, stream, node_channel_id.node) { + /* + * Protect against teardown with mutex. + */ + pthread_mutex_lock(&stream->lock); + if (cds_lfht_is_node_deleted(&stream->node.node)) { + goto next; + } switch (consumer_data.type) { case LTTNG_CONSUMER_KERNEL: break; @@ -2522,6 +2595,8 @@ void consumer_close_channel_streams(struct lttng_consumer_channel *channel) ERR("Unknown consumer_data type"); assert(0); } + next: + pthread_mutex_unlock(&stream->lock); } rcu_read_unlock(); } @@ -2629,8 +2704,9 @@ restart: continue; } else if (revents & LPOLLIN) { enum consumer_channel_action action; + uint64_t key; - ret = read_channel_pipe(ctx, &chan, &action); + ret = read_channel_pipe(ctx, &chan, &key, &action); if (ret <= 0) { ERR("Error reading channel pipe"); continue; @@ -2649,6 +2725,27 @@ restart: lttng_poll_add(&events, chan->wait_fd, LPOLLIN | LPOLLPRI); break; + case CONSUMER_CHANNEL_DEL: + { + chan = consumer_find_channel(key); + if (!chan) { + ERR("UST consumer get channel key %" PRIu64 " not found for del channel", key); + break; + } + lttng_poll_del(&events, chan->wait_fd); + ret = lttng_ht_del(channel_ht, &iter); + assert(ret == 0); + consumer_close_channel_streams(chan); + + /* + * Release our own refcount. Force channel deletion even if + * streams were not initialized. + */ + if (!uatomic_sub_return(&chan->refcount, 1)) { + consumer_del_channel(chan); + } + goto restart; + } case CONSUMER_CHANNEL_QUIT: /* * Remove the pipe from the poll set and continue the loop @@ -2686,6 +2783,12 @@ restart: ret = lttng_ht_del(channel_ht, &iter); assert(ret == 0); consumer_close_channel_streams(chan); + + /* Release our own refcount */ + if (!uatomic_sub_return(&chan->refcount, 1) + && !uatomic_read(&chan->nb_init_stream_left)) { + consumer_del_channel(chan); + } } /* Release RCU lock for the channel looked up */ @@ -2703,6 +2806,33 @@ end_ht: return NULL; } +static int set_metadata_socket(struct lttng_consumer_local_data *ctx, + struct pollfd *sockpoll, int client_socket) +{ + int ret; + + assert(ctx); + assert(sockpoll); + + if (lttng_consumer_poll_socket(sockpoll) < 0) { + ret = -1; + goto error; + } + DBG("Metadata connection on client_socket"); + + /* Blocking call, waiting for transmission */ + ctx->consumer_metadata_socket = lttcomm_accept_unix_sock(client_socket); + if (ctx->consumer_metadata_socket < 0) { + WARN("On accept metadata"); + ret = -1; + goto error; + } + ret = 0; + +error: + return ret; +} + /* * This thread listens on the consumerd socket and receives the file * descriptors from the session daemon. @@ -2769,6 +2899,15 @@ void *consumer_thread_sessiond_poll(void *data) goto end; } + /* + * Setup metadata socket which is the second socket connection on the + * command unix socket. + */ + ret = set_metadata_socket(ctx, consumer_sockpoll, client_socket); + if (ret < 0) { + goto end; + } + /* This socket is not useful anymore. */ ret = close(client_socket); if (ret < 0) { @@ -2825,9 +2964,9 @@ end: * Notify the data poll thread to poll back again and test the * consumer_quit state that we just set so to quit gracefully. */ - notify_thread_pipe(ctx->consumer_data_pipe[1]); + notify_thread_lttng_pipe(ctx->consumer_data_pipe); - notify_channel_pipe(ctx, NULL, CONSUMER_CHANNEL_QUIT); + notify_channel_pipe(ctx, NULL, -1, CONSUMER_CHANNEL_QUIT); /* Cleaning up possibly open sockets. */ if (sock >= 0) { @@ -2837,7 +2976,7 @@ end: } } if (client_socket >= 0) { - ret = close(sock); + ret = close(client_socket); if (ret < 0) { PERROR("close client_socket sessiond poll"); } @@ -2907,12 +3046,15 @@ void lttng_consumer_init(void) */ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, struct lttng_consumer_local_data *ctx, int sock, - struct pollfd *consumer_sockpoll, struct lttcomm_sock *relayd_sock, - unsigned int sessiond_id) + struct pollfd *consumer_sockpoll, + struct lttcomm_relayd_sock *relayd_sock, unsigned int sessiond_id) { int fd = -1, ret = -1, relayd_created = 0; enum lttng_error_code ret_code = LTTNG_OK; - struct consumer_relayd_sock_pair *relayd; + struct consumer_relayd_sock_pair *relayd = NULL; + + assert(ctx); + assert(relayd_sock); DBG("Consumer adding relayd socket (idx: %d)", net_seq_idx); @@ -2963,11 +3105,11 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, switch (sock_type) { case LTTNG_STREAM_CONTROL: /* Copy received lttcomm socket */ - lttcomm_copy_sock(&relayd->control_sock, relayd_sock); - ret = lttcomm_create_sock(&relayd->control_sock); + lttcomm_copy_sock(&relayd->control_sock.sock, &relayd_sock->sock); + ret = lttcomm_create_sock(&relayd->control_sock.sock); /* Immediately try to close the created socket if valid. */ - if (relayd->control_sock.fd >= 0) { - if (close(relayd->control_sock.fd)) { + if (relayd->control_sock.sock.fd >= 0) { + if (close(relayd->control_sock.sock.fd)) { PERROR("close relayd control socket"); } } @@ -2977,7 +3119,10 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, } /* Assign new file descriptor */ - relayd->control_sock.fd = fd; + relayd->control_sock.sock.fd = fd; + /* Assign version values. */ + relayd->control_sock.major = relayd_sock->major; + relayd->control_sock.minor = relayd_sock->minor; /* * Create a session on the relayd and store the returned id. Lock the @@ -3005,11 +3150,11 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, break; case LTTNG_STREAM_DATA: /* Copy received lttcomm socket */ - lttcomm_copy_sock(&relayd->data_sock, relayd_sock); - ret = lttcomm_create_sock(&relayd->data_sock); + lttcomm_copy_sock(&relayd->data_sock.sock, &relayd_sock->sock); + ret = lttcomm_create_sock(&relayd->data_sock.sock); /* Immediately try to close the created socket if valid. */ - if (relayd->data_sock.fd >= 0) { - if (close(relayd->data_sock.fd)) { + if (relayd->data_sock.sock.fd >= 0) { + if (close(relayd->data_sock.sock.fd)) { PERROR("close relayd data socket"); } } @@ -3019,7 +3164,10 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, } /* Assign new file descriptor */ - relayd->data_sock.fd = fd; + relayd->data_sock.sock.fd = fd; + /* Assign version values. */ + relayd->data_sock.major = relayd_sock->major; + relayd->data_sock.minor = relayd_sock->minor; break; default: ERR("Unknown relayd socket type (%d)", sock_type);