summaryrefslogtreecommitdiff
path: root/ctdb
diff options
context:
space:
mode:
authorAmitay Isaacs <amitay@gmail.com>2015-10-14 15:36:55 +1100
committerMartin Schwenke <martins@samba.org>2016-01-20 04:19:11 +0100
commit8ca76adaeaa284601424e2d3ec4cc4bd044ed0de (patch)
treeefc635f1af39d9947eee84e35b2a66fe18114526 /ctdb
parent555237f2a8bd42f7223397f73e62a2a3786484c5 (diff)
downloadsamba-8ca76adaeaa284601424e2d3ec4cc4bd044ed0de.tar.gz
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 <amitay@gmail.com> Reviewed-by: Martin Schwenke <martin@meltin.net>
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/client/client.h6
-rw-r--r--ctdb/client/client_connect.c17
-rw-r--r--ctdb/client/client_private.h3
3 files changed, 25 insertions, 1 deletions
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;