ctdb-daemon: Add implementation of control CHECK_PID_SRVID
authorAmitay Isaacs <amitay@gmail.com>
Wed, 30 Aug 2017 06:18:02 +0000 (16:18 +1000)
committerMartin Schwenke <martins@samba.org>
Thu, 21 Sep 2017 06:53:26 +0000 (08:53 +0200)
BUG: https://bugzilla.samba.org/show_bug.cgi?id=13042

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/include/ctdb_private.h
ctdb/server/ctdb_control.c
ctdb/server/ctdb_daemon.c

index 9be81ff8603740f2e0952c173cb689852715bf6e..227d518c0ceae853839d06f5b218f6a15e778b91 100644 (file)
@@ -582,6 +582,8 @@ struct ctdb_client *ctdb_find_client_by_pid(struct ctdb_context *ctdb,
                                            pid_t pid);
 
 int32_t ctdb_control_process_exists(struct ctdb_context *ctdb, pid_t pid);
+int32_t ctdb_control_check_pid_srvid(struct ctdb_context *ctdb,
+                                    TDB_DATA indata);
 
 int ctdb_control_getnodesfile(struct ctdb_context *ctdb, uint32_t opcode,
                              TDB_DATA indata, TDB_DATA *outdata);
index 9f74011e0a58b76cd33a13ec7c66e2fd35589523..9aeaa235830f8a2461efdd2fa1d2799c2eceb7fc 100644 (file)
@@ -696,6 +696,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
                return 0;
        }
 
+       case CTDB_CONTROL_CHECK_PID_SRVID:
+               CHECK_CONTROL_DATA_SIZE((sizeof(pid_t) + sizeof(uint64_t)));
+               return ctdb_control_check_pid_srvid(ctdb, indata);
+
        default:
                DEBUG(DEBUG_CRIT,(__location__ " Unknown CTDB control opcode %u\n", opcode));
                return -1;
index 8ae43517a8563ea99e084f525e991b76bde9ef3c..90e8b715bae8db051699b9b2004b7f0f198ebbee 100644 (file)
@@ -1771,6 +1771,30 @@ int32_t ctdb_control_process_exists(struct ctdb_context *ctdb, pid_t pid)
        return kill(pid, 0);
 }
 
+int32_t ctdb_control_check_pid_srvid(struct ctdb_context *ctdb,
+                                    TDB_DATA indata)
+{
+        struct ctdb_client *client;
+       pid_t pid;
+       uint64_t srvid;
+       int ret;
+
+       pid = *(pid_t *)indata.dptr;
+       srvid = *(uint64_t *)(indata.dptr + sizeof(pid_t));
+
+       client = ctdb_find_client_by_pid(ctdb, pid);
+       if (client == NULL) {
+               return -1;
+       }
+
+       ret = srvid_exists(ctdb->srv, srvid, client);
+       if (ret != 0) {
+               return -1;
+       }
+
+       return 0;
+}
+
 int ctdb_control_getnodesfile(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata)
 {
        struct ctdb_node_map_old *node_map = NULL;