#include "consumer.h"
#include "health.h"
#include "ust-app.h"
+#include "utils.h"
/*
* Receive a reply command status message from the consumer. Consumer socket
/*
* Delete the consumer_output object from the list and free the ptr.
+ *
+ * Should *NOT* be called with RCU read-side lock held.
*/
void consumer_destroy_output(struct consumer_output *obj)
{
rcu_read_unlock();
/* Finally destroy HT */
- lttng_ht_destroy(obj->socks);
+ ht_cleanup_push(obj->socks);
}
free(obj);
/*
* Copy consumer output and returned the newly allocated copy.
+ *
+ * Should *NOT* be called with RCU read-side lock held.
*/
struct consumer_output *consumer_copy_output(struct consumer_output *obj)
{
if (uri->port == 0) {
/* Assign default port. */
uri->port = DEFAULT_NETWORK_CONTROL_PORT;
+ } else {
+ if (obj->dst.net.data_isset && uri->port ==
+ obj->dst.net.data.port) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
}
DBG3("Consumer control URI set with port %d", uri->port);
break;
if (uri->port == 0) {
/* Assign default port. */
uri->port = DEFAULT_NETWORK_DATA_PORT;
+ } else {
+ if (obj->dst.net.control_isset && uri->port ==
+ obj->dst.net.control.port) {
+ ret = -LTTNG_ERR_INVALID;
+ goto error;
+ }
}
DBG3("Consumer data URI set with port %d", uri->port);
break;
default:
ERR("Set network uri type unknown %d", uri->stype);
+ ret = -LTTNG_ERR_INVALID;
goto error;
}
}
if (ret < 0) {
PERROR("snprintf set consumer uri subdir");
+ ret = -LTTNG_ERR_NOMEM;
goto error;
}
equal:
return 1;
error:
- return -1;
+ return ret;
}
/*
uint64_t relayd_id,
uint64_t key,
unsigned char *uuid,
- uint32_t chan_id)
+ uint32_t chan_id,
+ uint64_t tracefile_size,
+ uint64_t tracefile_count)
{
assert(msg);
msg->u.ask_channel.relayd_id = relayd_id;
msg->u.ask_channel.key = key;
msg->u.ask_channel.chan_id = chan_id;
+ msg->u.ask_channel.tracefile_size = tracefile_size;
+ msg->u.ask_channel.tracefile_count = tracefile_count;
memcpy(msg->u.ask_channel.uuid, uuid, sizeof(msg->u.ask_channel.uuid));
const char *name,
unsigned int nb_init_streams,
enum lttng_event_output output,
- int type)
+ int type,
+ uint64_t tracefile_size,
+ uint64_t tracefile_count)
{
assert(msg);
msg->u.channel.nb_init_streams = nb_init_streams;
msg->u.channel.output = output;
msg->u.channel.type = type;
+ msg->u.channel.tracefile_size = tracefile_size;
+ msg->u.channel.tracefile_count = tracefile_count;
strncpy(msg->u.channel.pathname, pathname,
sizeof(msg->u.channel.pathname));
* On success return positive value. On error, negative value.
*/
int consumer_send_relayd_socket(struct consumer_socket *consumer_sock,
- struct lttcomm_sock *sock, struct consumer_output *consumer,
+ struct lttcomm_relayd_sock *rsock, struct consumer_output *consumer,
enum lttng_stream_type type, uint64_t session_id)
{
int ret;
struct lttcomm_consumer_msg msg;
/* Code flow error. Safety net. */
- assert(sock);
+ assert(rsock);
assert(consumer);
assert(consumer_sock);
msg.u.relayd_sock.net_index = consumer->net_seq_index;
msg.u.relayd_sock.type = type;
msg.u.relayd_sock.session_id = session_id;
- memcpy(&msg.u.relayd_sock.sock, sock, sizeof(msg.u.relayd_sock.sock));
+ memcpy(&msg.u.relayd_sock.sock, rsock, sizeof(msg.u.relayd_sock.sock));
DBG3("Sending relayd sock info to consumer on %d", consumer_sock->fd);
ret = lttcomm_send_unix_sock(consumer_sock->fd, &msg, sizeof(msg));
if (ret < 0) {
/* The above call will print a PERROR on error. */
- DBG("Error when sending relayd sockets on sock %d", sock->fd);
+ DBG("Error when sending relayd sockets on sock %d", rsock->sock.fd);
goto error;
}
}
DBG3("Sending relayd socket file descriptor to consumer");
- ret = consumer_send_fds(consumer_sock, &sock->fd, 1);
+ ret = consumer_send_fds(consumer_sock, &rsock->sock.fd, 1);
if (ret < 0) {
goto error;
}
}
/*
- * Send metadata string to consumer.
+ * Send metadata string to consumer. Socket lock MUST be acquired.
*
* Return 0 on success else a negative value.
*/
msg.u.push_metadata.target_offset = target_offset;
msg.u.push_metadata.len = len;
- /*
- * TODO: reenable these locks when the consumerd gets the ability to
- * reorder the metadata it receives. This fits with locking in
- * src/bin/lttng-sessiond/ust-app.c:push_metadata()
- *
- * pthread_mutex_lock(socket->lock);
- */
-
health_code_update();
ret = consumer_send_msg(socket, &msg);
- if (ret < 0) {
+ if (ret < 0 || len == 0) {
goto end;
}
- DBG3("Consumer pushing metadata on sock %d of len %lu", socket->fd, len);
+ DBG3("Consumer pushing metadata on sock %d of len %zu", socket->fd, len);
ret = lttcomm_send_unix_sock(socket->fd, metadata_str, len);
if (ret < 0) {
end:
health_code_update();
- /*
- * pthread_mutex_unlock(socket->lock);
- */
return ret;
}