Fix: report to client when snapshot will be empty
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index 58b8080b56dff398d82e7262257e770682f1afcc..1451963ad41f14cb1809e37594a3960238112819 100644 (file)
@@ -389,7 +389,8 @@ void delete_ust_app_channel(int sock, struct ust_app_channel *ua_chan,
        if (ua_chan->obj != NULL) {
                /* Remove channel from application UST object descriptor. */
                iter.iter.node = &ua_chan->ust_objd_node.node;
-               lttng_ht_del(app->ust_objd, &iter);
+               ret = lttng_ht_del(app->ust_objd, &iter);
+               assert(!ret);
                ret = ustctl_release_object(sock, ua_chan->obj);
                if (ret < 0 && ret != -EPIPE && ret != -LTTNG_UST_ERR_EXITING) {
                        ERR("UST app sock %d release channel obj failed with ret %d",
@@ -478,6 +479,11 @@ push_data:
                if (ret == -LTTCOMM_CONSUMERD_CHANNEL_FAIL) {
                        ret = 0;
                }
+
+               /* Update back the actual metadata len sent since it failed here. */
+               pthread_mutex_lock(&registry->lock);
+               registry->metadata_len_sent -= len;
+               pthread_mutex_unlock(&registry->lock);
                ret_val = ret;
                goto error_push;
        }
@@ -3058,7 +3064,7 @@ int ust_app_list_events(struct lttng_event **events)
                        /* Handle ustctl error. */
                        if (ret < 0) {
                                free(tmp_event);
-                               if (ret != -LTTNG_UST_ERR_EXITING || ret != -EPIPE) {
+                               if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
                                        ERR("UST app tp list get failed for app %d with ret %d",
                                                        app->sock, ret);
                                } else {
@@ -3158,7 +3164,7 @@ int ust_app_list_event_fields(struct lttng_event_field **fields)
                        /* Handle ustctl error. */
                        if (ret < 0) {
                                free(tmp_event);
-                               if (ret != -LTTNG_UST_ERR_EXITING || ret != -EPIPE) {
+                               if (ret != -LTTNG_UST_ERR_EXITING && ret != -EPIPE) {
                                        ERR("UST app tp list field failed for app %d with ret %d",
                                                        app->sock, ret);
                                } else {
@@ -4986,6 +4992,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                struct snapshot_output *output, int wait, unsigned int nb_streams)
 {
        int ret = 0;
+       unsigned int snapshot_done = 0;
        struct lttng_ht_iter iter;
        struct ust_app *app;
        char pathname[PATH_MAX];
@@ -5060,6 +5067,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                        if (ret < 0) {
                                goto error;
                        }
+                       snapshot_done = 1;
                }
                break;
        }
@@ -5127,6 +5135,7 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                        if (ret < 0) {
                                goto error;
                        }
+                       snapshot_done = 1;
                }
                break;
        }
@@ -5135,6 +5144,15 @@ int ust_app_snapshot_record(struct ltt_ust_session *usess,
                break;
        }
 
+       if (!snapshot_done) {
+               /*
+                * If no snapshot was made and we are not in the error path, this means
+                * that there are no buffers thus no (prior) application to snapshot
+                * data from so we have simply NO data.
+                */
+               ret = -ENODATA;
+       }
+
 error:
        rcu_read_unlock();
        return ret;
This page took 0.024963 seconds and 4 git commands to generate.