Remove leftover fprintf
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index c522d51c2dc27e46efa08ccb7f85085e16e4e4d3..55bd767b57875fd7d6aedc1c803cf060fb4aff57 100644 (file)
@@ -857,6 +857,8 @@ int cmd_enable_channel(struct ltt_session *session,
 
        DBG("Enabling channel %s for session %s", attr->name, session->name);
 
+       rcu_read_lock();
+
        /*
         * Don't try to enable a channel if the session has been started at
         * some point in time before. The tracer does not allow it.
@@ -866,8 +868,6 @@ int cmd_enable_channel(struct ltt_session *session,
                goto error;
        }
 
-       rcu_read_lock();
-
        switch (domain->type) {
        case LTTNG_DOMAIN_KERNEL:
        {
@@ -2160,6 +2160,7 @@ void cmd_list_lttng_sessions(struct lttng_session *sessions, uid_t uid,
                strncpy(sessions[i].name, session->name, NAME_MAX);
                sessions[i].name[NAME_MAX - 1] = '\0';
                sessions[i].enabled = session->enabled;
+               sessions[i].snapshot_mode = session->snapshot_mode;
                i++;
        }
 }
@@ -2278,14 +2279,11 @@ int cmd_snapshot_del_output(struct ltt_session *session,
                struct lttng_snapshot_output *output)
 {
        int ret;
-       struct snapshot_output *sout;
+       struct snapshot_output *sout = NULL;
 
        assert(session);
        assert(output);
 
-       DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
-                       session->name);
-
        rcu_read_lock();
 
        /*
@@ -2297,7 +2295,15 @@ int cmd_snapshot_del_output(struct ltt_session *session,
                goto error;
        }
 
-       sout = snapshot_find_output_by_id(output->id, &session->snapshot);
+       if (output->id) {
+               DBG("Cmd snapshot del output id %" PRIu32 " for session %s", output->id,
+                               session->name);
+               sout = snapshot_find_output_by_id(output->id, &session->snapshot);
+       } else if (*output->name != '\0') {
+               DBG("Cmd snapshot del output name %s for session %s", output->name,
+                               session->name);
+               sout = snapshot_find_output_by_name(output->name, &session->snapshot);
+       }
        if (!sout) {
                ret = LTTNG_ERR_INVALID;
                goto error;
@@ -2395,12 +2401,12 @@ error:
  * Send relayd sockets from snapshot output to consumer. Ignore request if the
  * snapshot output is *not* set with a remote destination.
  *
- * Return 0 on success or else a negative value.
+ * Return 0 on success or a LTTNG_ERR code.
  */
 static int set_relayd_for_snapshot(struct consumer_output *consumer,
                struct snapshot_output *snap_output, struct ltt_session *session)
 {
-       int ret = 0;
+       int ret = LTTNG_OK;
        struct lttng_ht_iter iter;
        struct consumer_socket *socket;
 
@@ -2424,7 +2430,7 @@ static int set_relayd_for_snapshot(struct consumer_output *consumer,
                        socket, node.node) {
                ret = send_consumer_relayd_sockets(0, session->id,
                                snap_output->consumer, socket);
-               if (ret < 0) {
+               if (ret != LTTNG_OK) {
                        rcu_read_unlock();
                        goto error;
                }
@@ -2438,7 +2444,7 @@ error:
 /*
  * Record a kernel snapshot.
  *
- * Return 0 on success or else a negative value.
+ * Return 0 on success or a LTTNG_ERR code.
  */
 static int record_kernel_snapshot(struct ltt_kernel_session *ksess,
                struct snapshot_output *output, struct ltt_session *session,
@@ -2454,7 +2460,7 @@ static int record_kernel_snapshot(struct ltt_kernel_session *ksess,
        ret = utils_get_current_time_str("%Y%m%d-%H%M%S", output->datetime,
                        sizeof(output->datetime));
        if (!ret) {
-               ret = -EINVAL;
+               ret = LTTNG_ERR_INVALID;
                goto error;
        }
 
@@ -2464,23 +2470,26 @@ static int record_kernel_snapshot(struct ltt_kernel_session *ksess,
         */
        ret = consumer_copy_sockets(output->consumer, ksess->consumer);
        if (ret < 0) {
+               ret = LTTNG_ERR_NOMEM;
                goto error;
        }
 
        ret = set_relayd_for_snapshot(ksess->consumer, output, session);
-       if (ret < 0) {
+       if (ret != LTTNG_OK) {
                goto error_snapshot;
        }
 
        ret = kernel_snapshot_record(ksess, output, wait, nb_streams);
        if (ret < 0) {
-               ret = -LTTNG_ERR_SNAPSHOT_FAIL;
+               ret = LTTNG_ERR_SNAPSHOT_FAIL;
                if (ret == -EINVAL) {
-                       ret = -LTTNG_ERR_INVALID;
+                       ret = LTTNG_ERR_INVALID;
                }
                goto error_snapshot;
        }
 
+       ret = LTTNG_OK;
+
 error_snapshot:
        /* Clean up copied sockets so this output can use some other later on. */
        consumer_destroy_output_sockets(output->consumer);
@@ -2491,7 +2500,7 @@ error:
 /*
  * Record a UST snapshot.
  *
- * Return 0 on success or else a negative value.
+ * Return 0 on success or a LTTNG_ERR error code.
  */
 static int record_ust_snapshot(struct ltt_ust_session *usess,
                struct snapshot_output *output, struct ltt_session *session,
@@ -2507,7 +2516,7 @@ static int record_ust_snapshot(struct ltt_ust_session *usess,
        ret = utils_get_current_time_str("%Y%m%d-%H%M%S", output->datetime,
                        sizeof(output->datetime));
        if (!ret) {
-               ret = -EINVAL;
+               ret = LTTNG_ERR_INVALID;
                goto error;
        }
 
@@ -2517,23 +2526,26 @@ static int record_ust_snapshot(struct ltt_ust_session *usess,
         */
        ret = consumer_copy_sockets(output->consumer, usess->consumer);
        if (ret < 0) {
+               ret = LTTNG_ERR_NOMEM;
                goto error;
        }
 
        ret = set_relayd_for_snapshot(usess->consumer, output, session);
-       if (ret < 0) {
+       if (ret != LTTNG_OK) {
                goto error_snapshot;
        }
 
        ret = ust_app_snapshot_record(usess, output, wait, nb_streams);
        if (ret < 0) {
-               ret = -LTTNG_ERR_SNAPSHOT_FAIL;
+               ret = LTTNG_ERR_SNAPSHOT_FAIL;
                if (ret == -EINVAL) {
-                       ret = -LTTNG_ERR_INVALID;
+                       ret = LTTNG_ERR_INVALID;
                }
                goto error_snapshot;
        }
 
+       ret = LTTNG_OK;
+
 error_snapshot:
        /* Clean up copied sockets so this output can use some other later on. */
        consumer_destroy_output_sockets(output->consumer);
@@ -2576,8 +2588,9 @@ int cmd_snapshot_record(struct ltt_session *session,
                struct lttng_snapshot_output *output, int wait)
 {
        int ret = LTTNG_OK;
-       struct snapshot_output *tmp_sout = NULL;
-       unsigned int nb_streams;
+       unsigned int use_tmp_output = 0;
+       struct snapshot_output tmp_output;
+       unsigned int nb_streams, snapshot_success = 0;
 
        assert(session);
 
@@ -2600,15 +2613,9 @@ int cmd_snapshot_record(struct ltt_session *session,
 
        /* Use temporary output for the session. */
        if (output && *output->ctrl_url != '\0') {
-               tmp_sout = snapshot_output_alloc();
-               if (!tmp_sout) {
-                       ret = LTTNG_ERR_NOMEM;
-                       goto error;
-               }
-
                ret = snapshot_output_init(output->max_size, output->name,
                                output->ctrl_url, output->data_url, session->consumer,
-                               tmp_sout, NULL);
+                               &tmp_output, NULL);
                if (ret < 0) {
                        if (ret == -ENOMEM) {
                                ret = LTTNG_ERR_NOMEM;
@@ -2617,6 +2624,9 @@ int cmd_snapshot_record(struct ltt_session *session,
                        }
                        goto error;
                }
+               /* Use the global session count for the temporary snapshot. */
+               tmp_output.nb_snapshot = session->snapshot.nb_snapshot;
+               use_tmp_output = 1;
        }
 
        /*
@@ -2628,12 +2638,13 @@ int cmd_snapshot_record(struct ltt_session *session,
        if (session->kernel_session) {
                struct ltt_kernel_session *ksess = session->kernel_session;
 
-               if (tmp_sout) {
-                       ret = record_kernel_snapshot(ksess, tmp_sout, session,
+               if (use_tmp_output) {
+                       ret = record_kernel_snapshot(ksess, &tmp_output, session,
                                        wait, nb_streams);
-                       if (ret < 0) {
+                       if (ret != LTTNG_OK) {
                                goto error;
                        }
+                       snapshot_success = 1;
                } else {
                        struct snapshot_output *sout;
                        struct lttng_ht_iter iter;
@@ -2641,12 +2652,33 @@ int cmd_snapshot_record(struct ltt_session *session,
                        rcu_read_lock();
                        cds_lfht_for_each_entry(session->snapshot.output_ht->ht,
                                        &iter.iter, sout, node.node) {
-                               ret = record_kernel_snapshot(ksess, sout,
+                               /*
+                                * Make a local copy of the output and assign the possible
+                                * temporary value given by the caller.
+                                */
+                               memset(&tmp_output, 0, sizeof(tmp_output));
+                               memcpy(&tmp_output, sout, sizeof(tmp_output));
+
+                               /* Use temporary max size. */
+                               if (output->max_size != (uint64_t) -1ULL) {
+                                       tmp_output.max_size = output->max_size;
+                               }
+
+                               /* Use temporary name. */
+                               if (*output->name != '\0') {
+                                       strncpy(tmp_output.name, output->name,
+                                                       sizeof(tmp_output.name));
+                               }
+
+                               tmp_output.nb_snapshot = session->snapshot.nb_snapshot;
+
+                               ret = record_kernel_snapshot(ksess, &tmp_output,
                                                session, wait, nb_streams);
-                               if (ret < 0) {
+                               if (ret != LTTNG_OK) {
                                        rcu_read_unlock();
                                        goto error;
                                }
+                               snapshot_success = 1;
                        }
                        rcu_read_unlock();
                }
@@ -2655,12 +2687,13 @@ int cmd_snapshot_record(struct ltt_session *session,
        if (session->ust_session) {
                struct ltt_ust_session *usess = session->ust_session;
 
-               if (tmp_sout) {
-                       ret = record_ust_snapshot(usess, tmp_sout, session,
+               if (use_tmp_output) {
+                       ret = record_ust_snapshot(usess, &tmp_output, session,
                                        wait, nb_streams);
-                       if (ret < 0) {
+                       if (ret != LTTNG_OK) {
                                goto error;
                        }
+                       snapshot_success = 1;
                } else {
                        struct snapshot_output *sout;
                        struct lttng_ht_iter iter;
@@ -2668,21 +2701,43 @@ int cmd_snapshot_record(struct ltt_session *session,
                        rcu_read_lock();
                        cds_lfht_for_each_entry(session->snapshot.output_ht->ht,
                                        &iter.iter, sout, node.node) {
-                               ret = record_ust_snapshot(usess, sout, session,
+                               /*
+                                * Make a local copy of the output and assign the possible
+                                * temporary value given by the caller.
+                                */
+                               memset(&tmp_output, 0, sizeof(tmp_output));
+                               memcpy(&tmp_output, sout, sizeof(tmp_output));
+
+                               /* Use temporary max size. */
+                               if (output->max_size != (uint64_t) -1ULL) {
+                                       tmp_output.max_size = output->max_size;
+                               }
+
+                               /* Use temporary name. */
+                               if (*output->name != '\0') {
+                                       strncpy(tmp_output.name, output->name,
+                                                       sizeof(tmp_output.name));
+                               }
+
+                               tmp_output.nb_snapshot = session->snapshot.nb_snapshot;
+
+                               ret = record_ust_snapshot(usess, &tmp_output, session,
                                                wait, nb_streams);
-                               if (ret < 0) {
+                               if (ret != LTTNG_OK) {
                                        rcu_read_unlock();
                                        goto error;
                                }
+                               snapshot_success = 1;
                        }
                        rcu_read_unlock();
                }
        }
 
-error:
-       if (tmp_sout) {
-               snapshot_output_destroy(tmp_sout);
+       if (snapshot_success) {
+               session->snapshot.nb_snapshot++;
        }
+
+error:
        return ret;
 }
 
This page took 0.028066 seconds and 4 git commands to generate.