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",
/* Blocking call, waiting for transmission */
sock = lttcomm_accept_unix_sock(client_socket);
- if (sock <= 0) {
+ if (sock < 0) {
WARN("On accept");
goto end;
}
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;
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;
}
relayd_id_node = zmalloc(sizeof(struct consumer_relayd_session_id));
if (!relayd_id_node) {
PERROR("zmalloc relayd id node");
+ ret = -1;
goto error;
}
break;
default:
ERR("Unknown relayd socket type (%d)", sock_type);
+ ret = -1;
goto error;
}
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;
}