ctdb-client: Add a disconnect callback for ctdb client
authorAmitay Isaacs <amitay@gmail.com>
Wed, 14 Oct 2015 04:36:55 +0000 (15:36 +1100)
committerMartin Schwenke <martins@samba.org>
Wed, 20 Jan 2016 03:19:11 +0000 (04:19 +0100)
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 <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/client/client.h
ctdb/client/client_connect.c
ctdb/client/client_private.h

index 3a160697536d7e007144ff69b4a7b4583eff767d..bce0c6b39b9a59d30e385aedac214a5e9b61e622 100644 (file)
@@ -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);
index 8cff21307dbe090b88b948c37fb2ac85613bd424..d433f7ddc3fddd5cbb2012480e645a7a6fd49d52 100644 (file)
@@ -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;
index b1d8d4b8c5b7fc5cc89ae63d7b9f44ab55e564c0..7ea9b1292024a02e6e170e7163b12b967cfa8599 100644 (file)
@@ -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;