Implement event notifier error counter
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Mon, 12 Oct 2020 16:24:49 +0000 (12:24 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 26 Nov 2020 18:49:56 +0000 (13:49 -0500)
Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: Ia8008a162a1e4c881fdc948a390847cb5258e4f7

include/lttng/ust-events.h
liblttng-ust/event-notifier-notification.c
liblttng-ust/lttng-events.c
liblttng-ust/ust-events-internal.h

index 721b0aed7ec57024a14b047ca291f89732b8e480..19726f88b75636f8826c87efe4710dff755fb4bc 100644 (file)
@@ -511,6 +511,7 @@ struct lttng_event {
 
 struct lttng_event_notifier {
        uint64_t user_token;
+       uint64_t error_counter_index;
        int enabled;
        int registered;                 /* has reg'd tracepoint probe */
        size_t num_captures;            /* Needed to allocate the msgpack array. */
index 6fce4357fe85fe5d1511495b675449b5e10797a6..f1fb8adcbe427a554de8b44bd67f6175375a1f56 100644 (file)
@@ -280,8 +280,24 @@ void notification_append_empty_capture(
        lttng_msgpack_write_nil(&notif->writer);
 }
 
+static void record_error(struct lttng_event_notifier *event_notifier)
+{
+       struct lttng_event_notifier_group *event_notifier_group =
+                       event_notifier->group;
+       size_t dimension_index[1];
+       int ret;
+
+       dimension_index[0] = event_notifier->error_counter_index;
+       ret = event_notifier_group->error_counter->ops->counter_add(
+                       event_notifier_group->error_counter->counter,
+                       dimension_index, 1);
+       if (ret)
+               WARN_ON_ONCE(1);
+}
+
 static
-void notification_send(struct lttng_event_notifier_notification *notif)
+void notification_send(struct lttng_event_notifier_notification *notif,
+               struct lttng_event_notifier *event_notifier)
 {
        ssize_t ret;
        size_t content_len;
@@ -291,7 +307,7 @@ void notification_send(struct lttng_event_notifier_notification *notif)
 
        assert(notif);
 
-       ust_notif.token = notif->event_notifier_token;
+       ust_notif.token = event_notifier->user_token;
 
        /*
         * Prepare sending the notification from multiple buffers using an
@@ -329,7 +345,8 @@ void notification_send(struct lttng_event_notifier_notification *notif)
        ret = patient_writev(notif->notification_fd, iov, iovec_count);
        if (ret == -1) {
                if (errno == EAGAIN) {
-                       DBG("Cannot send event notifier notification without blocking: %s",
+                       record_error(event_notifier);
+                       DBG("Cannot send event_notifier notification without blocking: %s",
                                strerror(errno));
                } else {
                        DBG("Error to sending event notifier notification: %s",
@@ -339,7 +356,8 @@ void notification_send(struct lttng_event_notifier_notification *notif)
        }
 }
 
-void lttng_event_notifier_notification_send(struct lttng_event_notifier *event_notifier,
+void lttng_event_notifier_notification_send(
+               struct lttng_event_notifier *event_notifier,
                const char *stack_data)
 {
        /*
@@ -375,5 +393,5 @@ void lttng_event_notifier_notification_send(struct lttng_event_notifier *event_n
         * Send the notification (including the capture buffer) to the
         * sessiond.
         */
-       notification_send(&notif);
+       notification_send(&notif, event_notifier);
 }
index 6a089122c8d1a2afee87f1a77e353aa4d7467736..b455c363ab06a808594a0aa15afab16f2bdc1651 100644 (file)
@@ -841,7 +841,7 @@ socket_error:
 
 static
 int lttng_event_notifier_create(const struct lttng_event_desc *desc,
-               uint64_t token,
+               uint64_t token, uint64_t error_counter_index,
                struct lttng_event_notifier_group *event_notifier_group)
 {
        struct lttng_event_notifier *event_notifier;
@@ -864,6 +864,7 @@ int lttng_event_notifier_create(const struct lttng_event_desc *desc,
 
        event_notifier->group = event_notifier_group;
        event_notifier->user_token = token;
+       event_notifier->error_counter_index = error_counter_index;
 
        /* Event notifier will be enabled by enabler sync. */
        event_notifier->enabled = 0;
@@ -1766,6 +1767,7 @@ void lttng_create_event_notifier_if_missing(
                         */
                        ret = lttng_event_notifier_create(desc,
                                event_notifier_enabler->user_token,
+                               event_notifier_enabler->error_counter_index,
                                event_notifier_group);
                        if (ret) {
                                DBG("Unable to create event_notifier %s, error %d\n",
index 966fce6e7e120088c14327880584c9b8b30492e5..be5c549c8dccdc7c0f5b3f30eaa158413c64ef0d 100644 (file)
@@ -46,6 +46,7 @@ struct lttng_event_enabler {
 
 struct lttng_event_notifier_enabler {
        struct lttng_enabler base;
+       uint64_t error_counter_index;
        struct cds_list_head node;      /* per-app list of event_notifier enablers */
        struct cds_list_head capture_bytecode_head;
        struct lttng_event_notifier_group *group; /* weak ref */
This page took 0.028108 seconds and 4 git commands to generate.