This patch adds additional log_plock() calls to track the start and end
of waiter states inside the dlm_controld lock database. With this
information we know when a specific lock had contention in view of
dlm_controld cluster-wide plock view.
---
 dlm_controld/plock.c | 38 ++++++++++++++++++++++++++++----------
 1 file changed, 28 insertions(+), 10 deletions(-)

diff --git a/dlm_controld/plock.c b/dlm_controld/plock.c
index 24ad777a..b93863f7 100644
--- a/dlm_controld/plock.c
+++ b/dlm_controld/plock.c
@@ -208,6 +208,25 @@ static uint64_t dt_usec(const struct timeval *start, const 
struct timeval *stop)
        return dt;
 }
 
+static void plock_print_start_waiter(const struct lockspace *ls,
+                                    struct lock_waiter *w)
+{
+       log_plock(ls, "state waiter start %llx %p %llx-%llx %d/%u/%llx",
+                 (unsigned long long)w->info.number,
+                 w,
+                 (unsigned long long)w->info.start,
+                 (unsigned long long)w->info.end,
+                 w->info.nodeid, w->info.pid,
+                 (unsigned long long)w->info.owner);
+}
+
+static void plock_print_end_waiter(const struct lockspace *ls,
+                                  const struct lock_waiter *w)
+{
+       log_plock(ls, "state waiter end %llx %p",
+                 (unsigned long long)w->info.number, w);
+}
+
 static struct resource * rb_search_plock_resource(struct lockspace *ls, 
uint64_t number)
 {
        struct rb_node *n = ls->plock_resources_root.rb_node;
@@ -659,13 +678,7 @@ static void clear_waiters(struct lockspace *ls, struct 
resource *r,
                        continue;
 
                list_del(&w->list);
-
-               log_dlock(ls, "clear waiter %llx %llx-%llx %d/%u/%llx",
-                         (unsigned long long)in->number,
-                         (unsigned long long)in->start,
-                         (unsigned long long)in->end,
-                         in->nodeid, in->pid,
-                         (unsigned long long)in->owner);
+               plock_print_end_waiter(ls, w);
                free(w);
        }
 }
@@ -680,6 +693,7 @@ static int add_waiter(struct lockspace *ls, struct resource 
*r,
        if (!w)
                return -ENOMEM;
        memcpy(&w->info, in, sizeof(struct dlm_plock_info));
+       plock_print_start_waiter(ls, w);
        list_add_tail(&w->list, &r->waiters);
        return 0;
 }
@@ -708,6 +722,7 @@ static void do_waiters(struct lockspace *ls, struct 
resource *r)
                        continue;
 
                list_del(&w->list);
+               plock_print_end_waiter(ls, w);
 
                /*
                log_group(ls, "take waiter %llx %llx-%llx %d/%u/%llx",
@@ -1835,7 +1850,7 @@ void send_all_plocks_data(struct lockspace *ls, uint32_t 
seq, uint32_t *plocks_d
                  our_nodeid, seq, send_count);
 }
 
-static void free_r_lists(struct resource *r)
+static void free_r_lists(const struct lockspace *ls, struct resource *r)
 {
        struct posix_lock *po, *po2;
        struct lock_waiter *w, *w2;
@@ -1847,6 +1862,7 @@ static void free_r_lists(struct resource *r)
 
        list_for_each_entry_safe(w, w2, &r->waiters, list) {
                list_del(&w->list);
+               plock_print_end_waiter(ls, w);
                free(w);
        }
 }
@@ -1967,6 +1983,7 @@ void receive_plocks_data(struct lockspace *ls, struct 
dlm_header *hd, int len)
                        w->info.pid     = le32_to_cpu(pp->pid);
                        w->info.nodeid  = le32_to_cpu(pp->nodeid);
                        w->info.ex      = pp->ex;
+                       plock_print_start_waiter(ls, w);
                        list_add_tail(&w->list, &r->waiters);
                }
                pp++;
@@ -1984,7 +2001,7 @@ void receive_plocks_data(struct lockspace *ls, struct 
dlm_header *hd, int len)
 
  fail_free:
        if (!(flags & RD_CONTINUE)) {
-               free_r_lists(r);
+               free_r_lists(ls, r);
                free(r);
        }
        return;
@@ -1999,7 +2016,7 @@ void clear_plocks_data(struct lockspace *ls)
                return;
 
        list_for_each_entry_safe(r, r2, &ls->plock_resources, list) {
-               free_r_lists(r);
+               free_r_lists(ls, r);
                rb_del_plock_resource(ls, r);
                list_del(&r->list);
                free(r);
@@ -2038,6 +2055,7 @@ void purge_plocks(struct lockspace *ls, int nodeid, int 
unmount)
                list_for_each_entry_safe(w, w2, &r->waiters, list) {
                        if (w->info.nodeid == nodeid || unmount) {
                                list_del(&w->list);
+                               plock_print_end_waiter(ls, w);
                                free(w);
                                purged++;
                        }
-- 
2.31.1

Reply via email to