From d07875330a6dbf44c1d65c029af80b53e5836d2d Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 24 Nov 2020 13:25:04 +1100 Subject: [PATCH] ctdb-locking: Pass additional arguments to debug locks script 1. PID of lock helper waiting for lock 2. Scope of lock: "record" or "db" 3. Path to database that lock helper is trying to lock 4. Whether the database uses mutexes: "mutex" or "fcntl" Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- ctdb/server/ctdb_lock.c | 61 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 56 insertions(+), 5 deletions(-) diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c index 478447d76f8..063ebfa07cf 100644 --- a/ctdb/server/ctdb_lock.c +++ b/ctdb/server/ctdb_lock.c @@ -496,6 +496,50 @@ fail: } +static const char **debug_locks_args(TALLOC_CTX *mem_ctx, struct lock_context *lock_ctx) +{ + const char **args = NULL; + int tdb_flags; + int nargs, i; + + /* Program, lock helper PID, db|record, tdb path, fcntl|mutex, NULL */ + nargs = 6; + + args = talloc_array(mem_ctx, const char *, nargs); + if (args == NULL) { + return NULL; + } + + args[0] = talloc_strdup(args, "debug_locks"); + args[1] = talloc_asprintf(args, "%d", lock_ctx->child); + + if (lock_ctx->type == LOCK_RECORD) { + args[2] = talloc_strdup(args, "RECORD"); + } else { + args[2] = talloc_strdup(args, "DB"); + } + + args[3] = talloc_strdup(args, lock_ctx->ctdb_db->db_path); + + tdb_flags = tdb_get_flags(lock_ctx->ctdb_db->ltdb->tdb); + if (tdb_flags & TDB_MUTEX_LOCKING) { + args[4] = talloc_strdup(args, "MUTEX"); + } else { + args[4] = talloc_strdup(args, "FCNTL"); + } + + args[5] = NULL; + + for (i=0; ictdb; @@ -554,12 +599,18 @@ lock_debug: debug_locks, sizeof(debug_locks), "CTDB_DEBUG_LOCKS", getenv("CTDB_BASE"), "debug_locks.sh")) { - pid = vfork(); - if (pid == 0) { - execl(debug_locks, debug_locks, NULL); - _exit(0); + args = debug_locks_args(lock_ctx, lock_ctx); + if (args != NULL) { + pid = vfork(); + if (pid == 0) { + execvp(debug_locks, discard_const(args)); + _exit(0); + } + talloc_free(args); + ctdb_track_child(ctdb, pid); + } else { + D_WARNING("No memory for debug locks args\n"); } - ctdb_track_child(ctdb, pid); } else { DEBUG(DEBUG_WARNING, (__location__ -- 2.47.3