Add CTDB_CONTROL_CHECK_SRVID
authorVolker Lendecke <vl@samba.org>
Mon, 31 Oct 2011 12:29:13 +0000 (13:29 +0100)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Wed, 7 Mar 2012 04:50:38 +0000 (15:50 +1100)
include/ctdb_private.h
include/ctdb_protocol.h
server/ctdb_control.c
server/ctdb_daemon.c

index 675ea49c241f1d6495b28f10f5394fe1d79d32a6..a1db4d1322ec43477f0e9ca396bb638b9cdd07ef 100644 (file)
@@ -954,6 +954,8 @@ int ctdb_dispatch_message(struct ctdb_context *ctdb, uint64_t srvid, TDB_DATA da
 int daemon_register_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
 int ctdb_deregister_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data);
 int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client_id, uint64_t srvid);
+int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
+                       TDB_DATA *outdata);
 
 int32_t ctdb_ltdb_enable_seqnum(struct ctdb_context *ctdb, uint32_t db_id);
 int32_t ctdb_ltdb_update_seqnum(struct ctdb_context *ctdb, uint32_t db_id, uint32_t srcnode);
index 0422afeb7b73306ef93bf61d145bd86ee30ff822..d0a9537783381d1216fdf059789d8ae77b4a97b9 100644 (file)
@@ -363,6 +363,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 0,
                    CTDB_CONTROL_TCP_ADD_DELAYED_UPDATE  = 126,
                    CTDB_CONTROL_GET_STAT_HISTORY        = 127,
                    CTDB_CONTROL_SCHEDULE_FOR_DELETION   = 128,
+                   CTDB_CONTROL_CHECK_SRVIDS            = 130,
 };
 
 /*
index 748907f2a9c3f09e524033d4918bd3d4b43020ce..83e1bd12060327725b76593201a2224c146d6179 100644 (file)
@@ -253,6 +253,9 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
        case CTDB_CONTROL_DEREGISTER_SRVID:
                return daemon_deregister_message_handler(ctdb, client_id, srvid);
 
+       case CTDB_CONTROL_CHECK_SRVIDS:
+               return daemon_check_srvids(ctdb, indata, outdata);
+
        case CTDB_CONTROL_ENABLE_SEQNUM:
                CHECK_CONTROL_DATA_SIZE(sizeof(uint32_t));
                return ctdb_ltdb_enable_seqnum(ctdb, *(uint32_t *)indata.dptr);
index f0c7ec9f6cee9b61b86fc849eca40f203edcb181..8b9f2eb2ceb8e29e078d59a8c233773ad2a4619e 100644 (file)
@@ -204,6 +204,42 @@ int daemon_deregister_message_handler(struct ctdb_context *ctdb, uint32_t client
        return ctdb_deregister_message_handler(ctdb, srvid, client);
 }
 
+int daemon_check_srvids(struct ctdb_context *ctdb, TDB_DATA indata,
+                       TDB_DATA *outdata)
+{
+       uint64_t *ids;
+       int i, num_ids;
+       uint8_t *results;
+
+       if ((indata.dsize % sizeof(uint64_t)) != 0) {
+               DEBUG(DEBUG_ERR, ("Bad indata in daemon_check_srvids, "
+                                 "size=%d\n", (int)indata.dsize));
+               return -1;
+       }
+
+       ids = (uint64_t *)indata.dptr;
+       num_ids = indata.dsize / 8;
+
+       results = talloc_zero_array(outdata, uint8_t, (num_ids+7)/8);
+       if (results == NULL) {
+               DEBUG(DEBUG_ERR, ("talloc failed in daemon_check_srvids\n"));
+               return -1;
+       }
+       for (i=0; i<num_ids; i++) {
+               struct ctdb_message_list *ml;
+               for (ml=ctdb->message_list; ml; ml=ml->next) {
+                       if (ml->srvid == ids[i]) {
+                               break;
+                       }
+               }
+               if (ml != NULL) {
+                       results[i/8] |= (1 << (i%8));
+               }
+       }
+       outdata->dptr = (uint8_t *)results;
+       outdata->dsize = talloc_get_size(results);
+       return 0;
+}
 
 /*
   destroy a ctdb_client