typedef void ctdb_handle;
+struct ctdb_client_control_state;
-
-typedef void (*ctdb_control_callback)(int32_t status, struct ctdb_context *ctdb, ctdb_handle *, void *private_data);
+typedef void (*ctdb_control_callback)(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data);
/*
/*
* functions to read the pnn number of the local node
+ *
+ * ctdb_cancel_control(state) is used
+ * to abort this command before it completes.
*/
-ctdb_handle *
+struct ctdb_client_control_state *
ctdb_getpnn_send(struct ctdb_context *ctdb,
uint32_t destnode,
ctdb_control_callback callback,
void *private_data);
int ctdb_getpnn_recv(struct ctdb_context *ctdb,
- ctdb_handle *handle,
+ struct ctdb_client_control_state *state,
uint32_t *pnn);
int ctdb_getpnn(struct ctdb_context *ctdb,
uint32_t destnode,
/*
* functions to read the recovery master of a node
+ *
+ * ctdb_cancel_control(state) is used
+ * to abort this command before it completes.
*/
-ctdb_handle *
+struct ctdb_client_control_state *
ctdb_getrecmaster_send(struct ctdb_context *ctdb,
uint32_t destnode,
ctdb_control_callback callback,
void *private_data);
int ctdb_getrecmaster_recv(struct ctdb_context *ctdb,
- ctdb_handle *handle,
- uint32_t *recmaster);
+ struct ctdb_client_control_state *state,
+ uint32_t *recmaster);
int ctdb_getrecmaster(struct ctdb_context *ctdb,
uint32_t destnode,
uint32_t *recmaster);
+/*
+ * Cancel a control before it has completed
+ */
+int ctdb_cancel_control(struct ctdb_client_control_state *state);
+
/*
- * cancel a request/call or release a resource
+ * release a handle
*/
int ctdb_free(ctdb_handle *);
* This function is used to set the callback action for a handle
*/
static int
-ctdb_set_control_callback(ctdb_handle *handle, ctdb_control_callback callback, void *private_data)
+ctdb_set_control_callback(struct ctdb_client_control_state *state, ctdb_control_callback callback, void *private_data)
{
- struct ctdb_client_control_state *control_state = talloc_get_type(handle, struct ctdb_client_control_state);
-
- if (control_state != NULL) {
- struct ctdb_control_cb_data *cb_data;
-
- if (callback == NULL) {
- if (control_state->async.private_data != NULL) {
- talloc_free(control_state->async.private_data);
- control_state->async.private_data = NULL;
- }
- control_state->async.fn = NULL;
-
- return 0;
- }
+ struct ctdb_control_cb_data *cb_data;
- cb_data = talloc(control_state, struct ctdb_control_cb_data);
- if (cb_data == NULL) {
- DEBUG(DEBUG_ERR, (__location__ " Failed to alloc cb_data\n"));
- return -1;
+ if (callback == NULL) {
+ if (state->async.private_data != NULL) {
+ talloc_free(state->async.private_data);
+ state->async.private_data = NULL;
}
+ state->async.fn = NULL;
+ return 0;
+ }
- cb_data->callback = callback;
- cb_data->private_data = private_data;
+ cb_data = talloc(state, struct ctdb_control_cb_data);
+ if (cb_data == NULL) {
+ DEBUG(DEBUG_ERR, (__location__ " Failed to alloc cb_data\n"));
+ return -1;
+ }
- control_state->async.fn = ctdb_control_cb;
- control_state->async.private_data = cb_data;
+ cb_data->callback = callback;
+ cb_data->private_data = private_data;
- return 0;
- }
+ state->async.fn = ctdb_control_cb;
+ state->async.private_data = cb_data;
- DEBUG(DEBUG_ERR, (__location__ " Unknown type of handle passed to ctdb_set_callback.\n"));
- return -1;
+ return 0;
}
}
+int ctdb_cancel_control(struct ctdb_client_control_state *state)
+{
+ talloc_free(state);
+ return 0;
+}
int ctdb_free(ctdb_handle *handle)
{
/*************************
* GET PNN of local node *
*************************/
-ctdb_handle *
+struct ctdb_client_control_state *
ctdb_getpnn_send(struct ctdb_context *ctdb,
uint32_t destnode,
ctdb_control_callback callback,
ctdb_set_control_callback(state, callback, private_data);
}
- return (ctdb_handle *)state;
+ return state;
}
-int ctdb_getpnn_recv(struct ctdb_context *ctdb, ctdb_handle *handle, uint32_t *pnn)
+int ctdb_getpnn_recv(struct ctdb_context *ctdb, struct ctdb_client_control_state *state, uint32_t *pnn)
{
- struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state);
int ret;
if (state->c->opcode != CTDB_CONTROL_GET_PNN) {
/***********************
* GET RECOVERY MASTER *
***********************/
-ctdb_handle *
+struct ctdb_client_control_state *
ctdb_getrecmaster_send(struct ctdb_context *ctdb,
uint32_t destnode,
ctdb_control_callback callback,
ctdb_set_control_callback(state, callback, private_data);
}
- return (ctdb_handle *)state;
+ return state;
}
-int ctdb_getrecmaster_recv(struct ctdb_context *ctdb, ctdb_handle *handle, uint32_t *recmaster)
+int ctdb_getrecmaster_recv(struct ctdb_context *ctdb, struct ctdb_client_control_state *state, uint32_t *recmaster)
{
- struct ctdb_client_control_state *state = talloc_get_type(handle, struct ctdb_client_control_state);
int ret;
if (state->c->opcode != CTDB_CONTROL_GET_RECMASTER) {
}
-void pnn_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void *private_data)
+void pnn_cb(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data)
{
uint32_t pnn;
int ret;
return;
}
- ret = ctdb_getpnn_recv(ctdb, handle, &pnn);
+ ret = ctdb_getpnn_recv(ctdb, state, &pnn);
if (ret != 0) {
printf("Failed to read getpnn reply\n");
return;
printf("status:%d pnn:%d\n", status, pnn);
}
-void rm_cb(int32_t status, struct ctdb_context *ctdb, ctdb_handle *handle, void *private_data)
+void rm_cb(int32_t status, struct ctdb_context *ctdb, struct ctdb_client_control_state *state, void *private_data)
{
uint32_t rm;
int ret;
return;
}
- ret = ctdb_getrecmaster_recv(ctdb, handle, &rm);
+ ret = ctdb_getrecmaster_recv(ctdb, state, &rm);
if (ret != 0) {
printf("Failed to read getpnn reply\n");
return;
{
struct ctdb_context *ctdb;
struct ctdb_db_context *ctdb_db_context;
+ struct ctdb_client_control_state *control_state;
ctdb_handle *handle;
struct pollfd pfd;
int ret;
* ASYNC call with callback to read the recmaster
* this is the preferred way to use libctdb
*/
- handle = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, rm_cb, NULL);
- if (handle == NULL) {
+ control_state = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, rm_cb, NULL);
+ if (control_state == NULL) {
printf("Failed to send get_recmaster control\n");
exit(10);
}
* calls the blocking *_recv() function.
* Avoid this mode for performance critical tasks
*/
- handle = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, NULL, NULL);
- if (handle == NULL) {
+ control_state = ctdb_getrecmaster_send(ctdb, CTDB_CURRENT_NODE, NULL, NULL);
+ if (control_state == NULL) {
printf("Failed to send get_recmaster control\n");
exit(10);
}
- ret = ctdb_getrecmaster_recv(ctdb, handle, &recmaster);
+ ret = ctdb_getrecmaster_recv(ctdb, control_state, &recmaster);
if (ret != 0) {
printf("Failed to receive response to getrecmaster\n");
- ctdb_free(handle);
exit(10);
}
printf("GETRECMASTER SEMI-SYNC: status:%d recmaster:%d\n", ret, recmaster);