X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fust-app.c;h=7b44fb4b48a050927fe2c897650dd2fda156dfac;hb=9a6545985844978f34f88b82bf1bcd649968c0a3;hp=0e1907d8e99ed5fef30dd1e52f1bf802b51381ea;hpb=9bbfb88c5a3b6b581c81d2c9a9db14246f84675a;p=lttng-tools.git diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 0e1907d8e..7b44fb4b4 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -489,6 +489,11 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan, ust_registry_channel_del_free(registry, ua_chan->key, sock >= 0); } + /* + * A negative socket can be used by the caller when + * cleaning-up a ua_chan in an error path. Skip the + * accounting in this case. + */ if (sock >= 0) { save_per_pid_lost_discarded_counters(ua_chan); } @@ -5947,13 +5952,14 @@ void ust_app_destroy(struct ust_app *app) * Take a snapshot for a given UST session. The snapshot is sent to the given * output. * - * Return 0 on success or else a negative value. + * Returns LTTNG_OK on success or a LTTNG_ERR error code. */ -int ust_app_snapshot_record(struct ltt_ust_session *usess, +enum lttng_error_code ust_app_snapshot_record(struct ltt_ust_session *usess, struct snapshot_output *output, int wait, uint64_t nb_packets_per_stream) { int ret = 0; + enum lttng_error_code status = LTTNG_OK; struct lttng_ht_iter iter; struct ust_app *app; char pathname[PATH_MAX]; @@ -5989,7 +5995,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, socket = consumer_find_socket_by_bitness(reg->bits_per_long, usess->consumer); if (!socket) { - ret = -EINVAL; + status = LTTNG_ERR_INVALID; goto error; } @@ -5999,27 +6005,28 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, reg->uid, reg->bits_per_long); if (ret < 0) { PERROR("snprintf snapshot path"); + status = LTTNG_ERR_INVALID; goto error; } /* Add the UST default trace dir to path. */ cds_lfht_for_each_entry(reg->registry->channels->ht, &iter.iter, reg_chan, node.node) { - ret = consumer_snapshot_channel(socket, + status = consumer_snapshot_channel(socket, reg_chan->consumer_key, output, 0, usess->uid, usess->gid, pathname, wait, nb_packets_per_stream, trace_archive_id); - if (ret < 0) { + if (status != LTTNG_OK) { goto error; } } - ret = consumer_snapshot_channel(socket, + status = consumer_snapshot_channel(socket, reg->registry->reg.ust->metadata_key, output, 1, usess->uid, usess->gid, pathname, wait, 0, trace_archive_id); - if (ret < 0) { + if (status != LTTNG_OK) { goto error; } } @@ -6044,7 +6051,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, socket = consumer_find_socket_by_bitness(app->bits_per_long, output->consumer); if (!socket) { - ret = -EINVAL; + status = LTTNG_ERR_INVALID; goto error; } @@ -6053,22 +6060,25 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, ret = snprintf(pathname, sizeof(pathname), DEFAULT_UST_TRACE_DIR "/%s", ua_sess->path); if (ret < 0) { + status = LTTNG_ERR_INVALID; PERROR("snprintf snapshot path"); goto error; } cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter, ua_chan, node.node) { - ret = consumer_snapshot_channel(socket, + status = consumer_snapshot_channel(socket, ua_chan->key, output, 0, ua_sess->euid, ua_sess->egid, pathname, wait, nb_packets_per_stream, trace_archive_id); - if (ret < 0) { - if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) { - continue; - } + switch (status) { + case LTTNG_OK: + break; + case LTTNG_ERR_CHAN_NOT_FOUND: + continue; + default: goto error; } } @@ -6078,15 +6088,17 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, DBG("Application session is being torn down. Skip application."); continue; } - ret = consumer_snapshot_channel(socket, + status = consumer_snapshot_channel(socket, registry->metadata_key, output, 1, ua_sess->euid, ua_sess->egid, pathname, wait, 0, trace_archive_id); - if (ret < 0) { - if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) { - continue; - } + switch (status) { + case LTTNG_OK: + break; + case LTTNG_ERR_CHAN_NOT_FOUND: + continue; + default: goto error; } } @@ -6099,7 +6111,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess, error: rcu_read_unlock(); - return ret; + return status; } /* @@ -6336,11 +6348,12 @@ int ust_app_regenerate_statedump_all(struct ltt_ust_session *usess) /* * Rotate all the channels of a session. * - * Return 0 on success or else a negative value. + * Return LTTNG_OK on success or else an LTTng error code. */ -int ust_app_rotate_session(struct ltt_session *session) +enum lttng_error_code ust_app_rotate_session(struct ltt_session *session) { - int ret = 0; + int ret; + enum lttng_error_code cmd_ret = LTTNG_OK; struct lttng_ht_iter iter; struct ust_app *app; struct ltt_ust_session *usess = session->ust_session; @@ -6363,7 +6376,7 @@ int ust_app_rotate_session(struct ltt_session *session) socket = consumer_find_socket_by_bitness(reg->bits_per_long, usess->consumer); if (!socket) { - ret = -EINVAL; + cmd_ret = LTTNG_ERR_INVALID; goto error; } @@ -6372,6 +6385,7 @@ int ust_app_rotate_session(struct ltt_session *session) reg->uid, reg->bits_per_long); if (ret < 0 || ret == sizeof(pathname)) { PERROR("Failed to format rotation path"); + cmd_ret = LTTNG_ERR_INVALID; goto error; } @@ -6385,6 +6399,7 @@ int ust_app_rotate_session(struct ltt_session *session) /* is_metadata_channel */ false, session->current_archive_id); if (ret < 0) { + cmd_ret = LTTNG_ERR_ROTATION_FAIL_CONSUMER; goto error; } } @@ -6398,6 +6413,7 @@ int ust_app_rotate_session(struct ltt_session *session) /* is_metadata_channel */ true, session->current_archive_id); if (ret < 0) { + cmd_ret = LTTNG_ERR_ROTATION_FAIL_CONSUMER; goto error; } } @@ -6422,6 +6438,7 @@ int ust_app_rotate_session(struct ltt_session *session) ua_sess->path); if (ret < 0 || ret == sizeof(pathname)) { PERROR("Failed to format rotation path"); + cmd_ret = LTTNG_ERR_INVALID; goto error; } @@ -6429,15 +6446,14 @@ int ust_app_rotate_session(struct ltt_session *session) socket = consumer_find_socket_by_bitness(app->bits_per_long, usess->consumer); if (!socket) { - ret = -EINVAL; + cmd_ret = LTTNG_ERR_INVALID; goto error; } registry = get_session_registry(ua_sess); if (!registry) { - DBG("Application session is being torn down. Abort session rotation."); - ret = -1; - goto error; + DBG("Application session is being torn down. Skip application."); + continue; } @@ -6450,6 +6466,10 @@ int ust_app_rotate_session(struct ltt_session *session) /* is_metadata_channel */ false, session->current_archive_id); if (ret < 0) { + /* Per-PID buffer and application going away. */ + if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) + continue; + cmd_ret = LTTNG_ERR_ROTATION_FAIL_CONSUMER; goto error; } } @@ -6462,6 +6482,10 @@ int ust_app_rotate_session(struct ltt_session *session) /* is_metadata_channel */ true, session->current_archive_id); if (ret < 0) { + /* Per-PID buffer and application going away. */ + if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) + continue; + cmd_ret = LTTNG_ERR_ROTATION_FAIL_CONSUMER; goto error; } } @@ -6472,9 +6496,9 @@ int ust_app_rotate_session(struct ltt_session *session) break; } - ret = LTTNG_OK; + cmd_ret = LTTNG_OK; error: rcu_read_unlock(); - return ret; + return cmd_ret; }