X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-consumer.c;h=ad076e3c3173085f922c3d7864d9959bb9c93c9c;hp=9715c426f468f5b24cf76bf64726b0cf218d5af3;hb=2c57e06ddcdb92e863755595000f162729130845;hpb=53efb85a242809ed5ed21e9ab40effa696ecbc6f diff --git a/src/bin/lttng-sessiond/ust-consumer.c b/src/bin/lttng-sessiond/ust-consumer.c index 9715c426f..ad076e3c3 100644 --- a/src/bin/lttng-sessiond/ust-consumer.c +++ b/src/bin/lttng-sessiond/ust-consumer.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -108,6 +109,8 @@ static int ask_channel_creation(struct ust_app_session *ua_sess, char *pathname = NULL; struct lttcomm_consumer_msg msg; struct ust_registry_channel *chan_reg; + char shm_path[PATH_MAX] = ""; + char root_shm_path[PATH_MAX] = ""; assert(ua_sess); assert(ua_chan); @@ -135,10 +138,27 @@ static int ask_channel_creation(struct ust_app_session *ua_sess, if (ua_chan->attr.type == LTTNG_UST_CHAN_METADATA) { chan_id = -1U; + /* + * Metadata channels shm_path (buffers) are handled within + * session daemon. Consumer daemon should not try to create + * those buffer files. + */ } else { chan_reg = ust_registry_channel_find(registry, chan_reg_key); assert(chan_reg); chan_id = chan_reg->chan_id; + if (ua_sess->shm_path[0]) { + strncpy(shm_path, ua_sess->shm_path, sizeof(shm_path)); + shm_path[sizeof(shm_path) - 1] = '\0'; + strncat(shm_path, "/", + sizeof(shm_path) - strlen(shm_path) - 1); + strncat(shm_path, ua_chan->name, + sizeof(shm_path) - strlen(shm_path) - 1); + strncat(shm_path, "_", + sizeof(shm_path) - strlen(shm_path) - 1); + } + strncpy(root_shm_path, ua_sess->root_shm_path, sizeof(root_shm_path)); + root_shm_path[sizeof(root_shm_path) - 1] = '\0'; } switch (ua_chan->attr.output) { @@ -170,7 +190,8 @@ static int ask_channel_creation(struct ust_app_session *ua_sess, ua_chan->tracefile_count, ua_sess->id, ua_sess->output_traces, - ua_sess->uid); + ua_sess->uid, + root_shm_path, shm_path); health_code_update(); @@ -308,7 +329,7 @@ int ust_consumer_get_channel(struct consumer_socket *socket, cds_list_add_tail(&stream->list, &ua_chan->streams.head); ua_chan->streams.count++; - DBG2("UST app stream %d received succesfully", ua_chan->streams.count); + DBG2("UST app stream %d received successfully", ua_chan->streams.count); } /* This MUST match or else we have a synchronization problem. */ @@ -383,8 +404,8 @@ int ust_consumer_send_stream_to_ust(struct ust_app *app, ret = ustctl_send_stream_to_ust(app->sock, channel->obj, stream->obj); if (ret < 0) { if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Error ustctl send stream %s to app pid: %d with ret %d", - stream->name, app->pid, ret); + ERR("ustctl send stream handle %d to app pid: %d with ret %d", + stream->obj->handle, app->pid, ret); } else { DBG3("UST app send stream to ust failed. Application is dead."); } @@ -447,12 +468,12 @@ int ust_consumer_metadata_request(struct consumer_socket *socket) assert(socket); rcu_read_lock(); - pthread_mutex_lock(socket->lock); - health_code_update(); /* Wait for a metadata request */ + pthread_mutex_lock(socket->lock); ret = consumer_socket_recv(socket, &request, sizeof(request)); + pthread_mutex_unlock(socket->lock); if (ret < 0) { goto end; } @@ -487,17 +508,21 @@ int ust_consumer_metadata_request(struct consumer_socket *socket) } assert(ust_reg); + pthread_mutex_lock(&ust_reg->lock); ret_push = ust_app_push_metadata(ust_reg, socket, 1); - if (ret_push < 0) { + pthread_mutex_unlock(&ust_reg->lock); + if (ret_push == -EPIPE) { + DBG("Application or relay closed while pushing metadata"); + } else if (ret_push < 0) { ERR("Pushing metadata"); ret = -1; goto end; + } else { + DBG("UST Consumer metadata pushed successfully"); } - DBG("UST Consumer metadata pushed successfully"); ret = 0; end: - pthread_mutex_unlock(socket->lock); rcu_read_unlock(); return ret; }