X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=6f032da112baae7a9a97af061f4388bc621b6d6d;hb=847a5916c26ab9cc0dfc9322cccd2c748c54747e;hp=480971b8982287e980ca09836d72b2105b869b23;hpb=d7ba13889c8692b14f99238ddf2721ed78df89d2;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 480971b89..6f032da11 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -431,6 +431,9 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, * Must be called with the registry lock held. * * On success, return the len of metadata pushed or else a negative value. + * Returning a -EPIPE return value means we could not send the metadata, + * but it can be caused by recoverable errors (e.g. the application has + * terminated concurrently). */ ssize_t ust_app_push_metadata(struct ust_registry_session *registry, struct consumer_socket *socket, int send_zero_data) @@ -454,9 +457,10 @@ ssize_t ust_app_push_metadata(struct ust_registry_session *registry, /* * On a push metadata error either the consumer is dead or the * metadata channel has been destroyed because its endpoint - * might have died (e.g: relayd). If so, the metadata closed - * flag is set to 1 so we deny pushing metadata again which is - * not valid anymore on the consumer side. + * might have died (e.g: relayd), or because the application has + * exited. If so, the metadata closed flag is set to 1 so we + * deny pushing metadata again which is not valid anymore on the + * consumer side. */ if (registry->metadata_closed) { return -EPIPE; @@ -547,6 +551,9 @@ error_push: * of socket throughout this function. * * Return 0 on success else a negative error. + * Returning a -EPIPE return value means we could not send the metadata, + * but it can be caused by recoverable errors (e.g. the application has + * terminated concurrently). */ static int push_metadata(struct ust_registry_session *registry, struct consumer_output *consumer) @@ -1637,6 +1644,9 @@ static void shadow_copy_session(struct ust_app_session *ua_sess, goto error; } + strncpy(ua_sess->root_shm_path, usess->root_shm_path, + sizeof(ua_sess->root_shm_path)); + ua_sess->root_shm_path[sizeof(ua_sess->root_shm_path) - 1] = '\0'; strncpy(ua_sess->shm_path, usess->shm_path, sizeof(ua_sess->shm_path)); ua_sess->shm_path[sizeof(ua_sess->shm_path) - 1] = '\0'; @@ -1758,7 +1768,7 @@ static int setup_buffer_reg_pid(struct ust_app_session *ua_sess, * registry available, we have to create one for this session. */ ret = buffer_reg_pid_create(ua_sess->id, ®_pid, - ua_sess->shm_path); + ua_sess->root_shm_path, ua_sess->shm_path); if (ret < 0) { goto error; } @@ -1772,7 +1782,8 @@ static int setup_buffer_reg_pid(struct ust_app_session *ua_sess, app->uint16_t_alignment, app->uint32_t_alignment, app->uint64_t_alignment, app->long_alignment, app->byte_order, app->version.major, - app->version.minor, reg_pid->shm_path, + app->version.minor, reg_pid->root_shm_path, + reg_pid->shm_path, ua_sess->euid, ua_sess->egid); if (ret < 0) { /* @@ -1824,7 +1835,8 @@ static int setup_buffer_reg_uid(struct ltt_ust_session *usess, * registry available, we have to create one for this session. */ ret = buffer_reg_uid_create(usess->id, app->bits_per_long, app->uid, - LTTNG_DOMAIN_UST, ®_uid, ua_sess->shm_path); + LTTNG_DOMAIN_UST, ®_uid, + ua_sess->root_shm_path, ua_sess->shm_path); if (ret < 0) { goto error; } @@ -1838,8 +1850,8 @@ static int setup_buffer_reg_uid(struct ltt_ust_session *usess, app->uint16_t_alignment, app->uint32_t_alignment, app->uint64_t_alignment, app->long_alignment, app->byte_order, app->version.major, - app->version.minor, reg_uid->shm_path, - usess->uid, usess->gid); + app->version.minor, reg_uid->root_shm_path, + reg_uid->shm_path, usess->uid, usess->gid); if (ret < 0) { /* * reg_uid->registry->reg.ust is NULL upon error, so we need to @@ -3721,6 +3733,11 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess, */ continue; } + if (!trace_ust_pid_tracker_lookup(usess, app->pid)) { + /* Skip. */ + continue; + } + /* * Create session on the tracer side and add it to app session HT. Note * that if session exist, it will simply return a pointer to the ust @@ -4348,46 +4365,26 @@ int ust_app_destroy_trace_all(struct ltt_ust_session *usess) return 0; } -/* - * Add channels/events from UST global domain to registered apps at sock. - */ -void ust_app_global_update(struct ltt_ust_session *usess, int sock) +static +void ust_app_global_create(struct ltt_ust_session *usess, struct ust_app *app) { int ret = 0; struct lttng_ht_iter iter, uiter; - struct ust_app *app; struct ust_app_session *ua_sess = NULL; struct ust_app_channel *ua_chan; struct ust_app_event *ua_event; struct ust_app_ctx *ua_ctx; + int is_created = 0; - assert(usess); - assert(sock >= 0); - - DBG2("UST app global update for app sock %d for session id %" PRIu64, sock, - usess->id); - - rcu_read_lock(); - - app = ust_app_find_by_sock(sock); - if (app == NULL) { - /* - * Application can be unregistered before so this is possible hence - * simply stopping the update. - */ - DBG3("UST app update failed to find app sock %d", sock); - goto error; - } - - if (!app->compatible) { - goto error; - } - - ret = create_ust_app_session(usess, app, &ua_sess, NULL); + ret = create_ust_app_session(usess, app, &ua_sess, &is_created); if (ret < 0) { /* Tracer is probably gone or ENOMEM. */ goto error; } + if (!is_created) { + /* App session already created. */ + goto end; + } assert(ua_sess); pthread_mutex_lock(&ua_sess->lock); @@ -4441,9 +4438,8 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock) DBG2("UST trace started for app pid %d", app->pid); } - +end: /* Everything went well at this point. */ - rcu_read_unlock(); return; error_unlock: @@ -4452,10 +4448,60 @@ error: if (ua_sess) { destroy_app_session(app, ua_sess); } - rcu_read_unlock(); return; } +static +void ust_app_global_destroy(struct ltt_ust_session *usess, struct ust_app *app) +{ + struct ust_app_session *ua_sess; + + ua_sess = lookup_session_by_app(usess, app); + if (ua_sess == NULL) { + return; + } + destroy_app_session(app, ua_sess); +} + +/* + * Add channels/events from UST global domain to registered apps at sock. + * + * Called with session lock held. + * Called with RCU read-side lock held. + */ +void ust_app_global_update(struct ltt_ust_session *usess, struct ust_app *app) +{ + assert(usess); + + DBG2("UST app global update for app sock %d for session id %" PRIu64, + app->sock, usess->id); + + if (!app->compatible) { + return; + } + + if (trace_ust_pid_tracker_lookup(usess, app->pid)) { + ust_app_global_create(usess, app); + } else { + ust_app_global_destroy(usess, app); + } +} + +/* + * Called with session lock held. + */ +void ust_app_global_update_all(struct ltt_ust_session *usess) +{ + struct lttng_ht_iter iter; + struct ust_app *app; + + rcu_read_lock(); + cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) { + ust_app_global_update(usess, app); + } + rcu_read_unlock(); +} + /* * Add context to a specific channel for global UST domain. */