Docs: document why a negative socket may be passed
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index a133eeeef19fe563f06af0b89b52033c60fef60d..23f29c13ca414a0a02903952879701b73dda397b 100644 (file)
@@ -487,9 +487,16 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan,
                registry = get_session_registry(ua_chan->session);
                if (registry) {
                        ust_registry_channel_del_free(registry, ua_chan->key,
-                               true);
+                               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);
                }
-               save_per_pid_lost_discarded_counters(ua_chan);
        }
 
        if (ua_chan->obj != NULL) {
@@ -3017,7 +3024,7 @@ static int create_channel_per_pid(struct ust_app *app,
        if (ret < 0) {
                ERR("Error creating UST channel \"%s\" on the consumer daemon",
                        ua_chan->name);
-               goto error;
+               goto error_remove_from_registry;
        }
 
        ret = send_channel_pid_to_ust(app, ua_sess, ua_chan);
@@ -3025,7 +3032,7 @@ static int create_channel_per_pid(struct ust_app *app,
                if (ret != -ENOTCONN) {
                        ERR("Error sending channel to application");
                }
-               goto error;
+               goto error_remove_from_registry;
        }
 
        chan_reg_key = ua_chan->key;
@@ -3045,9 +3052,13 @@ static int create_channel_per_pid(struct ust_app *app,
        if (cmd_ret != LTTNG_OK) {
                ret = - (int) cmd_ret;
                ERR("Failed to add channel to notification thread");
-               goto error;
+               goto error_remove_from_registry;
        }
 
+error_remove_from_registry:
+       if (ret) {
+               ust_registry_channel_del_free(registry, ua_chan->key, false);
+       }
 error:
        rcu_read_unlock();
        return ret;
@@ -6060,15 +6071,17 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                                                nb_packets_per_stream,
                                                trace_archive_id);
                                if (ret < 0) {
+                                       if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) {
+                                               continue;
+                                       }
                                        goto error;
                                }
                        }
 
                        registry = get_session_registry(ua_sess);
                        if (!registry) {
-                               DBG("Application session is being torn down. Abort snapshot record.");
-                               ret = -1;
-                               goto error;
+                               DBG("Application session is being torn down. Skip application.");
+                               continue;
                        }
                        ret = consumer_snapshot_channel(socket,
                                        registry->metadata_key, output,
@@ -6076,6 +6089,9 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                                        pathname, wait, 0,
                                        trace_archive_id);
                        if (ret < 0) {
+                               if (ret == -LTTNG_ERR_CHAN_NOT_FOUND) {
+                                       continue;
+                               }
                                goto error;
                        }
                }
@@ -6325,11 +6341,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;
@@ -6352,7 +6369,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;
                        }
 
@@ -6361,6 +6378,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;
                        }
 
@@ -6374,6 +6392,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;
                                }
                        }
@@ -6387,6 +6406,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;
                        }
                }
@@ -6411,6 +6431,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;
                        }
 
@@ -6418,15 +6439,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 snapshot record.");
-                               ret = -1;
-                               goto error;
+                               DBG("Application session is being torn down. Skip application.");
+                               continue;
                        }
 
 
@@ -6439,6 +6459,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;
                                }
                        }
@@ -6451,6 +6475,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;
                        }
                }
@@ -6461,9 +6489,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;
 }
This page took 0.027891 seconds and 5 git commands to generate.