ctdb-tests: Reimplement message handlers using srvid abstraction
authorAmitay Isaacs <amitay@gmail.com>
Wed, 30 Aug 2017 06:59:16 +0000 (16:59 +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

This is required for CHECK_PID_SRVID control implementation.

Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/tests/src/fake_ctdbd.c

index 4d51dc54ddf23966b7c4da765abf38c52fad12f2..b09e80d70d0c02575e15c83f4ad2b3b6eaec02a6 100644 (file)
@@ -40,6 +40,7 @@
 #include "common/system.h"
 #include "common/logging.h"
 #include "common/tunable.h"
+#include "common/srvid.h"
 
 #include "ipalloc_read_known_ips.h"
 
@@ -95,12 +96,6 @@ struct database_map {
        struct database *db;
 };
 
-struct srvid_register_state {
-       struct srvid_register_state *prev, *next;
-       struct ctdbd_context *ctdb;
-       uint64_t srvid;
-};
-
 struct fake_control_failure {
        struct fake_control_failure  *prev, *next;
        enum ctdb_controls opcode;
@@ -121,7 +116,7 @@ struct ctdbd_context {
        struct interface_map *iface_map;
        struct vnn_map *vnn_map;
        struct database_map *db_map;
-       struct srvid_register_state *rstate;
+       struct srvid_context *srv;
        int num_clients;
        struct timeval start_time;
        struct timeval recovery_start_time;
@@ -898,6 +893,7 @@ static struct ctdbd_context *ctdbd_setup(TALLOC_CTX *mem_ctx)
        struct ctdbd_context *ctdb;
        char line[1024];
        bool status;
+       int ret;
 
        ctdb = talloc_zero(mem_ctx, struct ctdbd_context);
        if (ctdb == NULL) {
@@ -924,6 +920,11 @@ static struct ctdbd_context *ctdbd_setup(TALLOC_CTX *mem_ctx)
                goto fail;
        }
 
+       ret = srvid_init(ctdb, &ctdb->srv);
+       if (ret != 0) {
+               goto fail;
+       }
+
        while (fgets(line, sizeof(line), stdin) != NULL) {
                char *t;
 
@@ -1590,10 +1591,9 @@ fail:
 
 }
 
-static int srvid_register_state_destructor(struct srvid_register_state *rstate)
+static void srvid_handler(uint64_t srvid, TDB_DATA data, void *private_data)
 {
-       DLIST_REMOVE(rstate->ctdb->rstate, rstate);
-       return 0;
+       printf("Received a message for SRVID 0x%"PRIx64"\n", srvid);
 }
 
 static void control_register_srvid(TALLOC_CTX *mem_ctx,
@@ -1605,24 +1605,19 @@ static void control_register_srvid(TALLOC_CTX *mem_ctx,
                req, struct client_state);
        struct ctdbd_context *ctdb = state->ctdb;
        struct ctdb_reply_control reply;
-       struct srvid_register_state *rstate;
+       int ret;
 
        reply.rdata.opcode = request->opcode;
 
-       rstate = talloc_zero(ctdb, struct srvid_register_state);
-       if (rstate == NULL) {
+       ret = srvid_register(ctdb->srv, state, request->srvid,
+                            srvid_handler, state);
+       if (ret != 0) {
                reply.status = -1;
                reply.errmsg = "Memory error";
                goto fail;
        }
-       rstate->ctdb = ctdb;
-       rstate->srvid = request->srvid;
 
-       talloc_set_destructor(rstate, srvid_register_state_destructor);
-
-       DLIST_ADD_END(ctdb->rstate, rstate);
-
-       DEBUG(DEBUG_INFO, ("Register srvid 0x%"PRIx64"\n", rstate->srvid));
+       DEBUG(DEBUG_INFO, ("Register srvid 0x%"PRIx64"\n", request->srvid));
 
        reply.status = 0;
        reply.errmsg = NULL;
@@ -1640,24 +1635,18 @@ static void control_deregister_srvid(TALLOC_CTX *mem_ctx,
                req, struct client_state);
        struct ctdbd_context *ctdb = state->ctdb;
        struct ctdb_reply_control reply;
-       struct srvid_register_state *rstate = NULL;
+       int ret;
 
        reply.rdata.opcode = request->opcode;
 
-       for (rstate = ctdb->rstate; rstate != NULL; rstate = rstate->next) {
-               if (rstate->srvid == request->srvid) {
-                       break;
-               }
-       }
-
-       if (rstate == NULL) {
+       ret = srvid_deregister(ctdb->srv, request->srvid, state);
+       if (ret != 0) {
                reply.status = -1;
                reply.errmsg = "srvid not registered";
                goto fail;
        }
 
-       DEBUG(DEBUG_INFO, ("Deregister srvid 0x%"PRIx64"\n", rstate->srvid));
-       talloc_free(rstate);
+       DEBUG(DEBUG_INFO, ("Deregister srvid 0x%"PRIx64"\n", request->srvid));
 
        reply.status = 0;
        reply.errmsg = NULL;
@@ -1666,7 +1655,6 @@ static void control_deregister_srvid(TALLOC_CTX *mem_ctx,
        return;
 
 fail:
-       TALLOC_FREE(rstate);
        client_send_control(req, header, &reply);
 }