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