From e675f346805de1754a6b18cf0dfbc71df9c7a05d Mon Sep 17 00:00:00 2001 From: Amitay Isaacs Date: Wed, 30 Aug 2017 13:27:12 +1000 Subject: [PATCH] ctdb-common: Extend srvid_exists() check to support optional private_data BUG: https://bugzilla.samba.org/show_bug.cgi?id=13042 Signed-off-by: Amitay Isaacs Reviewed-by: Martin Schwenke --- ctdb/common/srvid.c | 13 ++++++++++++- ctdb/common/srvid.h | 8 +++++++- ctdb/tests/src/srvid_test.c | 12 ++++++++++-- 3 files changed, 29 insertions(+), 4 deletions(-) diff --git a/ctdb/common/srvid.c b/ctdb/common/srvid.c index f9cd49b4ea3..33049941e69 100644 --- a/ctdb/common/srvid.c +++ b/ctdb/common/srvid.c @@ -221,9 +221,10 @@ int srvid_deregister(struct srvid_context *srv, uint64_t srvid, /* * Check if a message handler exists */ -int srvid_exists(struct srvid_context *srv, uint64_t srvid) +int srvid_exists(struct srvid_context *srv, uint64_t srvid, void *private_data) { struct srvid_handler_list *list; + struct srvid_handler *h; int ret; ret = srvid_fetch(srv, srvid, &list); @@ -234,6 +235,16 @@ int srvid_exists(struct srvid_context *srv, uint64_t srvid) return ENOENT; } + if (private_data != NULL) { + for (h = list->h; h != NULL; h = h->next) { + if (h->private_data == private_data) { + return 0; + } + } + + return ENOENT; + } + return 0; } diff --git a/ctdb/common/srvid.h b/ctdb/common/srvid.h index f048b5c6cbf..702724ff93a 100644 --- a/ctdb/common/srvid.h +++ b/ctdb/common/srvid.h @@ -91,11 +91,17 @@ int srvid_deregister(struct srvid_context *srv, uint64_t srvid, /** * @brief Check if any message handler is registered for srvid * + * If private_data is NULL, then check if there is any registration + * for * specified srvid. If private_data is not NULL, then check for + * registration that matches the specified private data. + * * @param[in] srv The srvid message handler database context * @param[in] srvid The srvid + * @param[in] private_data Private data * @return 0 on success, errno on failure */ -int srvid_exists(struct srvid_context *srv, uint64_t srvid); +int srvid_exists(struct srvid_context *srv, uint64_t srvid, + void *private_data); /** * @brief Call message handlers for given srvid diff --git a/ctdb/tests/src/srvid_test.c b/ctdb/tests/src/srvid_test.c index b979c19c2f5..2367c6c7691 100644 --- a/ctdb/tests/src/srvid_test.c +++ b/ctdb/tests/src/srvid_test.c @@ -52,7 +52,10 @@ int main(void) ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, &count); assert(ret == 0); - ret = srvid_exists(srv, TEST_SRVID); + ret = srvid_exists(srv, TEST_SRVID, NULL); + assert(ret == 0); + + ret = srvid_exists(srv, TEST_SRVID, &count); assert(ret == 0); ret = srvid_dispatch(srv, TEST_SRVID, 0, tdb_null); @@ -73,7 +76,7 @@ int main(void) assert(ret == 0); talloc_free(tmp_ctx); - ret = srvid_exists(srv, TEST_SRVID); + ret = srvid_exists(srv, TEST_SRVID, NULL); assert(ret == ENOENT); ret = srvid_dispatch(srv, TEST_SRVID, 0, tdb_null); @@ -84,8 +87,13 @@ int main(void) ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, NULL); assert(ret == 0); + ret = srvid_exists(srv, TEST_SRVID, &count); + assert(ret == ENOENT); + ret = srvid_register(srv, tmp_ctx, TEST_SRVID, test_handler, &count); assert(ret == 0); + ret = srvid_exists(srv, TEST_SRVID, &count); + assert(ret == 0); talloc_free(srv); assert(talloc_get_size(mem_ctx) == 0); -- 2.34.1