From 8ca76adaeaa284601424e2d3ec4cc4bd044ed0de Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Wed, 14 Oct 2015 15:36:55 +1100 Subject: [PATCH] ctdb-client: Add a disconnect callback for ctdb client This allows the client code to optionally clean up and/or re-connect to CTDB daemon when it the daemon goes away. If no disconnect callback is registered and CTDB daemon goes away, then the client will terminate. Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- ctdb/client/client.h | 6 ++++++ ctdb/client/client_connect.c | 17 ++++++++++++++++- ctdb/client/client_private.h | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/ctdb/client/client.h b/ctdb/client/client.h index 3a160697536..bce0c6b39b9 100644 --- a/ctdb/client/client.h +++ b/ctdb/client/client.h @@ -30,11 +30,17 @@ struct ctdb_client_context; struct ctdb_db_context; struct ctdb_record_handle; +typedef void (*ctdb_client_callback_func_t)(void *private_data); + /* from client/client_connect.c */ int ctdb_client_init(TALLOC_CTX *mem_ctx, struct tevent_context *ev, const char *sockpath, struct ctdb_client_context **ret); +void ctdb_client_set_disconnect_callback(struct ctdb_client_context *client, + ctdb_client_callback_func_t func, + void *private_data); + uint32_t ctdb_client_pnn(struct ctdb_client_context *client); void ctdb_client_wait(struct tevent_context *ev, bool *done); diff --git a/ctdb/client/client_connect.c b/ctdb/client/client_connect.c index 8cff21307db..d433f7ddc3f 100644 --- a/ctdb/client/client_connect.c +++ b/ctdb/client/client_connect.c @@ -206,12 +206,27 @@ static void client_dead_handler(void *private_data) { struct ctdb_client_context *client = talloc_get_type_abort( private_data, struct ctdb_client_context); + ctdb_client_callback_func_t callback = client->callback; + void *callback_data = client->private_data; - DEBUG(DEBUG_NOTICE, ("connection to daemon closed, exiting\n")); talloc_free(client); + if (callback != NULL) { + callback(callback_data); + return; + } + + DEBUG(DEBUG_NOTICE, ("connection to daemon closed, exiting\n")); exit(1); } +void ctdb_client_set_disconnect_callback(struct ctdb_client_context *client, + ctdb_client_callback_func_t callback, + void *private_data) +{ + client->callback = callback; + client->private_data = private_data; +} + uint32_t ctdb_client_pnn(struct ctdb_client_context *client) { return client->pnn; diff --git a/ctdb/client/client_private.h b/ctdb/client/client_private.h index b1d8d4b8c5b..7ea9b129202 100644 --- a/ctdb/client/client_private.h +++ b/ctdb/client/client_private.h @@ -21,6 +21,7 @@ #define __CTDB_CLIENT_PRIVATE_H__ #include "protocol/protocol.h" +#include "client/client.h" struct ctdb_db_context { struct ctdb_db_context *prev, *next; @@ -35,6 +36,8 @@ struct ctdb_client_context { struct reqid_context *idr; struct srvid_context *srv; struct comm_context *comm; + ctdb_client_callback_func_t callback; + void *private_data; int fd; uint32_t pnn; struct ctdb_db_context *db; -- 2.34.1