From 6f6d3b6903fd9c577855211dc80f94199501a902 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 14 Nov 2018 15:34:49 -0500 Subject: [PATCH] Fix: sessiond: ust_app_rotate_session error handling MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/bin/lttng-sessiond/cmd.c | 4 ---- src/bin/lttng-sessiond/ust-app.c | 32 ++++++++++++++++++++++---------- src/bin/lttng-sessiond/ust-app.h | 2 +- 3 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c index 50bacf0c2..23a84615b 100644 --- a/src/bin/lttng-sessiond/cmd.c +++ b/src/bin/lttng-sessiond/cmd.c @@ -4729,10 +4729,6 @@ int cmd_rotate_session(struct ltt_session *session, cmd_ret = LTTNG_ERR_CREATE_DIR_FAIL; goto error; } - /* - * TODO: ust_app_rotate_session must be adapted to return - * an lttng_error_code, like its kernel counterpart. - */ cmd_ret = ust_app_rotate_session(session); if (cmd_ret != LTTNG_OK) { goto error; diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c index 0e1907d8e..5b37a8e74 100644 --- a/src/bin/lttng-sessiond/ust-app.c +++ b/src/bin/lttng-sessiond/ust-app.c @@ -6336,11 +6336,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 +6364,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 +6373,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 +6387,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 +6401,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 +6426,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 +6434,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 +6454,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 +6470,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 +6484,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; } diff --git a/src/bin/lttng-sessiond/ust-app.h b/src/bin/lttng-sessiond/ust-app.h index a5dc0d300..52a7cbfd3 100644 --- a/src/bin/lttng-sessiond/ust-app.h +++ b/src/bin/lttng-sessiond/ust-app.h @@ -360,7 +360,7 @@ int ust_app_pid_get_channel_runtime_stats(struct ltt_ust_session *usess, struct consumer_output *consumer, int overwrite, uint64_t *discarded, uint64_t *lost); int ust_app_regenerate_statedump_all(struct ltt_ust_session *usess); -int ust_app_rotate_session(struct ltt_session *session); +enum lttng_error_code ust_app_rotate_session(struct ltt_session *session); static inline int ust_app_supported(void) -- 2.34.1