* On success, the relayd_sock pointer is set to the created socket.
* Else, it remains untouched and an LTTng error code is returned.
*/
-static enum lttng_error_code create_connect_relayd(struct lttng_uri *uri,
- struct lttcomm_relayd_sock **relayd_sock,
- struct consumer_output *consumer)
+static lttng_error_code create_connect_relayd(
+ struct lttng_uri *uri, struct lttcomm_relayd_sock **relayd_sock)
{
int ret;
enum lttng_error_code status = LTTNG_OK;
/* Create socket for control stream. */
if (uri->stype == LTTNG_STREAM_CONTROL) {
- uint64_t result_flags;
-
DBG3("Creating relayd stream socket from URI");
/* Check relayd version */
status = LTTNG_ERR_RELAYD_CONNECT_FAIL;
goto close_sock;
}
- consumer->relay_major_version = rsock->major;
- consumer->relay_minor_version = rsock->minor;
- ret = relayd_get_configuration(rsock, 0,
- &result_flags);
- if (ret < 0) {
- ERR("Unable to get relayd configuration");
- status = LTTNG_ERR_RELAYD_CONNECT_FAIL;
- goto close_sock;
- }
- if (result_flags & LTTCOMM_RELAYD_CONFIGURATION_FLAG_CLEAR_ALLOWED) {
- consumer->relay_allows_clear = true;
- }
} else if (uri->stype == LTTNG_STREAM_DATA) {
DBG3("Creating relayd data socket from URI");
} else {
*
* Returns LTTNG_OK on success or an LTTng error code on failure.
*/
-static enum lttng_error_code send_consumer_relayd_socket(
- unsigned int session_id,
+static enum lttng_error_code send_consumer_relayd_socket(unsigned int session_id,
struct lttng_uri *relayd_uri,
struct consumer_output *consumer,
struct consumer_socket *consumer_sock,
- const char *session_name, const char *hostname,
- const char *base_path, int session_live_timer,
+ const char *session_name,
+ const char *hostname,
+ const char *base_path,
+ int session_live_timer,
const uint64_t *current_chunk_id,
time_t session_creation_time,
- bool session_name_contains_creation_time)
+ bool session_name_contains_creation_time,
+ struct lttcomm_relayd_sock& rsock)
{
int ret;
- struct lttcomm_relayd_sock *rsock = NULL;
- enum lttng_error_code status;
-
- /* Connect to relayd and make version check if uri is the control. */
- status = create_connect_relayd(relayd_uri, &rsock, consumer);
- if (status != LTTNG_OK) {
- goto relayd_comm_error;
- }
- LTTNG_ASSERT(rsock);
+ enum lttng_error_code status = LTTNG_OK;
/* Set the network sequence index if not set. */
if (consumer->net_seq_index == (uint64_t) -1ULL) {
}
/* Send relayd socket to consumer. */
- ret = consumer_send_relayd_socket(consumer_sock, rsock, consumer,
- relayd_uri->stype, session_id,
- session_name, hostname, base_path,
- session_live_timer, current_chunk_id,
- session_creation_time, session_name_contains_creation_time);
+ ret = consumer_send_relayd_socket(consumer_sock, &rsock, consumer, relayd_uri->stype,
+ session_id, session_name, hostname, base_path, session_live_timer,
+ current_chunk_id, session_creation_time,
+ session_name_contains_creation_time);
if (ret < 0) {
status = LTTNG_ERR_ENABLE_CONSUMER_FAIL;
- goto close_sock;
+ goto error;
}
/* Flag that the corresponding socket was sent. */
consumer_sock->data_sock_sent = 1;
}
- /*
- * Close socket which was dup on the consumer side. The session daemon does
- * NOT keep track of the relayd socket(s) once transfer to the consumer.
- */
-
-close_sock:
+error:
if (status != LTTNG_OK) {
/*
* The consumer output for this session should not be used anymore
*/
consumer->enabled = 0;
}
- (void) relayd_close(rsock);
- free(rsock);
-relayd_comm_error:
return status;
}
bool session_name_contains_creation_time)
{
enum lttng_error_code status = LTTNG_OK;
+ struct lttcomm_relayd_sock *control_sock = nullptr;
+ struct lttcomm_relayd_sock *data_sock = nullptr;
LTTNG_ASSERT(consumer);
LTTNG_ASSERT(sock);
/* Sending control relayd socket. */
if (!sock->control_sock_sent) {
- status = send_consumer_relayd_socket(session_id,
- &consumer->dst.net.control, consumer, sock,
- session_name, hostname, base_path, session_live_timer,
- current_chunk_id, session_creation_time,
- session_name_contains_creation_time);
+ int ret;
+ uint64_t result_flags = 0;
+ /* Connect to relayd and make version check if uri is the control. */
+ status = create_connect_relayd(&consumer->dst.net.control, &control_sock);
+ if (status != LTTNG_OK) {
+ goto error;
+ }
+ LTTNG_ASSERT(control_sock);
+
+ consumer->relay_major_version = control_sock->major;
+ consumer->relay_minor_version = control_sock->minor;
+
+ ret = relayd_get_configuration(control_sock, 0, &result_flags);
+ if (ret < 0) {
+ ERR("Unable to get relayd configuration");
+ status = LTTNG_ERR_RELAYD_CONNECT_FAIL;
+ goto error;
+ }
+
+ if (result_flags & LTTCOMM_RELAYD_CONFIGURATION_FLAG_CLEAR_ALLOWED) {
+ consumer->relay_allows_clear = true;
+ }
+
+ status = send_consumer_relayd_socket(session_id, &consumer->dst.net.control,
+ consumer, sock, session_name, hostname, base_path,
+ session_live_timer, current_chunk_id, session_creation_time,
+ session_name_contains_creation_time, *control_sock);
+
if (status != LTTNG_OK) {
goto error;
}
/* Sending data relayd socket. */
if (!sock->data_sock_sent) {
- status = send_consumer_relayd_socket(session_id,
- &consumer->dst.net.data, consumer, sock,
- session_name, hostname, base_path, session_live_timer,
+ /* Connect to relayd and make version check if uri is the control. */
+ status = create_connect_relayd(&consumer->dst.net.data, &data_sock);
+ if (status != LTTNG_OK) {
+ goto error;
+ }
+ LTTNG_ASSERT(data_sock);
+
+ status = send_consumer_relayd_socket(session_id, &consumer->dst.net.data, consumer,
+ sock, session_name, hostname, base_path, session_live_timer,
current_chunk_id, session_creation_time,
- session_name_contains_creation_time);
+ session_name_contains_creation_time, *data_sock);
+
if (status != LTTNG_OK) {
goto error;
}
}
error:
+ if (control_sock != nullptr) {
+ relayd_close(control_sock);
+ free(control_sock);
+ }
+
+ if (data_sock != nullptr) {
+ relayd_close(data_sock);
+ free(data_sock);
+ }
+
return status;
}
usess = session->ust_session;
ksess = session->kernel_session;
- DBG("Setting relayd for session %s", session->name);
+ ERR("Setting relayd for session %s", session->name);
rcu_read_lock();
if (session->current_trace_chunk) {
static enum lttng_error_code kernel_domain_check_trace_format_requirements(
const lttng::trace_format_descriptor& descriptor)
{
- enum lttng_error_code ret_code;
+ enum lttng_error_code ret_code = LTTNG_OK;
switch (descriptor.type()) {
case LTTNG_TRACE_FORMAT_DESCRIPTOR_TYPE_CTF_1:
/* Supported by all kernel tracer. */
- ret_code = LTTNG_OK;
break;
case LTTNG_TRACE_FORMAT_DESCRIPTOR_TYPE_CTF_2:
if (!kernel_supports_ctf2()) {
ret_code = LTTNG_ERR_TRACE_FORMAT_UNSUPPORTED_KERNEL_TRACER;
}
+ break;
+ default:
+ abort();
}
- return LTTNG_OK;
+ return ret_code;
}
static enum lttng_error_code cmd_enable_channel_internal(