From e30978eae14a2c8fe982efa8c8fda4e2cf0c3496 Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Tue, 30 Apr 2013 14:32:46 +1000 Subject: locking: Create commandline arguments for locking helper Signed-off-by: Amitay Isaacs (This used to be ctdb commit f665e3d540c90579952e590caa5828acb581ae61) --- ctdb/server/ctdb_lock.c | 115 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c index db38e0d7c1..8e2f40dd4e 100644 --- a/ctdb/server/ctdb_lock.c +++ b/ctdb/server/ctdb_lock.c @@ -685,6 +685,121 @@ static char *lock_child_log_prefix(struct lock_context *lock_ctx) } +static int db_count_handler(struct ctdb_db_context *ctdb_db, uint32_t priority, + void *private_data) +{ + int *count = (int *)private_data; + + (*count)++; + + return 0; +} + +struct db_namelist { + char **names; + int n; +}; + +static int db_name_handler(struct ctdb_db_context *ctdb_db, uint32_t priority, + void *private_data) +{ + struct db_namelist *list = (struct db_namelist *)private_data; + + list->names[list->n] = talloc_strdup(list->names, ctdb_db->db_path); + list->n++; + + return 0; +} + +static char **lock_helper_args(TALLOC_CTX *mem_ctx, struct lock_context *lock_ctx, int fd) +{ + struct ctdb_context *ctdb = lock_ctx->ctdb; + char **args = NULL; + int nargs, i; + int priority; + struct db_namelist list; + + switch (lock_ctx->type) { + case LOCK_RECORD: + nargs = 6; + break; + + case LOCK_DB: + nargs = 5; + break; + + case LOCK_ALLDB_PRIO: + nargs = 4; + ctdb_db_iterator(ctdb, lock_ctx->priority, db_count_handler, &nargs); + break; + + case LOCK_ALLDB: + nargs = 4; + for (priority=1; prioritytype) { + case LOCK_RECORD: + args[3] = talloc_strdup(args, "RECORD"); + args[4] = talloc_strdup(args, lock_ctx->ctdb_db->db_path); + if (lock_ctx->key.dsize == 0) { + args[5] = talloc_strdup(args, "NULL"); + } else { + args[5] = hex_encode_talloc(args, lock_ctx->key.dptr, lock_ctx->key.dsize); + } + break; + + case LOCK_DB: + args[3] = talloc_strdup(args, "DB"); + args[4] = talloc_strdup(args, lock_ctx->ctdb_db->db_path); + break; + + case LOCK_ALLDB_PRIO: + args[3] = talloc_strdup(args, "DB"); + list.names = args; + list.n = 4; + ctdb_db_iterator(ctdb, lock_ctx->priority, db_name_handler, &list); + break; + + case LOCK_ALLDB: + args[3] = talloc_strdup(args, "DB"); + list.names = args; + list.n = 4; + for (priority=1; priority