X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fconsumer.c;h=9df0c484c9bfe4c0a29371ed473b07e846f93e77;hp=1e710ab3d9b80fefbbfe2aad58fd050e50d03444;hb=18261bd1f606ed31dd91cf82bbb91af7839573f5;hpb=4cec016f4a1cb76ec3d917c2d261c4081910a65a diff --git a/src/common/consumer.c b/src/common/consumer.c index 1e710ab3d..9df0c484c 100644 --- a/src/common/consumer.c +++ b/src/common/consumer.c @@ -1334,6 +1334,12 @@ static int write_relayd_metadata_id(int fd, PERROR("write metadata stream id"); } DBG3("Consumer failed to write relayd metadata id (errno: %d)", errno); + /* + * Set ret to a negative value because if ret != sizeof(hdr), we don't + * handle writting the missing part so report that as an error and + * don't lie to the caller. + */ + ret = -1; goto end; } DBG("Metadata stream id %" PRIu64 " with padding %lu written before data", @@ -2597,7 +2603,7 @@ void *consumer_thread_sessiond_poll(void *data) /* Blocking call, waiting for transmission */ sock = lttcomm_accept_unix_sock(client_socket); - if (sock <= 0) { + if (sock < 0) { WARN("On accept"); goto end; } @@ -2759,6 +2765,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, relayd = consumer_allocate_relayd_sock_pair(net_seq_idx); if (relayd == NULL) { lttng_consumer_send_error(ctx, LTTCOMM_CONSUMERD_OUTFD_ERROR); + ret = -1; goto error; } relayd->sessiond_session_id = (uint64_t) sessiond_id; @@ -2808,11 +2815,17 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, relayd->control_sock.fd = fd; /* - * Create a session on the relayd and store the returned id. No need to - * grab the socket lock since the relayd object is not yet visible. + * Create a session on the relayd and store the returned id. Lock the + * control socket mutex if the relayd was NOT created before. */ + if (!relayd_created) { + pthread_mutex_lock(&relayd->ctrl_sock_mutex); + } ret = relayd_create_session(&relayd->control_sock, &relayd->relayd_session_id); + if (!relayd_created) { + pthread_mutex_unlock(&relayd->ctrl_sock_mutex); + } if (ret < 0) { goto error; } @@ -2821,6 +2834,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, relayd_id_node = zmalloc(sizeof(struct consumer_relayd_session_id)); if (!relayd_id_node) { PERROR("zmalloc relayd id node"); + ret = -1; goto error; } @@ -2855,6 +2869,7 @@ int consumer_add_relayd_socket(int net_seq_idx, int sock_type, break; default: ERR("Unknown relayd socket type (%d)", sock_type); + ret = -1; goto error; } @@ -2926,30 +2941,24 @@ end: static struct consumer_relayd_sock_pair *find_relayd_by_session_id(uint64_t id) { struct lttng_ht_iter iter; - struct lttng_ht_node_ulong *node; struct consumer_relayd_sock_pair *relayd = NULL; - struct consumer_relayd_session_id *session_id_map; - - /* Get the session id map. */ - lttng_ht_lookup(relayd_session_id_ht, (void *)((unsigned long) id), &iter); - node = lttng_ht_iter_get_node_ulong(&iter); - if (node == NULL) { - goto end; - } - - session_id_map = caa_container_of(node, struct consumer_relayd_session_id, - node); /* Iterate over all relayd since they are indexed by net_seq_idx. */ cds_lfht_for_each_entry(consumer_data.relayd_ht->ht, &iter.iter, relayd, node.node) { - if (relayd->relayd_session_id == session_id_map->relayd_id) { + /* + * Check by sessiond id which is unique here where the relayd session + * id might not be when having multiple relayd. + */ + if (relayd->sessiond_session_id == id) { /* Found the relayd. There can be only one per id. */ - break; + goto found; } } -end: + return NULL; + +found: return relayd; }