diff options
author | Amitay Isaacs <amitay@gmail.com> | 2015-10-14 15:36:55 +1100 |
---|---|---|
committer | Martin Schwenke <martins@samba.org> | 2016-01-20 04:19:11 +0100 |
commit | 8ca76adaeaa284601424e2d3ec4cc4bd044ed0de (patch) | |
tree | efc635f1af39d9947eee84e35b2a66fe18114526 /ctdb | |
parent | 555237f2a8bd42f7223397f73e62a2a3786484c5 (diff) | |
download | samba-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.h | 6 | ||||
-rw-r--r-- | ctdb/client/client_connect.c | 17 | ||||
-rw-r--r-- | ctdb/client/client_private.h | 3 |
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; |