From: Ronnie Sahlberg Date: Tue, 11 May 2010 23:40:16 +0000 (+1000) Subject: Update ctdb_remove_message_handler to provide a nonblocking async version X-Git-Url: http://git.samba.org/?p=sahlberg%2Fctdb.git;a=commitdiff_plain;h=a9b8f93e992a911817b5b2a20ae16b50aee90298 Update ctdb_remove_message_handler to provide a nonblocking async version --- diff --git a/include/ctdb.h b/include/ctdb.h index 807204b2..12bdb895 100644 --- a/include/ctdb.h +++ b/include/ctdb.h @@ -55,10 +55,22 @@ ctdb_set_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid, int ctdb_set_message_handler_recv(struct ctdb_context *ctdb, ctdb_handle *handle); -int ctdb_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid, ctdb_message_fn_t handler, void *private_data); +int ctdb_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid, + ctdb_message_fn_t handler, void *private_data); -int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data); +typedef void (*ctdb_remove_message_handler_cb)(int32_t status, void *private_data); + +ctdb_handle * +ctdb_remove_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid, + ctdb_remove_message_handler_cb callback, + void *private_data); + +int ctdb_remove_message_handler_recv(struct ctdb_context *ctdb, + ctdb_handle *handle); + +int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, + void *private_data); int ctdb_send_message(struct ctdb_context *ctdb, uint32_t pnn, uint64_t srvid, TDB_DATA data); diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c index 61470de4..254be93f 100644 --- a/libctdb/libctdb.c +++ b/libctdb/libctdb.c @@ -216,6 +216,15 @@ int ctdb_getrecmaster(struct ctdb_context *ctdb, uint32_t destnode, uint32_t *re } +static void +ctdb_set_message_handler_recv_cb(struct ctdb_client_control_state *state) +{ + struct ctdb_control_cb_data *cb_data = state->async.private_data; + ctdb_set_message_handler_cb callback = (ctdb_set_message_handler_cb)cb_data->callback; + + callback(state->status, cb_data->private_data); +} + /* tell the daemon what messaging srvid we will use, and register the message @@ -249,7 +258,7 @@ ctdb_set_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid, cb_data->callback = callback; cb_data->private_data = private_data; - state->async.fn = ctdb_getrecmaster_recv_cb; + state->async.fn = ctdb_set_message_handler_recv_cb; state->async.private_data = cb_data; } @@ -283,3 +292,81 @@ int ctdb_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid, ctdb_mes return ctdb_set_message_handler_recv(ctdb, state); } + + + +static void +ctdb_remove_message_handler_recv_cb(struct ctdb_client_control_state *state) +{ + struct ctdb_control_cb_data *cb_data = state->async.private_data; + ctdb_remove_message_handler_cb callback = (ctdb_remove_message_handler_cb)cb_data->callback; + + callback(state->status, cb_data->private_data); +} + + +ctdb_handle * +ctdb_remove_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid, + ctdb_remove_message_handler_cb callback, + void *private_data) + +{ + struct ctdb_client_control_state *state; + struct ctdb_control_cb_data *cb_data; + + if (ctdb_deregister_message_handler(ctdb, srvid, private_data)) { + return NULL; + } + + state = ctdb_control_send(ctdb, CTDB_CURRENT_NODE, srvid, + CTDB_CONTROL_DEREGISTER_SRVID, 0, tdb_null, + ctdb, NULL, NULL); + + if (state == NULL) { + DEBUG(DEBUG_ERR,(__location__ " Failed to send DEREGISTER_SRVID control\n")); + return NULL; + } + + if (callback != NULL) { + cb_data = talloc(state, struct ctdb_control_cb_data); + cb_data->callback = callback; + cb_data->private_data = private_data; + + state->async.fn = ctdb_remove_message_handler_recv_cb; + state->async.private_data = cb_data; + } + + return (ctdb_handle *)state; +} + + +int ctdb_remove_message_handler_recv(struct ctdb_context *ctdb, ctdb_handle *handle) +{ + struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state); + int ret; + int32_t res; + + ret = ctdb_control_recv(ctdb, state, state, NULL, &res, NULL); + if (ret != 0 || res != 0) { + DEBUG(DEBUG_ERR,(__location__ " ctdb_remove_message_handler_recv failed\n")); + return -1; + } + + return state->status; +} + +/* + tell the daemon we no longer want a srvid +*/ +int ctdb_remove_message_handler(struct ctdb_context *ctdb, uint64_t srvid, void *private_data) +{ + struct ctdb_client_control_state *state; + + state = ctdb_remove_message_handler_send(ctdb, srvid, NULL, private_data); + if (state == NULL) { + DEBUG(DEBUG_ERR,(__location__ " ctdb_remove_message_handler_send() failed.\n")); + return -1; + } + + return ctdb_remove_message_handler_recv(ctdb, state); +}