lockwait: Pass CTDB daemon PID on command line
authorAmitay Isaacs <amitay@gmail.com>
Fri, 5 Apr 2013 04:31:26 +0000 (15:31 +1100)
committerAmitay Isaacs <amitay@gmail.com>
Mon, 8 Apr 2013 01:16:55 +0000 (11:16 +1000)
In lockwait helper process we cannot rely on getppid() to find the pid
of CTDB daemon as CTDB daemon can go away before the helper executes. In
which case, ctdb helper process will hang around forever.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
server/ctdb_lockwait.c
server/ctdb_lockwait_helper.c

index cb5bc1c12a5945b7d9ccfc100e4f4c6a64392560..c23e3a05fa8c80ad628a8cdf936c44bfb0ae65aa 100644 (file)
@@ -158,7 +158,7 @@ struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
        struct lockwait_handle *result, *i;
        int ret;
        const char *prog = BINDIR "/ctdb_lockwait_helper";
-       char *arg0, *arg1, *arg2, *arg3;
+       char *arg0, *arg1, *arg2, *arg3, *arg4;
 
        CTDB_INCREMENT_STAT(ctdb_db->ctdb, lockwait_calls);
        CTDB_INCREMENT_STAT(ctdb_db->ctdb, pending_lockwait_calls);
@@ -204,15 +204,16 @@ struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
 
        /* Create data for the child process */
        arg0 = talloc_asprintf(result, "ctdb_lock-%s", ctdb_db->db_name);
-       arg1 = talloc_asprintf(result, "%d", result->fd[1]);
-       arg2 = talloc_strdup(result, ctdb_db->db_path);
+       arg1 = talloc_asprintf(result, "%d", ctdb_db->ctdb->ctdbd_pid);
+       arg2 = talloc_asprintf(result, "%d", result->fd[1]);
+       arg3 = talloc_strdup(result, ctdb_db->db_path);
        if (key.dsize == 0) {
-               arg3 = talloc_strdup(result, "NULL");
+               arg4 = talloc_strdup(result, "NULL");
        } else {
-               arg3 = hex_encode_talloc(result, key.dptr, key.dsize);
+               arg4 = hex_encode_talloc(result, key.dptr, key.dsize);
        }
 
-       if (!arg0 || !arg1 || !arg2 || !arg3) {
+       if (!arg0 || !arg1 || !arg2 || !arg3 || !arg4) {
                close(result->fd[0]);
                close(result->fd[1]);
                talloc_free(result);
@@ -236,7 +237,7 @@ struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
        if (result->child == 0) {
                close(result->fd[0]);
 
-               execl(prog, arg0, arg1, arg2, arg3, NULL);
+               execl(prog, arg0, arg1, arg2, arg3, arg4, NULL);
                _exit(1);
        }
 
@@ -244,6 +245,7 @@ struct lockwait_handle *ctdb_lockwait(struct ctdb_db_context *ctdb_db,
        talloc_free(arg1);
        talloc_free(arg2);
        talloc_free(arg3);
+       talloc_free(arg4);
 
        close(result->fd[1]);
 
index 2350e738f88e608280bcb8ff33b57334c27ed34e..07fdfb477310c50f7f8ab1c44ae379a90d3fb219 100644 (file)
@@ -40,14 +40,15 @@ int main(int argc, char *argv[])
        char result = 1;
        int ppid;
 
-       if (argc != 4) {
-               fprintf(stderr, "Usage: %s <output-fd> <db-path> <db-key>\n", argv[0]);
+       if (argc != 5) {
+               fprintf(stderr, "Usage: %s <ctdbd-pid> <output-fd> <db-path> <db-key>\n", argv[0]);
                exit(1);
        }
 
-       write_fd = atoi(argv[1]);
-       dbpath = argv[2];
-       dbkey = argv[3];
+       ppid = atoi(argv[1]);
+       write_fd = atoi(argv[2]);
+       dbpath = argv[3];
+       dbkey = argv[4];
 
        /* Convert hex key to key */
        if (strcmp(dbkey, "NULL") == 0) {
@@ -71,7 +72,6 @@ int main(int argc, char *argv[])
        result = 0;
        send_result(write_fd, result);
 
-       ppid = getppid();
        while (kill(ppid, 0) == 0 || errno != ESRCH) {
                sleep(5);
        }