X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=d303e8b66ec240f590cda13b621dc0a6918cecf4;hp=4f136550cc32b2dc9aaa277af49fe60e9f664e0a;hb=acfb63a8ba86cb7d89cfeea515abceb89f2907e9;hpb=50f71cad1a1a1e29d0e6cc6577127b88b9dba50f diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 4f136550c..d303e8b66 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -118,8 +118,8 @@ static int ht_match_ust_app_event(struct cds_lfht_node *node, const void *_key) const struct ust_app_ht_key *key; int ev_loglevel_value; - assert(node); - assert(_key); + LTTNG_ASSERT(node); + LTTNG_ASSERT(_key); event = caa_container_of(node, struct ust_app_event, node.node); key = _key; @@ -195,9 +195,9 @@ static void add_unique_ust_app_event(struct ust_app_channel *ua_chan, struct ust_app_ht_key key; struct lttng_ht *ht; - assert(ua_chan); - assert(ua_chan->events); - assert(event); + LTTNG_ASSERT(ua_chan); + LTTNG_ASSERT(ua_chan->events); + LTTNG_ASSERT(event); ht = ua_chan->events; key.name = event->attr.name; @@ -208,7 +208,7 @@ static void add_unique_ust_app_event(struct ust_app_channel *ua_chan, node_ptr = cds_lfht_add_unique(ht->ht, ht->hash_fct(event->node.key, lttng_ht_seed), ht_match_ust_app_event, &key, &event->node.node); - assert(node_ptr == &event->node.node); + LTTNG_ASSERT(node_ptr == &event->node.node); } /* @@ -222,7 +222,7 @@ static void close_notify_sock_rcu(struct rcu_head *head) caa_container_of(head, struct ust_app_notify_sock_obj, head); /* Must have a valid fd here. */ - assert(obj->fd >= 0); + LTTNG_ASSERT(obj->fd >= 0); ret = close(obj->fd); if (ret) { @@ -238,14 +238,14 @@ static void close_notify_sock_rcu(struct rcu_head *head) * session. * * A registry per UID object MUST exists before calling this function or else - * it assert() if not found. RCU read side lock must be acquired. + * it LTTNG_ASSERT() if not found. RCU read side lock must be acquired. */ static struct ust_registry_session *get_session_registry( struct ust_app_session *ua_sess) { struct ust_registry_session *registry = NULL; - assert(ua_sess); + LTTNG_ASSERT(ua_sess); switch (ua_sess->buffer_type) { case LTTNG_BUFFER_PER_PID: @@ -269,7 +269,7 @@ static struct ust_registry_session *get_session_registry( break; } default: - assert(0); + abort(); }; error: @@ -286,15 +286,24 @@ void delete_ust_app_ctx(int sock, struct ust_app_ctx *ua_ctx, { int ret; - assert(ua_ctx); + LTTNG_ASSERT(ua_ctx); if (ua_ctx->obj) { pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_object(sock, ua_ctx->obj); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app sock %d release ctx obj handle %d failed with ret %d", - sock, ua_ctx->obj->handle, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app release ctx failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app release ctx failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app release ctx obj handle %d failed with ret %d: pid = %d, sock = %d", + ua_ctx->obj->handle, ret, + app->pid, app->sock); + } } free(ua_ctx->obj); } @@ -311,7 +320,7 @@ void delete_ust_app_event(int sock, struct ust_app_event *ua_event, { int ret; - assert(ua_event); + LTTNG_ASSERT(ua_event); free(ua_event->filter); if (ua_event->exclusion != NULL) @@ -320,9 +329,17 @@ void delete_ust_app_event(int sock, struct ust_app_event *ua_event, pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_object(sock, ua_event->obj); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app sock %d release event obj failed with ret %d", - sock, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app release event failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app release event failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app release event obj failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); + } } free(ua_event->obj); } @@ -351,7 +368,7 @@ static void delete_ust_app_event_notifier_rule(int sock, { int ret; - assert(ua_event_notifier_rule); + LTTNG_ASSERT(ua_event_notifier_rule); if (ua_event_notifier_rule->exclusion != NULL) { free(ua_event_notifier_rule->exclusion); @@ -361,9 +378,17 @@ static void delete_ust_app_event_notifier_rule(int sock, pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_object(sock, ua_event_notifier_rule->obj); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Failed to release event notifier object: app = '%s' (ppid %d), ret = %d", - app->name, (int) app->ppid, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app release event notifier failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app release event notifier failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app release event notifier failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); + } } free(ua_event_notifier_rule->obj); @@ -384,15 +409,23 @@ static int release_ust_app_stream(int sock, struct ust_app_stream *stream, { int ret = 0; - assert(stream); + LTTNG_ASSERT(stream); if (stream->obj) { pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_object(sock, stream->obj); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app sock %d release stream obj failed with ret %d", - sock, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app release stream failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app release stream failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app release stream obj failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); + } } lttng_fd_put(LTTNG_FD_APPS, 2); free(stream->obj); @@ -409,7 +442,7 @@ static void delete_ust_app_stream(int sock, struct ust_app_stream *stream, struct ust_app *app) { - assert(stream); + LTTNG_ASSERT(stream); (void) release_ust_app_stream(sock, stream, app); free(stream); @@ -515,7 +548,7 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, struct ust_app_stream *stream, *stmp; struct ust_registry_session *registry; - assert(ua_chan); + LTTNG_ASSERT(ua_chan); DBG3("UST app deleting channel %s", ua_chan->name); @@ -529,7 +562,7 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, cds_lfht_for_each_entry(ua_chan->ctx->ht, &iter.iter, ua_ctx, node.node) { cds_list_del(&ua_ctx->list); ret = lttng_ht_del(ua_chan->ctx, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); delete_ust_app_ctx(sock, ua_ctx, app); } @@ -537,7 +570,7 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, cds_lfht_for_each_entry(ua_chan->events->ht, &iter.iter, ua_event, node.node) { ret = lttng_ht_del(ua_chan->events, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); delete_ust_app_event(sock, ua_event, app); } @@ -562,13 +595,24 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, /* Remove channel from application UST object descriptor. */ iter.iter.node = &ua_chan->ust_objd_node.node; ret = lttng_ht_del(app->ust_objd, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_object(sock, ua_chan->obj); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app sock %d release channel obj failed with ret %d", - sock, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app channel %s release failed. Application is dead: pid = %d, sock = %d", + ua_chan->name, app->pid, + app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app channel %s release failed. Communication time out: pid = %d, sock = %d", + ua_chan->name, app->pid, + app->sock); + } else { + ERR("UST app channel %s release failed with ret %d: pid = %d, sock = %d", + ua_chan->name, ret, app->pid, + app->sock); + } } lttng_fd_put(LTTNG_FD_APPS, 1); free(ua_chan->obj); @@ -624,8 +668,8 @@ ssize_t ust_app_push_metadata(struct ust_registry_session *registry, ssize_t ret_val; uint64_t metadata_key, metadata_version; - assert(registry); - assert(socket); + LTTNG_ASSERT(registry); + LTTNG_ASSERT(socket); metadata_key = registry->metadata_key; @@ -760,8 +804,8 @@ static int push_metadata(struct ust_registry_session *registry, ssize_t ret; struct consumer_socket *socket; - assert(registry); - assert(consumer); + LTTNG_ASSERT(registry); + LTTNG_ASSERT(consumer); pthread_mutex_lock(®istry->lock); if (registry->metadata_closed) { @@ -810,8 +854,8 @@ static int close_metadata(struct ust_registry_session *registry, uint64_t metadata_key; bool registry_was_already_closed; - assert(registry); - assert(consumer); + LTTNG_ASSERT(registry); + LTTNG_ASSERT(consumer); rcu_read_lock(); @@ -882,11 +926,11 @@ void delete_ust_app_session(int sock, struct ust_app_session *ua_sess, struct ust_app_channel *ua_chan; struct ust_registry_session *registry; - assert(ua_sess); + LTTNG_ASSERT(ua_sess); pthread_mutex_lock(&ua_sess->lock); - assert(!ua_sess->deleted); + LTTNG_ASSERT(!ua_sess->deleted); ua_sess->deleted = true; registry = get_session_registry(ua_sess); @@ -910,7 +954,7 @@ void delete_ust_app_session(int sock, struct ust_app_session *ua_sess, cds_lfht_for_each_entry(ua_sess->channels->ht, &iter.iter, ua_chan, node.node) { ret = lttng_ht_del(ua_sess->channels, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); delete_ust_app_channel(sock, ua_chan, app); } @@ -931,14 +975,23 @@ void delete_ust_app_session(int sock, struct ust_app_session *ua_sess, pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_release_handle(sock, ua_sess->handle); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app sock %d release session handle failed with ret %d", - sock, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app release session handle failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app release session handle failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app release session handle failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); + } } + /* Remove session from application UST object descriptor. */ iter.iter.node = &ua_sess->ust_objd_node.node; ret = lttng_ht_del(app->ust_sessions_objd, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); } pthread_mutex_unlock(&ua_sess->lock); @@ -986,7 +1039,7 @@ void delete_ust_app(struct ust_app *app) cds_lfht_for_each_entry (app->token_to_event_notifier_rule_ht->ht, &iter.iter, event_notifier_rule, node.node) { ret = lttng_ht_del(app->token_to_event_notifier_rule_ht, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); delete_ust_app_event_notifier_rule( app->sock, event_notifier_rule, app); @@ -1088,8 +1141,8 @@ static void destroy_app_session(struct ust_app *app, int ret; struct lttng_ht_iter iter; - assert(app); - assert(ua_sess); + LTTNG_ASSERT(app); + LTTNG_ASSERT(ua_sess); iter.iter.node = &ua_sess->node.node; ret = lttng_ht_del(app->sessions, &iter); @@ -1249,6 +1302,7 @@ static struct ust_app_event_notifier_rule *alloc_ust_app_event_notifier_rule( { enum lttng_event_rule_generate_exclusions_status generate_exclusion_status; + enum lttng_condition_status cond_status; struct ust_app_event_notifier_rule *ua_event_notifier_rule; struct lttng_condition *condition = NULL; const struct lttng_event_rule *event_rule = NULL; @@ -1265,14 +1319,14 @@ static struct ust_app_event_notifier_rule *alloc_ust_app_event_notifier_rule( ua_event_notifier_rule->token); condition = lttng_trigger_get_condition(trigger); - assert(condition); - assert(lttng_condition_get_type(condition) == + LTTNG_ASSERT(condition); + LTTNG_ASSERT(lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES); - assert(LTTNG_CONDITION_STATUS_OK == - lttng_condition_event_rule_matches_get_rule( - condition, &event_rule)); - assert(event_rule); + cond_status = lttng_condition_event_rule_matches_get_rule( + condition, &event_rule); + LTTNG_ASSERT(cond_status == LTTNG_CONDITION_STATUS_OK); + LTTNG_ASSERT(event_rule); ua_event_notifier_rule->error_counter_index = lttng_condition_event_rule_matches_get_error_counter_index(condition); @@ -1288,7 +1342,7 @@ static struct ust_app_event_notifier_rule *alloc_ust_app_event_notifier_rule( case LTTNG_EVENT_RULE_GENERATE_EXCLUSIONS_STATUS_NONE: break; default: - /* Error occured. */ + /* Error occurred. */ ERR("Failed to generate exclusions from trigger while allocating an event notifier rule"); goto error_put_trigger; } @@ -1362,7 +1416,7 @@ static struct lttng_ust_abi_filter_bytecode *create_ust_filter_bytecode_from_byt goto error; } - assert(sizeof(struct lttng_bytecode) == + LTTNG_ASSERT(sizeof(struct lttng_bytecode) == sizeof(struct lttng_ust_abi_filter_bytecode)); memcpy(filter, orig_f, sizeof(*filter) + orig_f->len); error: @@ -1386,7 +1440,7 @@ create_ust_capture_bytecode_from_bytecode(const struct lttng_bytecode *orig_f) goto error; } - assert(sizeof(struct lttng_bytecode) == + LTTNG_ASSERT(sizeof(struct lttng_bytecode) == sizeof(struct lttng_ust_abi_capture_bytecode)); memcpy(capture, orig_f, sizeof(*capture) + orig_f->len); error: @@ -1454,8 +1508,8 @@ static struct ust_app_event *find_ust_app_event(struct lttng_ht *ht, struct ust_app_event *event = NULL; struct ust_app_ht_key key; - assert(name); - assert(ht); + LTTNG_ASSERT(name); + LTTNG_ASSERT(ht); /* Setup key for event lookup. */ key.name = name; @@ -1491,7 +1545,7 @@ static struct ust_app_event_notifier_rule *find_ust_app_event_notifier_rule( struct lttng_ht_node_u64 *node; struct ust_app_event_notifier_rule *event_notifier_rule = NULL; - assert(ht); + LTTNG_ASSERT(ht); lttng_ht_lookup(ht, &token, &iter); node = lttng_ht_iter_get_node_u64(&iter); @@ -1525,17 +1579,17 @@ int create_ust_channel_context(struct ust_app_channel *ua_chan, ua_chan->obj, &ua_ctx->obj); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app create channel context failed for app (pid: %d) " - "with ret %d", app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { ret = 0; - DBG3("UST app add context failed. Application is dead."); + DBG3("UST app create channel context failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + ret = 0; + WARN("UST app create channel context failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app create channel context failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } goto error; } @@ -1572,17 +1626,17 @@ static int set_ust_object_filter(struct ust_app *app, ust_object); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app set object filter failed: object = %p of app pid = %d, ret = %d", - ust_object, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app set filter failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("Failed to set UST app object filter. Application is dead."); + WARN("UST app set filter failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app set filter failed with ret %d: pid = %d, sock = %d, object = %p", + ret, app->pid, app->sock, ust_object); } goto error; } @@ -1626,17 +1680,18 @@ static int set_ust_capture(struct ust_app *app, ust_object); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app set object capture failed: object = %p of app pid = %d, ret = %d", - ust_object, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app set capture failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("Failed to set UST app object capture. Application is dead."); + DBG3("UST app set capture failed. Communication timeout: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app event set capture failed with ret %d: pid = %d, sock = %d", + ret, app->pid, + app->sock); } goto error; @@ -1664,7 +1719,7 @@ struct lttng_ust_abi_event_exclusion *create_ust_exclusion_from_exclusion( goto end; } - assert(sizeof(struct lttng_event_exclusion) == + LTTNG_ASSERT(sizeof(struct lttng_event_exclusion) == sizeof(struct lttng_ust_abi_event_exclusion)); memcpy(ust_exclusion, exclusion, exclusion_alloc_size); end: @@ -1681,7 +1736,7 @@ static int set_ust_object_exclusions(struct ust_app *app, int ret; struct lttng_ust_abi_event_exclusion *ust_exclusions = NULL; - assert(exclusions && exclusions->count > 0); + LTTNG_ASSERT(exclusions && exclusions->count > 0); health_code_update(); @@ -1695,17 +1750,17 @@ static int set_ust_object_exclusions(struct ust_app *app, ret = lttng_ust_ctl_set_exclusion(app->sock, ust_exclusions, ust_object); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Failed to set UST app exclusions for object %p of app (pid: %d) " - "with ret %d", ust_object, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { ret = 0; - DBG3("Failed to set UST app object exclusions. Application is dead."); + DBG3("UST app event exclusion failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + ret = 0; + WARN("UST app event exclusion failed. Communication time out(pid: %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app event exclusions failed with ret %d: pid = %d, sock = %d, object = %p", + ret, app->pid, app->sock, ust_object); } goto error; } @@ -1732,22 +1787,22 @@ static int disable_ust_object(struct ust_app *app, ret = lttng_ust_ctl_disable(app->sock, object); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Failed to disable UST app object %p app (pid: %d) with ret %d", - object, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app disable object failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("Failed to disable UST app object. Application is dead."); + WARN("UST app disable object failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app disable object failed with ret %d: pid = %d, sock = %d, object = %p", + ret, app->pid, app->sock, object); } goto error; } - DBG2("UST app object %p disabled successfully for app (pid: %d)", + DBG2("UST app object %p disabled successfully for app: pid = %d", object, app->pid); error: @@ -1769,23 +1824,23 @@ static int disable_ust_channel(struct ust_app *app, ret = lttng_ust_ctl_disable(app->sock, ua_chan->obj); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app channel %s disable failed for app (pid: %d) " - "and session handle %d with ret %d", - ua_chan->name, app->pid, ua_sess->handle, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app disable channel failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("UST app disable channel failed. Application is dead."); + WARN("UST app disable channel failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app channel %s disable failed, session handle %d, with ret %d: pid = %d, sock = %d", + ua_chan->name, ua_sess->handle, ret, + app->pid, app->sock); } goto error; } - DBG2("UST app channel %s disabled successfully for app (pid: %d)", + DBG2("UST app channel %s disabled successfully for app: pid = %d", ua_chan->name, app->pid); error: @@ -1807,25 +1862,25 @@ static int enable_ust_channel(struct ust_app *app, ret = lttng_ust_ctl_enable(app->sock, ua_chan->obj); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app channel %s enable failed for app (pid: %d) " - "and session handle %d with ret %d", - ua_chan->name, app->pid, ua_sess->handle, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app channel %s enable failed. Application is dead: pid = %d, sock = %d", + ua_chan->name, app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("UST app enable channel failed. Application is dead."); + WARN("UST app channel %s enable failed. Communication time out: pid = %d, sock = %d", + ua_chan->name, app->pid, app->sock); + } else { + ERR("UST app channel %s enable failed, session handle %d, with ret %d: pid = %d, sock = %d", + ua_chan->name, ua_sess->handle, ret, + app->pid, app->sock); } goto error; } ua_chan->enabled = 1; - DBG2("UST app channel %s enabled successfully for app (pid: %d)", + DBG2("UST app channel %s enabled successfully for app: pid = %d", ua_chan->name, app->pid); error: @@ -1847,22 +1902,22 @@ static int enable_ust_object( ret = lttng_ust_ctl_enable(app->sock, ust_object); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app enable failed for object %p app (pid: %d) with ret %d", - ust_object, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app enable object failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("Failed to enable UST app object. Application is dead."); + WARN("UST app enable object failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app enable object failed with ret %d: pid = %d, sock = %d, object = %p", + ret, app->pid, app->sock, ust_object); } goto error; } - DBG2("UST app object %p enabled successfully for app (pid: %d)", + DBG2("UST app object %p enabled successfully for app: pid = %d", ust_object, app->pid); error: @@ -1881,9 +1936,9 @@ static int send_channel_pid_to_ust(struct ust_app *app, int ret; struct ust_app_stream *stream, *stmp; - assert(app); - assert(ua_sess); - assert(ua_chan); + LTTNG_ASSERT(app); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); health_code_update(); @@ -1895,6 +1950,13 @@ static int send_channel_pid_to_ust(struct ust_app *app, if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { ret = -ENOTCONN; /* Caused by app exiting. */ goto error; + } else if (ret == -EAGAIN) { + /* Caused by timeout. */ + WARN("Communication with application %d timed out on send_channel for channel \"%s\" of session \"%" PRIu64 "\".", + app->pid, ua_chan->name, ua_sess->tracing_id); + /* Treat this the same way as an application that is exiting. */ + ret = -ENOTCONN; + goto error; } else if (ret < 0) { goto error; } @@ -1905,8 +1967,18 @@ static int send_channel_pid_to_ust(struct ust_app *app, cds_list_for_each_entry_safe(stream, stmp, &ua_chan->streams.head, list) { ret = ust_consumer_send_stream_to_ust(app, ua_chan, stream); if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { - ret = -ENOTCONN; /* Caused by app exiting. */ + ret = -ENOTCONN; /* Caused by app exiting. */ goto error; + } else if (ret == -EAGAIN) { + /* Caused by timeout. */ + WARN("Communication with application %d timed out on send_stream for stream \"%s\" of channel \"%s\" of session \"%" PRIu64 "\".", + app->pid, stream->name, ua_chan->name, + ua_sess->tracing_id); + /* + * Treat this the same way as an application that is + * exiting. + */ + ret = -ENOTCONN; } else if (ret < 0) { goto error; } @@ -1941,25 +2013,25 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess, &ua_event->obj); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - abort(); - ERR("Error ustctl create event %s for app pid: %d with ret %d", - ua_event->attr.name, app->pid, ret); - } else { - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app create event failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("UST app create event failed. Application is dead."); + WARN("UST app create event failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app create event '%s' failed with ret %d: pid = %d, sock = %d", + ua_event->attr.name, ret, app->pid, + app->sock); } goto error; } ua_event->handle = ua_event->obj->handle; - DBG2("UST app event %s created successfully for pid:%d object: %p", + DBG2("UST app event %s created successfully for pid:%d object = %p", ua_event->attr.name, app->pid, ua_event->obj); health_code_update(); @@ -1996,7 +2068,7 @@ int create_ust_event(struct ust_app *app, struct ust_app_session *ua_sess, switch (ret) { case -LTTNG_UST_ERR_PERM: /* Code flow problem */ - assert(0); + abort(); case -LTTNG_UST_ERR_EXIST: /* It's OK for our use case. */ ret = 0; @@ -2039,7 +2111,7 @@ static int init_ust_event_notifier_from_event_rule( } else { const struct lttng_log_level_rule *log_level_rule; - assert(lttng_event_rule_get_type(rule) == + LTTNG_ASSERT(lttng_event_rule_get_type(rule) == LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT); status = lttng_event_rule_user_tracepoint_get_name_pattern(rule, &pattern); @@ -2070,7 +2142,7 @@ static int init_ust_event_notifier_from_event_rule( abort(); } - assert(llr_status == LTTNG_LOG_LEVEL_RULE_STATUS_OK); + LTTNG_ASSERT(llr_status == LTTNG_LOG_LEVEL_RULE_STATUS_OK); } else { /* At this point this is a fatal error. */ abort(); @@ -2109,22 +2181,22 @@ static int create_ust_event_notifier(struct ust_app *app, enum lttng_event_rule_type event_rule_type; health_code_update(); - assert(app->event_notifier_group.object); + LTTNG_ASSERT(app->event_notifier_group.object); condition = lttng_trigger_get_const_condition( ua_event_notifier_rule->trigger); - assert(condition); - assert(lttng_condition_get_type(condition) == + LTTNG_ASSERT(condition); + LTTNG_ASSERT(lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_EVENT_RULE_MATCHES); condition_status = lttng_condition_event_rule_matches_get_rule( condition, &event_rule); - assert(condition_status == LTTNG_CONDITION_STATUS_OK); + LTTNG_ASSERT(condition_status == LTTNG_CONDITION_STATUS_OK); - assert(event_rule); + LTTNG_ASSERT(event_rule); event_rule_type = lttng_event_rule_get_type(event_rule); - assert(event_rule_type == LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT || + LTTNG_ASSERT(event_rule_type == LTTNG_EVENT_RULE_TYPE_USER_TRACEPOINT || event_rule_type == LTTNG_EVENT_RULE_TYPE_JUL_LOGGING || event_rule_type == LTTNG_EVENT_RULE_TYPE_LOG4J_LOGGING || @@ -2142,28 +2214,26 @@ static int create_ust_event_notifier(struct ust_app *app, &ua_event_notifier_rule->obj); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Error ustctl create event notifier: name = '%s', app = '%s' (ppid: %d), ret = %d", - event_notifier.event.name, app->name, - app->ppid, ret); - } else { - /* - * This is normal behavior, an application can die - * during the creation process. Don't report an error so - * the execution can continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app create event notifier failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { ret = 0; - DBG3("UST app create event notifier failed (application is dead): app = '%s' (ppid = %d)", - app->name, app->ppid); + WARN("UST app create event notifier failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app create event notifier '%s' failed with ret %d: pid = %d, sock = %d", + event_notifier.event.name, ret, app->pid, + app->sock); } - goto error; } ua_event_notifier_rule->handle = ua_event_notifier_rule->obj->handle; - DBG2("UST app event notifier %s created successfully: app = '%s' (ppid: %d), object: %p", - event_notifier.event.name, app->name, app->ppid, + DBG2("UST app event notifier %s created successfully: app = '%s': pid = %d), object = %p", + event_notifier.event.name, app->name, app->pid, ua_event_notifier_rule->obj); health_code_update(); @@ -2190,7 +2260,7 @@ static int create_ust_event_notifier(struct ust_app *app, /* Set the capture bytecodes. */ cond_status = lttng_condition_event_rule_matches_get_capture_descriptor_count( condition, &capture_bytecode_count); - assert(cond_status == LTTNG_CONDITION_STATUS_OK); + LTTNG_ASSERT(cond_status == LTTNG_CONDITION_STATUS_OK); for (i = 0; i < capture_bytecode_count; i++) { const struct lttng_bytecode *capture_bytecode = @@ -2355,12 +2425,12 @@ static void shadow_copy_session(struct ust_app_session *ua_sess, app->bits_per_long); break; default: - assert(0); + abort(); goto error; } if (ret < 0) { PERROR("asprintf UST shadow copy session"); - assert(0); + abort(); goto error; } @@ -2383,12 +2453,12 @@ static void shadow_copy_session(struct ust_app_session *ua_sess, app->uid, app->bits_per_long); break; default: - assert(0); + abort(); goto error; } if (ret < 0) { PERROR("sprintf UST shadow copy session"); - assert(0); + abort(); goto error; } strncat(ua_sess->shm_path, tmp_shm_path, @@ -2447,8 +2517,8 @@ static int setup_buffer_reg_pid(struct ust_app_session *ua_sess, int ret = 0; struct buffer_reg_pid *reg_pid; - assert(ua_sess); - assert(app); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(app); rcu_read_lock(); @@ -2516,8 +2586,8 @@ static int setup_buffer_reg_uid(struct ltt_ust_session *usess, int ret = 0; struct buffer_reg_uid *reg_uid; - assert(usess); - assert(app); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(app); rcu_read_lock(); @@ -2589,9 +2659,9 @@ static int find_or_create_ust_app_session(struct ltt_ust_session *usess, int ret, created = 0; struct ust_app_session *ua_sess; - assert(usess); - assert(app); - assert(ua_sess_ptr); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(app); + LTTNG_ASSERT(ua_sess_ptr); health_code_update(); @@ -2627,7 +2697,7 @@ static int find_or_create_ust_app_session(struct ltt_ust_session *usess, } break; default: - assert(0); + abort(); ret = -EINVAL; goto error; } @@ -2639,18 +2709,17 @@ static int find_or_create_ust_app_session(struct ltt_ust_session *usess, ret = lttng_ust_ctl_create_session(app->sock); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Creating session for app pid %d with ret %d", - app->pid, ret); - } else { - DBG("UST app creating session failed. Application is dead"); - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. This will get flagged ENOTCONN and the - * caller will handle it. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG("UST app creating session failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + ret = 0; + } else if (ret == -EAGAIN) { + DBG("UST app creating session failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); ret = 0; + } else { + ERR("UST app creating session failed with ret %d: pid = %d, sock =%d", + ret, app->pid, app->sock); } delete_ust_app_session(-1, ua_sess, app); if (ret != -ENOMEM) { @@ -2700,8 +2769,8 @@ static int ht_match_ust_app_ctx(struct cds_lfht_node *node, const void *_key) struct ust_app_ctx *ctx; const struct lttng_ust_context_attr *key; - assert(node); - assert(_key); + LTTNG_ASSERT(node); + LTTNG_ASSERT(_key); ctx = caa_container_of(node, struct ust_app_ctx, node.node); key = _key; @@ -2752,8 +2821,8 @@ struct ust_app_ctx *find_ust_app_context(struct lttng_ht *ht, struct lttng_ht_node_ulong *node; struct ust_app_ctx *app_ctx = NULL; - assert(uctx); - assert(ht); + LTTNG_ASSERT(uctx); + LTTNG_ASSERT(ht); /* Lookup using the lttng_ust_context_type and a custom match fct. */ cds_lfht_lookup(ht->ht, ht->hash_fct((void *) uctx->ctx, lttng_ht_seed), @@ -2918,10 +2987,10 @@ static int do_consumer_create_channel(struct ltt_ust_session *usess, unsigned int nb_fd = 0; struct consumer_socket *socket; - assert(usess); - assert(ua_sess); - assert(ua_chan); - assert(registry); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); + LTTNG_ASSERT(registry); rcu_read_lock(); health_code_update(); @@ -3010,10 +3079,10 @@ static int duplicate_stream_object(struct buffer_reg_stream *reg_stream, { int ret; - assert(reg_stream); - assert(stream); + LTTNG_ASSERT(reg_stream); + LTTNG_ASSERT(stream); - /* Reserve the amount of file descriptor we need. */ + /* Duplicating a stream requires 2 new fds. Reserve them. */ ret = lttng_fd_get(LTTNG_FD_APPS, 2); if (ret < 0) { ERR("Exhausted number of available FD upon duplicate stream"); @@ -3046,10 +3115,10 @@ static int duplicate_channel_object(struct buffer_reg_channel *buf_reg_chan, { int ret; - assert(buf_reg_chan); - assert(ua_chan); + LTTNG_ASSERT(buf_reg_chan); + LTTNG_ASSERT(ua_chan); - /* Need two fds for the channel. */ + /* Duplicating a channel requires 1 new fd. Reserve it. */ ret = lttng_fd_get(LTTNG_FD_APPS, 1); if (ret < 0) { ERR("Exhausted number of available FD upon duplicate channel"); @@ -3086,8 +3155,8 @@ static int setup_buffer_reg_streams(struct buffer_reg_channel *buf_reg_chan, int ret = 0; struct ust_app_stream *stream, *stmp; - assert(buf_reg_chan); - assert(ua_chan); + LTTNG_ASSERT(buf_reg_chan); + LTTNG_ASSERT(ua_chan); DBG2("UST app setup buffer registry stream"); @@ -3131,8 +3200,8 @@ static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess, int ret; struct buffer_reg_channel *buf_reg_chan = NULL; - assert(reg_sess); - assert(ua_chan); + LTTNG_ASSERT(reg_sess); + LTTNG_ASSERT(ua_chan); DBG2("UST app creating buffer registry channel for %s", ua_chan->name); @@ -3141,7 +3210,7 @@ static int create_buffer_reg_channel(struct buffer_reg_session *reg_sess, if (ret < 0) { goto error_create; } - assert(buf_reg_chan); + LTTNG_ASSERT(buf_reg_chan); buf_reg_chan->consumer_key = ua_chan->key; buf_reg_chan->subbuf_size = ua_chan->attr.subbuf_size; buf_reg_chan->num_subbuf = ua_chan->attr.num_subbuf; @@ -3179,10 +3248,10 @@ static int setup_buffer_reg_channel(struct buffer_reg_session *reg_sess, { int ret; - assert(reg_sess); - assert(buf_reg_chan); - assert(ua_chan); - assert(ua_chan->obj); + LTTNG_ASSERT(reg_sess); + LTTNG_ASSERT(buf_reg_chan); + LTTNG_ASSERT(ua_chan); + LTTNG_ASSERT(ua_chan->obj); DBG2("UST app setup buffer registry channel for %s", ua_chan->name); @@ -3215,10 +3284,10 @@ static int send_channel_uid_to_ust(struct buffer_reg_channel *buf_reg_chan, int ret; struct buffer_reg_stream *reg_stream; - assert(buf_reg_chan); - assert(app); - assert(ua_sess); - assert(ua_chan); + LTTNG_ASSERT(buf_reg_chan); + LTTNG_ASSERT(app); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); DBG("UST app sending buffer registry channel to ust sock %d", app->sock); @@ -3232,6 +3301,13 @@ static int send_channel_uid_to_ust(struct buffer_reg_channel *buf_reg_chan, if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { ret = -ENOTCONN; /* Caused by app exiting. */ goto error; + } else if (ret == -EAGAIN) { + /* Caused by timeout. */ + WARN("Communication with application %d timed out on send_channel for channel \"%s\" of session \"%" PRIu64 "\".", + app->pid, ua_chan->name, ua_sess->tracing_id); + /* Treat this the same way as an application that is exiting. */ + ret = -ENOTCONN; + goto error; } else if (ret < 0) { goto error; } @@ -3250,10 +3326,21 @@ static int send_channel_uid_to_ust(struct buffer_reg_channel *buf_reg_chan, ret = ust_consumer_send_stream_to_ust(app, ua_chan, &stream); if (ret < 0) { - (void) release_ust_app_stream(-1, &stream, app); if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { ret = -ENOTCONN; /* Caused by app exiting. */ + } else if (ret == -EAGAIN) { + /* + * Caused by timeout. + * Treat this the same way as an application + * that is exiting. + */ + WARN("Communication with application %d timed out on send_stream for stream \"%s\" of channel \"%s\" of session \"%" PRIu64 "\".", + app->pid, stream.name, + ua_chan->name, + ua_sess->tracing_id); + ret = -ENOTCONN; } + (void) release_ust_app_stream(-1, &stream, app); goto error_stream_unlock; } @@ -3290,10 +3377,10 @@ static int create_channel_per_uid(struct ust_app *app, enum lttng_error_code notification_ret; struct ust_registry_channel *ust_reg_chan; - assert(app); - assert(usess); - assert(ua_sess); - assert(ua_chan); + LTTNG_ASSERT(app); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); DBG("UST app creating channel %s with per UID buffers", ua_chan->name); @@ -3303,7 +3390,7 @@ static int create_channel_per_uid(struct ust_app *app, * object. If none can be find, there is a code flow problem or a * teardown race. */ - assert(reg_uid); + LTTNG_ASSERT(reg_uid); buf_reg_chan = buffer_reg_channel_find(ua_chan->tracing_channel_id, reg_uid); @@ -3320,9 +3407,9 @@ static int create_channel_per_uid(struct ust_app *app, } session = session_find_by_id(ua_sess->tracing_id); - assert(session); - assert(pthread_mutex_trylock(&session->lock)); - assert(session_trylock_list()); + LTTNG_ASSERT(session); + LTTNG_ASSERT(pthread_mutex_trylock(&session->lock)); + LTTNG_ASSERT(session_trylock_list()); /* * Create the buffers on the consumer side. This call populates the @@ -3360,7 +3447,7 @@ static int create_channel_per_uid(struct ust_app *app, pthread_mutex_lock(®_uid->registry->reg.ust->lock); ust_reg_chan = ust_registry_channel_find(reg_uid->registry->reg.ust, ua_chan->tracing_channel_id); - assert(ust_reg_chan); + LTTNG_ASSERT(ust_reg_chan); ust_reg_chan->consumer_key = ua_chan->key; ust_reg_chan = NULL; pthread_mutex_unlock(®_uid->registry->reg.ust->lock); @@ -3415,10 +3502,10 @@ static int create_channel_per_pid(struct ust_app *app, uint64_t chan_reg_key; struct ust_registry_channel *ust_reg_chan; - assert(app); - assert(usess); - assert(ua_sess); - assert(ua_chan); + LTTNG_ASSERT(app); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); DBG("UST app creating channel %s with per PID buffers", ua_chan->name); @@ -3426,7 +3513,7 @@ static int create_channel_per_pid(struct ust_app *app, registry = get_session_registry(ua_sess); /* The UST app session lock is held, registry shall not be null. */ - assert(registry); + LTTNG_ASSERT(registry); /* Create and add a new channel registry to session. */ ret = ust_registry_channel_add(registry, ua_chan->key); @@ -3437,10 +3524,10 @@ static int create_channel_per_pid(struct ust_app *app, } session = session_find_by_id(ua_sess->tracing_id); - assert(session); + LTTNG_ASSERT(session); - assert(pthread_mutex_trylock(&session->lock)); - assert(session_trylock_list()); + LTTNG_ASSERT(pthread_mutex_trylock(&session->lock)); + LTTNG_ASSERT(session_trylock_list()); /* Create and get channel on the consumer side. */ ret = do_consumer_create_channel(usess, ua_sess, ua_chan, @@ -3463,7 +3550,7 @@ static int create_channel_per_pid(struct ust_app *app, chan_reg_key = ua_chan->key; pthread_mutex_lock(®istry->lock); ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key); - assert(ust_reg_chan); + LTTNG_ASSERT(ust_reg_chan); ust_reg_chan->consumer_key = ua_chan->key; pthread_mutex_unlock(®istry->lock); @@ -3509,11 +3596,11 @@ static int ust_app_channel_send(struct ust_app *app, { int ret; - assert(app); - assert(usess); - assert(usess->active); - assert(ua_sess); - assert(ua_chan); + LTTNG_ASSERT(app); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(usess->active); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(ua_chan); /* Handle buffer type before sending the channel to the application. */ switch (usess->buffer_type) { @@ -3534,7 +3621,7 @@ static int ust_app_channel_send(struct ust_app *app, break; } default: - assert(0); + abort(); ret = -EINVAL; goto error; } @@ -3648,8 +3735,8 @@ int create_ust_app_event(struct ust_app_session *ua_sess, add_unique_ust_app_event(ua_chan, ua_event); - DBG2("UST app create event completed: app = '%s' (ppid: %d)", - app->name, app->ppid); + DBG2("UST app create event completed: app = '%s' pid = %d", + app->name, app->pid); end: return ret; @@ -3701,8 +3788,8 @@ int create_ust_app_event_notifier_rule(struct lttng_trigger *trigger, lttng_ht_add_unique_u64(app->token_to_event_notifier_rule_ht, &ua_event_notifier_rule->node); - DBG2("UST app create token event rule completed: app = '%s' (ppid: %d), token = %" PRIu64, - app->name, app->ppid, lttng_trigger_get_tracer_token(trigger)); + DBG2("UST app create token event rule completed: app = '%s', pid = %d), token = %" PRIu64, + app->name, app->pid, lttng_trigger_get_tracer_token(trigger)); goto end; @@ -3727,13 +3814,13 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess, struct ust_registry_session *registry; struct ltt_session *session = NULL; - assert(ua_sess); - assert(app); - assert(consumer); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(app); + LTTNG_ASSERT(consumer); registry = get_session_registry(ua_sess); /* The UST app session is held registry shall not be null. */ - assert(registry); + LTTNG_ASSERT(registry); pthread_mutex_lock(®istry->lock); @@ -3776,10 +3863,10 @@ static int create_ust_app_metadata(struct ust_app_session *ua_sess, registry->metadata_key = metadata->key; session = session_find_by_id(ua_sess->tracing_id); - assert(session); + LTTNG_ASSERT(session); - assert(pthread_mutex_trylock(&session->lock)); - assert(session_trylock_list()); + LTTNG_ASSERT(pthread_mutex_trylock(&session->lock)); + LTTNG_ASSERT(session_trylock_list()); /* * Ask the metadata channel creation to the consumer. The metadata object @@ -3860,8 +3947,8 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) struct ust_app *lta = NULL; struct lttng_pipe *event_notifier_event_source_pipe = NULL; - assert(msg); - assert(sock >= 0); + LTTNG_ASSERT(msg); + LTTNG_ASSERT(sock >= 0); DBG3("UST app creating application for socket %d", sock); @@ -3884,15 +3971,15 @@ struct ust_app *ust_app_create(struct ust_register_msg *msg, int sock) */ ret = lttng_fd_get(LTTNG_FD_APPS, 2); if (ret) { - ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s' (ppid: %d)", - msg->name, (int) msg->ppid); + ERR("Failed to reserve two file descriptors for the event source pipe while creating a new application instance: app = '%s', pid = %d", + msg->name, (int) msg->pid); goto error; } event_notifier_event_source_pipe = lttng_pipe_open(FD_CLOEXEC); if (!event_notifier_event_source_pipe) { - PERROR("Failed to open application event source pipe: '%s' (ppid = %d)", - msg->name, msg->ppid); + PERROR("Failed to open application event source pipe: '%s' (pid = %d)", + msg->name, msg->pid); goto error; } @@ -3956,8 +4043,8 @@ error: */ void ust_app_add(struct ust_app *app) { - assert(app); - assert(app->notify_sock >= 0); + LTTNG_ASSERT(app); + LTTNG_ASSERT(app->notify_sock >= 0); app->registration_time = time(NULL); @@ -3980,8 +4067,8 @@ void ust_app_add(struct ust_app *app) lttng_ht_node_init_ulong(&app->notify_sock_n, app->notify_sock); lttng_ht_add_unique_ulong(ust_app_ht_by_notify_sock, &app->notify_sock_n); - DBG("App registered with pid:%d ppid:%d uid:%d gid:%d sock:%d name:%s " - "notify_sock:%d (version %d.%d)", app->pid, app->ppid, app->uid, + DBG("App registered with pid:%d ppid:%d uid:%d gid:%d sock =%d name:%s " + "notify_sock =%d (version %d.%d)", app->pid, app->ppid, app->uid, app->gid, app->sock, app->name, app->notify_sock, app->v_major, app->v_minor); @@ -3998,16 +4085,21 @@ int ust_app_version(struct ust_app *app) { int ret; - assert(app); + LTTNG_ASSERT(app); pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_tracer_version(app->sock, &app->version); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) { - ERR("UST app %d version failed with ret %d", app->sock, ret); + if (ret == -LTTNG_UST_ERR_EXITING || ret == -EPIPE) { + DBG3("UST app version failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app version failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); } else { - DBG3("UST app %d version failed. Application is dead", app->sock); + ERR("UST app version failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } } @@ -4038,7 +4130,7 @@ int ust_app_setup_event_notifier_group(struct ust_app *app) enum lttng_error_code lttng_ret; enum event_notifier_error_accounting_status event_notifier_error_accounting_status; - assert(app); + LTTNG_ASSERT(app); if (!ust_app_supports_notifiers(app)) { ret = -ENOSYS; @@ -4054,21 +4146,25 @@ int ust_app_setup_event_notifier_group(struct ust_app *app) event_pipe_write_fd, &event_notifier_group); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) { - ERR("Failed to create application event notifier group: ret = %d, app socket fd = %d, event_pipe_write_fd = %d", - ret, app->sock, event_pipe_write_fd); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + ret = 0; + DBG3("UST app create event notifier group failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + ret = 0; + WARN("UST app create event notifier group failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); } else { - DBG("Failed to create application event notifier group (application is dead): app socket fd = %d", - app->sock); + ERR("UST app create event notifier group failed with ret %d: pid = %d, sock = %d, event_pipe_write_fd: %d", + ret, app->pid, app->sock, event_pipe_write_fd); } - goto error; } ret = lttng_pipe_write_close(app->event_notifier_group.event_pipe); if (ret) { - ERR("Failed to close write end of the application's event source pipe: app = '%s' (ppid = %d)", - app->name, app->ppid); + ERR("Failed to close write end of the application's event source pipe: app = '%s' (pid = %d)", + app->name, app->pid); goto error; } @@ -4098,13 +4194,13 @@ int ust_app_setup_event_notifier_group(struct ust_app *app) case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_OK: break; case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_UNSUPPORTED: - DBG3("Failed to setup event notifier error accounting (application does not support notifier error accounting): app socket fd = %d, app name = '%s', app ppid = %d", - app->sock, app->name, (int) app->ppid); + DBG3("Failed to setup event notifier error accounting (application does not support notifier error accounting): app socket fd = %d, app name = '%s', app pid = %d", + app->sock, app->name, (int) app->pid); ret = 0; goto error_accounting; case EVENT_NOTIFIER_ERROR_ACCOUNTING_STATUS_APP_DEAD: - DBG3("Failed to setup event notifier error accounting (application is dead): app socket fd = %d, app name = '%s', app ppid = %d", - app->sock, app->name, (int) app->ppid); + DBG3("Failed to setup event notifier error accounting (application is dead): app socket fd = %d, app name = '%s', app pid = %d", + app->sock, app->name, (int) app->pid); ret = 0; goto error_accounting; default: @@ -4151,7 +4247,7 @@ void ust_app_unregister(int sock) /* Get the node reference for a call_rcu */ lttng_ht_lookup(ust_app_ht_by_sock, (void *)((unsigned long) sock), &ust_app_sock_iter); node = lttng_ht_iter_get_node_ulong(&ust_app_sock_iter); - assert(node); + LTTNG_ASSERT(node); lta = caa_container_of(node, struct ust_app, sock_n); DBG("PID %d unregistering with sock %d", lta->pid, sock); @@ -4221,7 +4317,7 @@ void ust_app_unregister(int sock) /* Remove application from PID hash table */ ret = lttng_ht_del(ust_app_ht_by_sock, &ust_app_sock_iter); - assert(!ret); + LTTNG_ASSERT(!ret); /* * Remove application from notify hash table. The thread handling the @@ -4306,11 +4402,6 @@ int ust_app_list_events(struct lttng_event **events) app->sock, ret); } else { DBG3("UST app tp list get failed. Application is dead"); - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. Continue normal execution. - */ break; } free(tmp_event); @@ -4365,8 +4456,17 @@ int ust_app_list_events(struct lttng_event **events) } ret = lttng_ust_ctl_release_handle(app->sock, handle); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) { - ERR("Error releasing app handle for app %d with ret %d", app->sock, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("Error releasing app handle. Application died: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("Error releasing app handle. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("Error releasing app handle with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); + } } } @@ -4437,11 +4537,6 @@ int ust_app_list_event_fields(struct lttng_event_field **fields) app->sock, ret); } else { DBG3("UST app tp list field failed. Application is dead"); - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. Reset list and count for next app. - */ break; } free(tmp_event); @@ -4544,7 +4639,7 @@ void ust_app_clean_list(void) * Assert that all notifiers are gone as all triggers * are unregistered prior to this clean-up. */ - assert(lttng_ht_get_count(app->token_to_event_notifier_rule_ht) == 0); + LTTNG_ASSERT(lttng_ht_get_count(app->token_to_event_notifier_rule_ht) == 0); ust_app_notify_sock_unregister(app->notify_sock); } @@ -4553,7 +4648,7 @@ void ust_app_clean_list(void) if (ust_app_ht) { cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) { ret = lttng_ht_del(ust_app_ht, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); call_rcu(&app->pid_n.head, delete_ust_app_rcu); } } @@ -4563,7 +4658,7 @@ void ust_app_clean_list(void) cds_lfht_for_each_entry(ust_app_ht_by_sock->ht, &iter.iter, app, sock_n.node) { ret = lttng_ht_del(ust_app_ht_by_sock, &iter); - assert(!ret); + LTTNG_ASSERT(!ret); } } @@ -4614,7 +4709,7 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess, struct ust_app_session *ua_sess; struct ust_app_channel *ua_chan; - assert(usess->active); + LTTNG_ASSERT(usess->active); DBG2("UST app disabling channel %s from global domain for session id %" PRIu64, uchan->name, usess->id); @@ -4639,11 +4734,11 @@ int ust_app_disable_channel_glb(struct ltt_ust_session *usess, lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter); ua_chan_node = lttng_ht_iter_get_node_str(&uiter); /* If the session if found for the app, the channel must be there */ - assert(ua_chan_node); + LTTNG_ASSERT(ua_chan_node); ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); /* The channel must not be already disabled */ - assert(ua_chan->enabled == 1); + LTTNG_ASSERT(ua_chan->enabled == 1); /* Disable channel onto application */ ret = disable_ust_app_channel(ua_sess, ua_chan, app); @@ -4668,7 +4763,7 @@ int ust_app_enable_channel_glb(struct ltt_ust_session *usess, struct ust_app *app; struct ust_app_session *ua_sess; - assert(usess->active); + LTTNG_ASSERT(usess->active); DBG2("UST app enabling channel %s to global domain for session id %" PRIu64, uchan->name, usess->id); @@ -4714,7 +4809,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess, struct ust_app_channel *ua_chan; struct ust_app_event *ua_event; - assert(usess->active); + LTTNG_ASSERT(usess->active); DBG("UST app disabling event %s for all apps in channel " "%s for session id %" PRIu64, uevent->attr.name, uchan->name, usess->id); @@ -4776,7 +4871,7 @@ int ust_app_channel_create(struct ltt_ust_session *usess, int ret = 0; struct ust_app_channel *ua_chan = NULL; - assert(ua_sess); + LTTNG_ASSERT(ua_sess); ASSERT_LOCKED(ua_sess->lock); if (!strncmp(uchan->name, DEFAULT_METADATA_NAME, @@ -4856,7 +4951,7 @@ int ust_app_enable_event_glb(struct ltt_ust_session *usess, struct ust_app_channel *ua_chan; struct ust_app_event *ua_event; - assert(usess->active); + LTTNG_ASSERT(usess->active); DBG("UST app enabling event %s for all apps for session id %" PRIu64, uevent->attr.name, usess->id); @@ -4942,7 +5037,7 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess, struct ust_app_session *ua_sess; struct ust_app_channel *ua_chan; - assert(usess->active); + LTTNG_ASSERT(usess->active); DBG("UST app creating event %s for all apps for session id %" PRIu64, uevent->attr.name, usess->id); @@ -4974,7 +5069,7 @@ int ust_app_create_event_glb(struct ltt_ust_session *usess, lttng_ht_lookup(ua_sess->channels, (void *)uchan->name, &uiter); ua_chan_node = lttng_ht_iter_get_node_str(&uiter); /* If the channel is not found, there is a code flow error */ - assert(ua_chan_node); + LTTNG_ASSERT(ua_chan_node); ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); @@ -5046,18 +5141,20 @@ skip_setup: ret = lttng_ust_ctl_start_session(app->sock, ua_sess->handle); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Error starting tracing for app pid: %d (ret: %d)", - app->pid, ret); - } else { - DBG("UST app start session failed. Application is dead."); - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app start session failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); pthread_mutex_unlock(&ua_sess->lock); goto end; + } else if (ret == -EAGAIN) { + WARN("UST app start session failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + pthread_mutex_unlock(&ua_sess->lock); + goto end; + + } else { + ERR("UST app start session failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } goto error_unlock; } @@ -5074,9 +5171,17 @@ skip_setup: pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_wait_quiescent(app->sock); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app wait quiescent failed for app pid %d ret %d", - app->pid, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app wait quiescent failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app wait quiescent failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); + } else { + ERR("UST app wait quiescent failed with ret %d: pid %d, sock = %d", + ret, app->pid, app->sock); + } } end: @@ -5138,17 +5243,18 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) ret = lttng_ust_ctl_stop_session(app->sock, ua_sess->handle); pthread_mutex_unlock(&app->sock_lock); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("Error stopping tracing for app pid: %d (ret: %d)", - app->pid, ret); - } else { - DBG("UST app stop session failed. Application is dead."); - /* - * This is normal behavior, an application can die during the - * creation process. Don't report an error so the execution can - * continue normally. - */ + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app stop session failed. Application is dead: pid = %d, sock = %d", + app->pid, app->sock); + goto end_unlock; + } else if (ret == -EAGAIN) { + WARN("UST app stop session failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); goto end_unlock; + + } else { + ERR("UST app stop session failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } goto error_rcu_unlock; } @@ -5160,9 +5266,17 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_wait_quiescent(app->sock); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app wait quiescent failed for app pid %d ret %d", - app->pid, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app wait quiescent failed. Application is dead: pid= %d, sock = %d)", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app wait quiescent failed. Communication time out: pid= %d, sock = %d)", + app->pid, app->sock); + } else { + ERR("UST app wait quiescent failed with ret %d: pid= %d, sock = %d)", + ret, app->pid, app->sock); + } } health_code_update(); @@ -5170,7 +5284,7 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) registry = get_session_registry(ua_sess); /* The UST app session is held registry shall not be null. */ - assert(registry); + LTTNG_ASSERT(registry); /* Push metadata for application before freeing the application. */ (void) push_metadata(registry, ua_sess->consumer); @@ -5234,7 +5348,7 @@ int ust_app_flush_app_session(struct ust_app *app, break; case LTTNG_BUFFER_PER_UID: default: - assert(0); + abort(); break; } @@ -5317,7 +5431,7 @@ int ust_app_flush_session(struct ltt_ust_session *usess) } default: ret = -1; - assert(0); + abort(); break; } @@ -5377,7 +5491,7 @@ int ust_app_clear_quiescent_app_session(struct ust_app *app, break; case LTTNG_BUFFER_PER_UID: default: - assert(0); + abort(); ret = -1; break; } @@ -5466,7 +5580,7 @@ int ust_app_clear_quiescent_session(struct ltt_ust_session *usess) } default: ret = -1; - assert(0); + abort(); break; } @@ -5510,9 +5624,17 @@ static int destroy_trace(struct ltt_ust_session *usess, struct ust_app *app) pthread_mutex_lock(&app->sock_lock); ret = lttng_ust_ctl_wait_quiescent(app->sock); pthread_mutex_unlock(&app->sock_lock); - if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app wait quiescent failed for app pid %d ret %d", - app->pid, ret); + if (ret < 0) { + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app wait quiescent failed. Application is dead: pid= %d, sock = %d)", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app wait quiescent failed. Communication time out: pid= %d, sock = %d)", + app->pid, app->sock); + } else { + ERR("UST app wait quiescent failed with ret %d: pid= %d, sock = %d)", + ret, app->pid, app->sock); + } } end: rcu_read_unlock(); @@ -5712,7 +5834,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app) goto end; } - assert(triggers); + LTTNG_ASSERT(triggers); t_status = lttng_triggers_get_count(triggers, &count); if (t_status != LTTNG_TRIGGER_STATUS_OK) { @@ -5728,7 +5850,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app) uint64_t token; trigger = lttng_triggers_borrow_mutable_at_index(triggers, i); - assert(trigger); + LTTNG_ASSERT(trigger); token = lttng_trigger_get_tracer_token(trigger); condition = lttng_trigger_get_condition(trigger); @@ -5742,7 +5864,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app) condition_status = lttng_condition_event_rule_matches_borrow_rule_mutable( condition, &event_rule); - assert(condition_status == LTTNG_CONDITION_STATUS_OK); + LTTNG_ASSERT(condition_status == LTTNG_CONDITION_STATUS_OK); if (lttng_event_rule_get_domain_type(event_rule) == LTTNG_DOMAIN_KERNEL) { /* Skip kernel related triggers. */ @@ -5782,7 +5904,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app) lttng_triggers_get_at_index( triggers, i); - assert(trigger); + LTTNG_ASSERT(trigger); notification_thread_token = lttng_trigger_get_tracer_token(trigger); @@ -5804,7 +5926,7 @@ void ust_app_synchronize_event_notifier_rules(struct ust_app *app) */ ret = lttng_ht_del(app->token_to_event_notifier_rule_ht, &app_trigger_iter); - assert(ret == 0); + LTTNG_ASSERT(ret == 0); /* Callee logs errors. */ (void) disable_ust_object(app, event_notifier_rule->obj); @@ -5832,9 +5954,9 @@ void ust_app_synchronize_all_channels(struct ltt_ust_session *usess, struct cds_lfht_iter uchan_iter; struct ltt_ust_channel *uchan; - assert(usess); - assert(ua_sess); - assert(app); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(ua_sess); + LTTNG_ASSERT(app); cds_lfht_for_each_entry(usess->domain_global.channels->ht, &uchan_iter, uchan, node.node) { @@ -5898,7 +6020,7 @@ void ust_app_synchronize(struct ltt_ust_session *usess, * The application's configuration should only be synchronized for * active sessions. */ - assert(usess->active); + LTTNG_ASSERT(usess->active); ret = find_or_create_ust_app_session(usess, app, &ua_sess, NULL); if (ret < 0) { @@ -5908,7 +6030,7 @@ void ust_app_synchronize(struct ltt_ust_session *usess, } goto end; } - assert(ua_sess); + LTTNG_ASSERT(ua_sess); pthread_mutex_lock(&ua_sess->lock); if (ua_sess->deleted) { @@ -5962,8 +6084,8 @@ void ust_app_global_destroy(struct ltt_ust_session *usess, struct ust_app *app) */ void ust_app_global_update(struct ltt_ust_session *usess, struct ust_app *app) { - assert(usess); - assert(usess->active); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(usess->active); DBG2("UST app global update for app sock %d for session id %" PRIu64, app->sock, usess->id); @@ -5998,16 +6120,16 @@ void ust_app_global_update(struct ltt_ust_session *usess, struct ust_app *app) */ void ust_app_global_update_event_notifier_rules(struct ust_app *app) { - DBG2("UST application global event notifier rules update: app = '%s' (ppid: %d)", - app->name, app->ppid); + DBG2("UST application global event notifier rules update: app = '%s', pid = %d)", + app->name, app->pid); if (!app->compatible || !ust_app_supports_notifiers(app)) { return; } if (app->event_notifier_group.object == NULL) { - WARN("UST app global update of event notifiers for app skipped since communication handle is null: app = '%s' (ppid: %d)", - app->name, app->ppid); + WARN("UST app global update of event notifiers for app skipped since communication handle is null: app = '%s' pid = %d)", + app->name, app->pid); return; } @@ -6055,7 +6177,7 @@ int ust_app_add_ctx_channel_glb(struct ltt_ust_session *usess, struct ust_app_session *ua_sess; struct ust_app *app; - assert(usess->active); + LTTNG_ASSERT(usess->active); rcu_read_lock(); cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) { @@ -6108,7 +6230,7 @@ int ust_app_recv_registration(int sock, struct ust_register_msg *msg) int ret; uint32_t pid, ppid, uid, gid; - assert(msg); + LTTNG_ASSERT(msg); ret = lttng_ust_ctl_recv_reg_msg(sock, &msg->type, &msg->major, &msg->minor, &pid, &ppid, &uid, &gid, @@ -6159,7 +6281,7 @@ static struct ust_app_session *find_session_by_objd(struct ust_app *app, struct lttng_ht_iter iter; struct ust_app_session *ua_sess = NULL; - assert(app); + LTTNG_ASSERT(app); lttng_ht_lookup(app->ust_sessions_objd, (void *)((unsigned long) objd), &iter); node = lttng_ht_iter_get_node_ulong(&iter); @@ -6186,7 +6308,7 @@ static struct ust_app_channel *find_channel_by_objd(struct ust_app *app, struct lttng_ht_iter iter; struct ust_app_channel *ua_chan = NULL; - assert(app); + LTTNG_ASSERT(app); lttng_ht_lookup(app->ust_objd, (void *)((unsigned long) objd), &iter); node = lttng_ht_iter_get_node_ulong(&iter); @@ -6229,7 +6351,7 @@ static int reply_ust_register_channel(int sock, int cobjd, if (!app) { DBG("Application socket %d is being torn down. Abort event notify", sock); - ret = 0; + ret = -1; goto error_rcu_unlock; } @@ -6241,7 +6363,7 @@ static int reply_ust_register_channel(int sock, int cobjd, goto error_rcu_unlock; } - assert(ua_chan->session); + LTTNG_ASSERT(ua_chan->session); ua_sess = ua_chan->session; /* Get right session registry depending on the session buffer type. */ @@ -6262,7 +6384,7 @@ static int reply_ust_register_channel(int sock, int cobjd, pthread_mutex_lock(®istry->lock); ust_reg_chan = ust_registry_channel_find(registry, chan_reg_key); - assert(ust_reg_chan); + LTTNG_ASSERT(ust_reg_chan); if (!ust_reg_chan->register_done) { /* @@ -6293,15 +6415,20 @@ static int reply_ust_register_channel(int sock, int cobjd, reply: DBG3("UST app replying to register channel key %" PRIu64 - " with id %u, type: %d, ret: %d", chan_reg_key, chan_id, type, + " with id %u, type = %d, ret = %d", chan_reg_key, chan_id, type, ret_code); ret = lttng_ust_ctl_reply_register_channel(sock, chan_id, type, ret_code); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app reply channel failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app reply channel failed. Application died: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app reply channel failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); } else { - DBG3("UST app reply channel failed. Application died"); + ERR("UST app reply channel failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } goto error; } @@ -6345,7 +6472,7 @@ static int add_event_ust_registry(int sock, int sobjd, int cobjd, char *name, if (!app) { DBG("Application socket %d is being torn down. Abort event notify", sock); - ret = 0; + ret = -1; goto error_rcu_unlock; } @@ -6357,7 +6484,7 @@ static int add_event_ust_registry(int sock, int sobjd, int cobjd, char *name, goto error_rcu_unlock; } - assert(ua_chan->session); + LTTNG_ASSERT(ua_chan->session); ua_sess = ua_chan->session; registry = get_session_registry(ua_sess); @@ -6395,10 +6522,15 @@ static int add_event_ust_registry(int sock, int sobjd, int cobjd, char *name, */ ret = lttng_ust_ctl_reply_register_event(sock, event_id, ret_code); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app reply event failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app reply event failed. Application died: pid = %d, sock = %d.", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app reply event failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); } else { - DBG3("UST app reply event failed. Application died"); + ERR("UST app reply event failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } /* * No need to wipe the create event since the application socket will @@ -6446,6 +6578,7 @@ static int add_enum_ust_registry(int sock, int sobjd, char *name, DBG("Application socket %d is being torn down. Aborting enum registration", sock); free(entries); + ret = -1; goto error_rcu_unlock; } @@ -6483,10 +6616,15 @@ static int add_enum_ust_registry(int sock, int sobjd, char *name, */ ret = lttng_ust_ctl_reply_register_enum(sock, enum_id, ret_code); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app reply enum failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app reply enum failed. Application died: pid = %d, sock = %d", + app->pid, app->sock); + } else if (ret == -EAGAIN) { + WARN("UST app reply enum failed. Communication time out: pid = %d, sock = %d", + app->pid, app->sock); } else { - DBG3("UST app reply enum failed. Application died"); + ERR("UST app reply enum failed with ret %d: pid = %d, sock = %d", + ret, app->pid, app->sock); } /* * No need to wipe the create enum since the application socket will @@ -6518,10 +6656,15 @@ int ust_app_recv_notify(int sock) ret = lttng_ust_ctl_recv_notify(sock, &cmd); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app recv notify failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app recv notify failed. Application died: sock = %d", + sock); + } else if (ret == -EAGAIN) { + WARN("UST app recv notify failed. Communication time out: sock = %d", + sock); } else { - DBG3("UST app recv notify failed. Application died"); + ERR("UST app recv notify failed with ret %d: sock = %d", + ret, sock); } goto error; } @@ -6540,10 +6683,15 @@ int ust_app_recv_notify(int sock) &loglevel_value, &sig, &nr_fields, &fields, &model_emf_uri); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app recv event failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app recv event failed. Application died: sock = %d", + sock); + } else if (ret == -EAGAIN) { + WARN("UST app recv event failed. Communication time out: sock = %d", + sock); } else { - DBG3("UST app recv event failed. Application died"); + ERR("UST app recv event failed with ret %d: sock = %d", + ret, sock); } goto error; } @@ -6573,10 +6721,15 @@ int ust_app_recv_notify(int sock) ret = lttng_ust_ctl_recv_register_channel(sock, &sobjd, &cobjd, &nr_fields, &fields); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app recv channel failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app recv channel failed. Application died: sock = %d", + sock); + } else if (ret == -EAGAIN) { + WARN("UST app recv channel failed. Communication time out: sock = %d", + sock); } else { - DBG3("UST app recv channel failed. Application died"); + ERR("UST app recv channel failed with ret %d: sock = %d)", + ret, sock); } goto error; } @@ -6606,10 +6759,15 @@ int ust_app_recv_notify(int sock) ret = lttng_ust_ctl_recv_register_enum(sock, &sobjd, name, &entries, &nr_entries); if (ret < 0) { - if (ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) { - ERR("UST app recv enum failed with ret %d", ret); + if (ret == -EPIPE || ret == -LTTNG_UST_ERR_EXITING) { + DBG3("UST app recv enum failed. Application died: sock = %d", + sock); + } else if (ret == -EAGAIN) { + WARN("UST app recv enum failed. Communication time out: sock = %d", + sock); } else { - DBG3("UST app recv enum failed. Application died"); + ERR("UST app recv enum failed with ret %d: sock = %d", + ret, sock); } goto error; } @@ -6625,7 +6783,7 @@ int ust_app_recv_notify(int sock) } default: /* Should NEVER happen. */ - assert(0); + abort(); } error: @@ -6648,7 +6806,7 @@ void ust_app_notify_sock_unregister(int sock) struct ust_app *app; struct ust_app_notify_sock_obj *obj; - assert(sock >= 0); + LTTNG_ASSERT(sock >= 0); rcu_read_lock(); @@ -6738,8 +6896,8 @@ enum lttng_error_code ust_app_snapshot_record( struct ust_app *app; char *trace_path = NULL; - assert(usess); - assert(output); + LTTNG_ASSERT(usess); + LTTNG_ASSERT(output); rcu_read_lock(); @@ -6888,7 +7046,7 @@ enum lttng_error_code ust_app_snapshot_record( break; } default: - assert(0); + abort(); break; } @@ -6908,7 +7066,7 @@ uint64_t ust_app_get_size_one_more_packet_per_stream( struct ust_app *app; struct lttng_ht_iter iter; - assert(usess); + LTTNG_ASSERT(usess); switch (usess->buffer_type) { case LTTNG_BUFFER_PER_UID: @@ -6964,7 +7122,7 @@ uint64_t ust_app_get_size_one_more_packet_per_stream( break; } default: - assert(0); + abort(); break; } @@ -7034,7 +7192,7 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess, lttng_ht_lookup(ua_sess->channels, (void *) uchan->name, &uiter); ua_chan_node = lttng_ht_iter_get_node_str(&uiter); /* If the session is found for the app, the channel must be there */ - assert(ua_chan_node); + LTTNG_ASSERT(ua_chan_node); ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node); @@ -7142,7 +7300,7 @@ enum lttng_error_code ust_app_rotate_session(struct ltt_session *session) struct ust_app *app; struct ltt_ust_session *usess = session->ust_session; - assert(usess); + LTTNG_ASSERT(usess); rcu_read_lock(); @@ -7270,7 +7428,7 @@ enum lttng_error_code ust_app_rotate_session(struct ltt_session *session) break; } default: - assert(0); + abort(); break; } @@ -7290,7 +7448,7 @@ enum lttng_error_code ust_app_create_channel_subdirectories( char *pathname_index; int fmt_ret; - assert(usess->current_trace_chunk); + LTTNG_ASSERT(usess->current_trace_chunk); rcu_read_lock(); switch (usess->buffer_type) { @@ -7401,7 +7559,7 @@ enum lttng_error_code ust_app_clear_session(struct ltt_session *session) struct ust_app *app; struct ltt_ust_session *usess = session->ust_session; - assert(usess); + LTTNG_ASSERT(usess); rcu_read_lock(); @@ -7514,7 +7672,7 @@ enum lttng_error_code ust_app_clear_session(struct ltt_session *session) break; } default: - assert(0); + abort(); break; } @@ -7558,7 +7716,7 @@ enum lttng_error_code ust_app_open_packets(struct ltt_session *session) struct lttng_ht_iter iter; struct ltt_ust_session *usess = session->ust_session; - assert(usess); + LTTNG_ASSERT(usess); rcu_read_lock();