let the ctdb_createdb*() fucntions return the db_id
authorRonnie Sahlberg <ronniesahlberg@gmail.com>
Fri, 14 May 2010 02:43:00 +0000 (12:43 +1000)
committerRonnie Sahlberg <ronniesahlberg@gmail.com>
Fri, 14 May 2010 02:43:00 +0000 (12:43 +1000)
client/ctdb_client.c
include/ctdb.h
libctdb/libctdb.c
libctdb/tst.c

index 3032213e980d840c9bf07d5903585138f41e8a58..b01f4c46f4c2b3f223823996f394798b2d571e5e 100644 (file)
@@ -902,7 +902,7 @@ int ctdb_ctrl_createdb(struct ctdb_context *ctdb, struct timeval timeout,
                event_add_timed(ctdb->ev, handle, timeout, ctdb_control_timeout_func, handle);
        }
 
-       ret = ctdb_createdb_recv(ctdb, handle);
+       ret = ctdb_createdb_recv(ctdb, handle, NULL);
        if (ret != 0) {
                DEBUG(DEBUG_ERR,(__location__ " ctdb control for createdb failed\n"));
                return -1;
index cf616583e4a5fe7ee65e2dfb898cefd18a5c3ab7..fc910ce5c288c4ba680907d020614bfd045d0a14 100644 (file)
@@ -156,7 +156,7 @@ int ctdb_getrecmaster(struct ctdb_context *ctdb,
  * functions to create a database
  * if the database already exists this function is a NOP
  */
-typedef void (*ctdb_createdb_cb)(int32_t status, void *private_data);
+typedef void (*ctdb_createdb_cb)(int32_t status, uint32_t db_id, void *private_data);
 
 ctdb_handle *
 ctdb_createdb_send(struct ctdb_context *ctdb, uint32_t destnode,
@@ -164,9 +164,9 @@ ctdb_createdb_send(struct ctdb_context *ctdb, uint32_t destnode,
                   ctdb_createdb_cb callback,
                   void *private_data);
 int ctdb_createdb_recv(struct ctdb_context *ctdb,
-                      ctdb_handle *handle);
+                      ctdb_handle *handle, uint32_t *db_id);
 int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode,
-                 const char *name, int persistent);
+                 const char *name, int persistent, uint32_t *db_id);
 
 
 
index 3314f4b10a439eb4768376f41e27224a4c7d4496..ceb78e2f332895429f678b5ca2ea0907dd1b3e5a 100644 (file)
@@ -143,6 +143,7 @@ int ctdb_cancel(ctdb_handle *handle)
 struct ctdb_control_cb_data {
        void *callback;
        void *private_data;
+       uint32_t db_id;
 };
 
 
@@ -477,8 +478,20 @@ ctdb_createdb_recv_cb(struct ctdb_client_control_state *state)
 {
        struct ctdb_control_cb_data *cb_data = state->async.private_data;
        ctdb_createdb_cb callback = (ctdb_createdb_cb)cb_data->callback;
+       uint32_t db_id;
 
-       callback(state->status, cb_data->private_data);
+       if (state->state == CTDB_CONTROL_DONE && state->status == 0) {
+               if (state->outdata.dsize != sizeof(uint32_t)) {
+                       DEBUG(DEBUG_ERR, (" Wrond size of data returned for CREATEDB control. Got %zd bytes but expected %zd\n", state->outdata.dsize, sizeof(uint32_t)));
+                       
+                       callback(CTDB_CONTROL_ERROR, 0, cb_data->private_data);
+                       return;
+               }
+
+               db_id = *(uint32_t *)state->outdata.dptr;
+       }
+
+       callback(state->status, db_id, cb_data->private_data);
 }
 
 
@@ -518,22 +531,36 @@ ctdb_createdb_send(struct ctdb_context *ctdb, uint32_t destnode,
 }
 
 
-int ctdb_createdb_recv(struct ctdb_context *ctdb, ctdb_handle *handle)
+int ctdb_createdb_recv(struct ctdb_context *ctdb, ctdb_handle *handle, uint32_t *db_id)
 {
        struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state);
        int ret;
        int32_t res;
+       TALLOC_CTX *tmp_ctx = talloc_new(NULL);
+       TDB_DATA data;
 
-       ret = ctdb_control_recv(ctdb, state, state, NULL, &res, NULL);
+       ret = ctdb_control_recv(ctdb, state, tmp_ctx, &data, &res, NULL);
        if (ret != 0 || res != 0) {
                DEBUG(DEBUG_ERR,(__location__ " ctdb_createdb_recv failed\n"));
+               talloc_free(tmp_ctx);
                return -1;
        }
 
+       if (data.dsize != sizeof(uint32_t)) {
+               DEBUG(DEBUG_ERR, (__location__ " Wrong size of returned data. Got %zd bytes but expected %zd\n", data.dsize, sizeof(uint32_t)));
+               talloc_free(tmp_ctx);
+               return -1;
+       }
+
+       if (db_id != NULL) {
+               *db_id = *(uint32_t *)data.dptr;
+       }
+
+       talloc_free(tmp_ctx);
        return state->status;
 }
 
-int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode, const char *name, int persistent)
+int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode, const char *name, int persistent, uint32_t *db_id)
 {
        struct ctdb_client_control_state *state;
        
@@ -543,7 +570,7 @@ int ctdb_createdb(struct ctdb_context *ctdb, uint32_t destnode, const char *name
                return -1;
        }
 
-       return ctdb_createdb_recv(ctdb, state);
+       return ctdb_createdb_recv(ctdb, state, db_id);
 }
 
 
index 17d7f6e09ec293dbb4475e7effe3e989dff64b85..821ea7f87935c6d3d7ea486a8cc7f76907ae2c73 100644 (file)
@@ -33,7 +33,6 @@ int main(int argc, char *argv[])
 
        ctdb_context = ctdb_connect("/tmp/ctdb.socket");
 
-
        handle = ctdb_set_message_handler_send(ctdb_context, 55, NULL, msg_h, NULL);
        if (handle == NULL) {
                printf("Failed to register message port\n");
@@ -66,7 +65,6 @@ int main(int argc, char *argv[])
                exit(10);
        }
 
-
        pfd.fd = ctdb_get_fd(ctdb_context);
        for (;;) {
          pfd.events = ctdb_which_events(ctdb_context);