TEVENT: Add back tracking of long runnig events to the local copy of tevent library
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 20 May 2012 23:17:05 +0000 (09:17 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Sun, 20 May 2012 23:17:05 +0000 (09:17 +1000)
lib/tevent/tevent_epoll.c
lib/tevent/tevent_internal.h
lib/tevent/tevent_select.c
lib/tevent/tevent_standard.c
lib/tevent/tevent_util.c

index f5a69ddc50c102c73ab654374ce108de631654d1..7c09dd7449c60a64f9c4e87cfb013d5eb811ec0d 100644 (file)
@@ -242,6 +242,8 @@ static void epoll_change_event(struct epoll_event_context *epoll_ev, struct teve
        }
 }
 
+extern pid_t ctdbd_pid;
+
 /*
   event loop handling using epoll
 */
@@ -264,7 +266,9 @@ static int epoll_event_loop(struct epoll_event_context *epoll_ev, struct timeval
                return 0;
        }
 
+       if (getpid() == ctdbd_pid) tevent_before_wait(epoll_ev->ev);
        ret = epoll_wait(epoll_ev->epoll_fd, events, MAXEVENTS, timeout);
+       if (getpid() == ctdbd_pid) tevent_after_wait(epoll_ev->ev);
 
        if (ret == -1 && errno == EINTR && epoll_ev->ev->signal_events) {
                if (tevent_common_check_signal(epoll_ev->ev)) {
index 7f1d8766ca9b91c63dbe3fc5bd686323e3e9ffde..707bfab0540be2c218e1d7336d4f8d40a51d844b 100644 (file)
@@ -313,3 +313,5 @@ bool tevent_poll_init(void);
 #ifdef HAVE_EPOLL
 bool tevent_epoll_init(void);
 #endif
+void tevent_before_wait(struct tevent_context *ev);
+void tevent_after_wait(struct tevent_context *ev);
index 51c1dec4a6f14f27945e74b0629db96fe0c1918a..6fa38cebc04795bba7c83635aee98010565929c7 100644 (file)
@@ -130,6 +130,8 @@ static struct tevent_fd *select_event_add_fd(struct tevent_context *ev, TALLOC_C
        return fde;
 }
 
+extern pid_t ctdbd_pid;
+
 /*
   event loop handling using select()
 */
@@ -167,7 +169,9 @@ static int select_event_loop_select(struct select_event_context *select_ev, stru
                return 0;
        }
 
+       if (getpid() == ctdbd_pid) tevent_before_wait(select_ev->ev);
        selrtn = select(select_ev->maxfd+1, &r_fds, &w_fds, NULL, tvalp);
+       if (getpid() == ctdbd_pid) tevent_after_wait(select_ev->ev);
 
        if (selrtn == -1 && errno == EINTR &&
            select_ev->ev->signal_events) {
index 534576c108d6a5e7cfc9979b58d520118e4418f1..4041b6a9037c1f6e4c163697b892895cdde76bce 100644 (file)
@@ -256,6 +256,8 @@ static void epoll_change_event(struct std_event_context *std_ev, struct tevent_f
        }
 }
 
+extern pid_t ctdbd_pid;
+
 /*
   event loop handling using epoll
 */
@@ -278,7 +280,9 @@ static int epoll_event_loop(struct std_event_context *std_ev, struct timeval *tv
                return 0;
        }
 
+       if (getpid() == ctdbd_pid) tevent_before_wait(std_ev->ev);
        ret = epoll_wait(std_ev->epoll_fd, events, MAXEVENTS, timeout);
+       if (getpid() == ctdbd_pid) tevent_after_wait(std_ev->ev);
 
        if (ret == -1 && errno == EINTR && std_ev->ev->signal_events) {
                if (tevent_common_check_signal(std_ev->ev)) {
index 16af8f3b908d8c0502a18403ac70a0b476df1419..e3a1605b2631977b34f91c6903255fed9dabef71 100644 (file)
@@ -105,3 +105,55 @@ bool ev_set_close_on_exec(int fd)
 #endif
        return false;
 }
+
+
+static struct timeval tevent_before_wait_ts;
+static struct timeval tevent_after_wait_ts;
+
+/*
+ * measure the time difference between multiple arrivals
+ * to the point where we wait for new events to come in
+ *
+ * allows to measure how long it takes to work on a 
+ * event
+ */
+void tevent_before_wait(struct tevent_context *ev) {
+
+       struct timeval diff;
+       struct timeval now = tevent_timeval_current();
+
+       if (!tevent_timeval_is_zero(&tevent_after_wait_ts)) {
+               diff = tevent_timeval_until(&tevent_after_wait_ts, &now);
+               if (diff.tv_sec > 3) {
+                       tevent_debug(ev, TEVENT_DEBUG_ERROR,  __location__ 
+                                    " Handling event took %d seconds!",
+                                    (int) diff.tv_sec);
+               }
+       }
+
+       tevent_before_wait_ts = tevent_timeval_current();
+
+}
+
+/*
+ * measure how long the select()/epoll() call took
+ *
+ * allows to measure how long we are waiting for new events
+ */
+void tevent_after_wait(struct tevent_context *ev) {
+
+       struct timeval diff;
+       struct timeval now = tevent_timeval_current();
+
+       if (!tevent_timeval_is_zero(&tevent_before_wait_ts)) {
+               diff = tevent_timeval_until(&tevent_before_wait_ts, &now);
+               if (diff.tv_sec > 3) {
+                       tevent_debug(ev, TEVENT_DEBUG_FATAL,  __location__
+                                    " No event for %d seconds!",
+                                    (int) diff.tv_sec);
+               }
+       }
+
+       tevent_after_wait_ts = tevent_timeval_current();
+
+}