diff options
author | Amitay Isaacs <amitay@gmail.com> | 2013-04-30 14:32:46 +1000 |
---|---|---|
committer | Amitay Isaacs <amitay@gmail.com> | 2013-05-24 09:06:39 +1000 |
commit | e30978eae14a2c8fe982efa8c8fda4e2cf0c3496 (patch) | |
tree | d7a0eec5317dd0a978202b826d2d2af48f6b6efd /ctdb/server/ctdb_lock.c | |
parent | 30aa825c1ef9e39b10473ac85fee85f4a0f33278 (diff) | |
download | samba-e30978eae14a2c8fe982efa8c8fda4e2cf0c3496.tar.gz samba-e30978eae14a2c8fe982efa8c8fda4e2cf0c3496.tar.xz samba-e30978eae14a2c8fe982efa8c8fda4e2cf0c3496.zip |
locking: Create commandline arguments for locking helper
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
(This used to be ctdb commit f665e3d540c90579952e590caa5828acb581ae61)
Diffstat (limited to 'ctdb/server/ctdb_lock.c')
-rw-r--r-- | ctdb/server/ctdb_lock.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/ctdb/server/ctdb_lock.c b/ctdb/server/ctdb_lock.c index db38e0d7c13..8e2f40dd4e0 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; priority<NUM_DB_PRIORITIES; priority++) { + ctdb_db_iterator(ctdb, priority, db_count_handler, &nargs); + } + break; + } + + /* Add extra argument for null termination */ + nargs++; + + args = talloc_array(mem_ctx, char *, nargs); + if (args == NULL) { + return NULL; + } + + args[0] = talloc_strdup(args, "ctdb_lock_helper"); + args[1] = talloc_asprintf(args, "%d", getpid()); + args[2] = talloc_asprintf(args, "%d", fd); + + switch (lock_ctx->type) { + 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<NUM_DB_PRIORITIES; priority++) { + ctdb_db_iterator(ctdb, priority, db_name_handler, &list); + } + break; + } + + /* Make sure last argument is NULL */ + args[nargs-1] = NULL; + + for (i=0; i<nargs-1; i++) { + if (args[i] == NULL) { + talloc_free(args); + return NULL; + } + } + + return args; +} + + /* * Schedule a new lock child process * Set up callback handler and timeout handler |