Fix: sessiond: ust_app_rotate_session error handling
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 14 Nov 2018 20:34:49 +0000 (15:34 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 16 Nov 2018 20:48:07 +0000 (15:48 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/cmd.c
src/bin/lttng-sessiond/ust-app.c
src/bin/lttng-sessiond/ust-app.h

index 50bacf0c236dc3ea4917a6f4100a80aa39b98623..23a84615b0a93d108c28c97a8b8d2fb253ff8460 100644 (file)
@@ -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;
index 0e1907d8e99ed5fef30dd1e52f1bf802b51381ea..5b37a8e7444a93da9600eaa9b96354309117a923 100644 (file)
@@ -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;
 }
index a5dc0d300c51a790bd762d85307829bd50389a44..52a7cbfd35dbc060c5e3663bbd418fbb3b87854e 100644 (file)
@@ -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)
This page took 0.047074 seconds and 4 git commands to generate.