sessiond: Implement clear for sessions with local and remote output
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 3 Apr 2019 20:34:27 +0000 (16:34 -0400)
committerJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Wed, 10 Apr 2019 23:36:37 +0000 (19:36 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
src/bin/lttng-sessiond/clear.c
src/bin/lttng-sessiond/consumer.c
src/bin/lttng-sessiond/consumer.h
src/bin/lttng-sessiond/ust-app.c

index a0917dca8186c57a9b0ffcbdc2e49b324de65935..e83818dc081c2fdc97b5ef66cba7e5e5a16e3aa0 100644 (file)
@@ -41,28 +41,21 @@ int cmd_clear_session(struct ltt_session *session)
                 goto end;
        }
 
-       /*
-        * Unsupported feature in lttng-relayd before 2.12.
-        */
-       if (session->consumer->type == CONSUMER_DST_NET &&
-                       (session->consumer->relay_major_version == 2 &&
-                       session->consumer->relay_minor_version < 12)) {
-               ret = LTTNG_ERR_CLEAR_NOT_AVAILABLE_RELAY;
-               goto end;
-       }
-
-       /* TODO: Should we check for disallowed here or consumer side? */
-
-       /* Snapshot session are the only one supported for now */
-       if (!session->snapshot_mode) {
-               /*
-                * TODO: this error code is temporary and will be removed since
-                * we will be supporting all session type
-                */
-               ret = LTTNG_ERR_CLEAR_NOT_AVAILABLE;
-               goto end;
+       if (session->ust_session) {
+               switch (session->ust_session->buffer_type) {
+               case LTTNG_BUFFER_PER_PID:
+                       ERR("Clear command not supported for per-pid buffers.");
+                       ret = LTTNG_ERR_CLEAR_NOT_AVAILABLE;
+                       goto error;
+               case LTTNG_BUFFER_PER_UID:
+               case LTTNG_BUFFER_GLOBAL:
+                       break;
+               }
        }
 
+       /*
+        * Clear kernel and UST session buffers and local files (if any).
+        */
        if (session->kernel_session) {
                ret = kernel_clear_session(session);
                if (ret != LTTNG_OK) {
@@ -75,6 +68,16 @@ int cmd_clear_session(struct ltt_session *session)
                        goto error;
                }
        }
+
+       /*
+        * Clear remote (relayd) session files.
+        */
+       ret = consumer_clear_session(session);
+       if (ret < 0) {
+               ret = LTTNG_ERR_CLEAR_FAIL_CONSUMER;
+               goto error;
+       }
+       ret = LTTNG_OK;
 error:
 end:
        return ret;
index 382815e6b3665ecb76cde7ce1edf5fbc37c4fe3f..f286df9434e930304486219826b4e54e20138c46 100644 (file)
@@ -1588,11 +1588,36 @@ int consumer_clear_channel(struct consumer_socket *socket, uint64_t key,
        msg.cmd_type = LTTNG_CONSUMER_CLEAR_CHANNEL;
        msg.u.clear_channel.key = key;
 
-       if (output->type == CONSUMER_DST_NET) {
-               ERR("Relayd clear is not supported for now");
-               ret = -LTTNG_ERR_INVALID;
-               goto error;
+       health_code_update();
+
+       pthread_mutex_lock(socket->lock);
+       ret = consumer_send_msg(socket, &msg);
+       if (ret < 0) {
+               goto error_socket;
        }
+
+error_socket:
+       pthread_mutex_unlock(socket->lock);
+
+       health_code_update();
+       return ret;
+}
+
+static
+int consumer_msg_clear_session(struct consumer_socket *socket, uint64_t session_id,
+               struct consumer_output *output)
+{
+       int ret;
+       struct lttcomm_consumer_msg msg;
+
+       assert(socket);
+
+       DBG("Consumer clear session %" PRIu64, session_id);
+
+       memset(&msg, 0, sizeof(msg));
+       msg.cmd_type = LTTNG_CONSUMER_CLEAR_SESSION;
+       msg.u.clear_session.session_id = session_id;
+
        health_code_update();
 
        pthread_mutex_lock(socket->lock);
@@ -1604,7 +1629,46 @@ int consumer_clear_channel(struct consumer_socket *socket, uint64_t key,
 error_socket:
        pthread_mutex_unlock(socket->lock);
 
-error:
        health_code_update();
        return ret;
 }
+
+int consumer_clear_session(struct ltt_session *session)
+{
+       struct ltt_ust_session *usess = session->ust_session;
+       struct ltt_kernel_session *ksess = session->kernel_session;
+       int ret;
+
+       rcu_read_lock();
+       if (ksess) {
+               struct consumer_socket *socket;
+               struct lttng_ht_iter iter;
+
+               cds_lfht_for_each_entry(ksess->consumer->socks->ht, &iter.iter,
+                               socket, node.node) {
+                       ret = consumer_msg_clear_session(socket, session->id,
+                                       ksess->consumer);
+                       if (ret < 0) {
+                               goto error;
+                       }
+               }
+       }
+       if (usess) {
+               struct consumer_socket *socket;
+               struct lttng_ht_iter iter;
+
+               cds_lfht_for_each_entry(usess->consumer->socks->ht, &iter.iter,
+                               socket, node.node) {
+                       ret = consumer_msg_clear_session(socket, session->id,
+                                       usess->consumer);
+                       if (ret < 0) {
+                               goto error;
+                       }
+               }
+       }
+       rcu_read_unlock();
+       return 0;
+error:
+       rcu_read_unlock();
+       return ret;
+}
index f81a328f89ce7b253182761c7e0495b6affeca29..1ce68252336159b5fa4ad40f7add4abe560d7daa 100644 (file)
@@ -27,6 +27,7 @@
 
 struct snapshot;
 struct snapshot_output;
+struct ltt_session;
 
 enum consumer_dst_type {
        CONSUMER_DST_LOCAL,
@@ -308,4 +309,5 @@ int consumer_snapshot_channel(struct consumer_socket *socket, uint64_t key,
 /* Clear command */
 int consumer_clear_channel(struct consumer_socket *socket, uint64_t key,
                struct consumer_output *output);
+int consumer_clear_session(struct ltt_session *session);
 #endif /* _CONSUMER_H */
index 81edd21c2d671e1e1c2cf78fc8cb2f4afe0ee8b3..ffe6c80cce7343daab512b3f66a31c2065abb0f5 100644 (file)
@@ -6366,7 +6366,7 @@ enum lttng_error_code ust_app_clear_session(struct ltt_session *session)
                                continue;
                        }
 
-                       /* Rotate the data channels. */
+                       /* Clear the data channels. */
                        cds_lfht_for_each_entry(ua_sess->channels->ht, &chan_iter.iter,
                                        ua_chan, node.node) {
                                ret = consumer_clear_channel(socket, ua_chan->key,
This page took 0.02948 seconds and 5 git commands to generate.