X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=e1d0c40e9cf03e34b935a171b1ca8d67686f55f5;hb=bdd88757eedddd53dea46645574f218094573c74;hp=3accde269509e0e8b66c3b25c35b86a90289fb5b;hpb=d42f20df7f4ef656485ebb19c94a35152cb386f7;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 3accde269..e1d0c40e9 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -1212,11 +1212,12 @@ error: } /* - * Create UST app channel and create it on the tracer. + * Create UST app channel and create it on the tracer. Set ua_chanp of the + * newly created channel if not NULL. */ -static struct ust_app_channel *create_ust_app_channel( - struct ust_app_session *ua_sess, struct ltt_ust_channel *uchan, - struct ust_app *app) +static int create_ust_app_channel(struct ust_app_session *ua_sess, + struct ltt_ust_channel *uchan, struct ust_app *app, + struct ust_app_channel **ua_chanp) { int ret = 0; struct lttng_ht_iter iter; @@ -1234,6 +1235,7 @@ static struct ust_app_channel *create_ust_app_channel( ua_chan = alloc_ust_app_channel(uchan->name, &uchan->attr); if (ua_chan == NULL) { /* Only malloc can fail here */ + ret = -ENOMEM; goto error; } shadow_copy_channel(ua_chan, uchan); @@ -1245,17 +1247,23 @@ static struct ust_app_channel *create_ust_app_channel( goto error; } + /* Only add the channel if successful on the tracer side. */ lttng_ht_add_unique_str(ua_sess->channels, &ua_chan->node); DBG2("UST app create channel %s for PID %d completed", ua_chan->name, app->pid); end: - return ua_chan; + if (ua_chanp) { + *ua_chanp = ua_chan; + } + + /* Everything went well. */ + return 0; error: delete_ust_app_channel(-1, ua_chan); - return NULL; + return ret; } /* @@ -2021,7 +2029,6 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess, struct lttng_ht_iter iter; struct ust_app *app; struct ust_app_session *ua_sess; - struct ust_app_channel *ua_chan; /* Very wrong code flow */ assert(usess); @@ -2049,26 +2056,27 @@ int ust_app_create_channel_glb(struct ltt_ust_session *usess, ua_sess = create_ust_app_session(usess, app); if (ua_sess == NULL) { /* The malloc() failed. */ - ret = -1; - goto error; + ret = -ENOMEM; + goto error_rcu_unlock; } else if (ua_sess == (void *) -1UL) { - /* The application's socket is not valid. Contiuing */ - ret = -1; + /* + * The application's socket is not valid. Either a bad socket or a + * timeout on it. We can't inform yet the caller that for a + * specific app, the session failed so we continue here. + */ continue; } - /* Create channel onto application */ - ua_chan = create_ust_app_channel(ua_sess, uchan, app); - if (ua_chan == NULL) { - /* Major problem here and it's maybe the tracer or malloc() */ - ret = -1; - goto error; + /* Create channel onto application. We don't need the chan ref. */ + ret = create_ust_app_channel(ua_sess, uchan, app, NULL); + if (ret < 0 && ret == -ENOMEM) { + /* No more memory is a fatal error. Stop right now. */ + goto error_rcu_unlock; } } +error_rcu_unlock: rcu_read_unlock(); - -error: return ret; } @@ -2244,9 +2252,6 @@ int ust_app_start_trace(struct ltt_ust_session *usess, struct ust_app *app) } } - /* Indicate that the session has been started once */ - ua_sess->started = 1; - ret = create_ust_app_metadata(ua_sess, usess->pathname, app); if (ret < 0) { ret = LTTNG_ERR_UST_META_FAIL; @@ -2344,6 +2349,9 @@ skip_setup: goto error_rcu_unlock; } + /* Indicate that the session has been started once */ + ua_sess->started = 1; + health_code_update(&health_thread_cmd); /* Quiescent wait after starting trace */ @@ -2385,10 +2393,13 @@ int ust_app_stop_trace(struct ltt_ust_session *usess, struct ust_app *app) /* * If started = 0, it means that stop trace has been called for a session - * that was never started. This is a code flow error and should never - * happen. + * that was never started. It's possible since we can have a fail start + * from either the application manager thread or the command thread. Simply + * indicate that this is a stop error. */ - assert(ua_sess->started == 1); + if (ua_sess->started == 1) { + goto error_rcu_unlock; + } health_code_update(&health_thread_cmd); @@ -2442,7 +2453,7 @@ error_rcu_unlock: /* * Destroy a specific UST session in apps. */ -int ust_app_destroy_trace(struct ltt_ust_session *usess, struct ust_app *app) +static int destroy_trace(struct ltt_ust_session *usess, struct ust_app *app) { struct ust_app_session *ua_sess; struct lttng_ust_object_data obj; @@ -2556,7 +2567,7 @@ int ust_app_destroy_trace_all(struct ltt_ust_session *usess) rcu_read_lock(); cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) { - ret = ust_app_destroy_trace(usess, app); + ret = destroy_trace(usess, app); if (ret < 0) { /* Continue to next apps even on error */ continue; @@ -2581,10 +2592,7 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock) struct ust_app_event *ua_event; struct ust_app_ctx *ua_ctx; - if (usess == NULL) { - ERR("No UST session on global update. Returning"); - goto error; - } + assert(usess); DBG2("UST app global update for app sock %d for session id %d", sock, usess->id);