From: Ronnie Sahlberg Date: Thu, 3 May 2007 23:01:01 +0000 (+1000) Subject: change the signature for ctdb_ctrl_getnodemap() so that a timeout X-Git-Tag: tevent-0.9.20~348^2~2787^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ae73784c2855f2f9d05cd90569d73994e1be7bc2;p=thirdparty%2Fsamba.git change the signature for ctdb_ctrl_getnodemap() so that a timeout parameter is added. change ctdb_get_connected_nodes in the same way (This used to be ctdb commit d85f23bcf4c1230225abb2f4a053c70b68d469aa) --- diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index 13c242b9fc6..4e401728a10 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -893,8 +893,9 @@ int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX /* get a list of nodes (vnn and flags ) from a remote node */ -int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, uint32_t destnode, - TALLOC_CTX *mem_ctx, struct ctdb_node_map **nodemap) +int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, + struct timeval timeout, uint32_t destnode, + TALLOC_CTX *mem_ctx, struct ctdb_node_map **nodemap) { int ret; TDB_DATA data, outdata; @@ -903,7 +904,7 @@ int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, uint32_t destnode, ZERO_STRUCT(data); ret = ctdb_control(ctdb, destnode, 0, CTDB_CONTROL_GET_NODEMAP, 0, data, - ctdb, &outdata, &res, NULL); + ctdb, &outdata, &res, &timeout); if (ret != 0 || res != 0) { DEBUG(0,(__location__ " ctdb_control for getnodes failed\n")); return -1; @@ -1253,8 +1254,10 @@ int ctdb_ctrl_set_debuglevel(struct ctdb_context *ctdb, uint32_t destnode, uint3 /* get a list of connected nodes */ -uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, - uint32_t *num_nodes) +uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, + struct timeval timeout, + TALLOC_CTX *mem_ctx, + uint32_t *num_nodes) { struct ctdb_node_map *map=NULL; int ret, i; @@ -1262,7 +1265,7 @@ uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, TALLOC_CTX *mem_ct *num_nodes = 0; - ret = ctdb_ctrl_getnodemap(ctdb, CTDB_CURRENT_NODE, mem_ctx, &map); + ret = ctdb_ctrl_getnodemap(ctdb, timeout, CTDB_CURRENT_NODE, mem_ctx, &map); if (ret != 0) { return NULL; } diff --git a/ctdb/direct/recoverd.c b/ctdb/direct/recoverd.c index 3c1b5f5dda9..08ba651f973 100644 --- a/ctdb/direct/recoverd.c +++ b/ctdb/direct/recoverd.c @@ -26,7 +26,7 @@ #include "../include/ctdb.h" #include "../include/ctdb_private.h" -static int timeout = 0; +static int timed_out = 0; /* show usage message @@ -42,7 +42,7 @@ static void usage(void) void timeout_func(struct event_context *ev, struct timed_event *te, struct timeval t, void *private_data) { - timeout = 1; + timed_out = 1; } @@ -50,6 +50,8 @@ void recoverd(struct ctdb_context *ctdb, struct event_context *ev) { uint32_t vnn; TALLOC_CTX *mem_ctx=NULL; + struct ctdb_node_map *nodemap=NULL; + int ret; again: if (mem_ctx) { @@ -64,9 +66,9 @@ again: /* we only check for recovery once every second */ - timeout = 0; + timed_out = 0; event_add_timed(ctdb->ev, mem_ctx, timeval_current_ofs(1, 0), timeout_func, ctdb); - while (!timeout) { + while (!timed_out) { event_loop_once(ev); } @@ -76,6 +78,11 @@ again: printf("our node number is :%d\n",vnn); /* get number of nodes */ + ret = ctdb_ctrl_getnodemap(ctdb, timeval_current_ofs(1, 0), vnn, mem_ctx, &nodemap); + if (ret != 0) { + printf("Unable to get nodemap from node %u\n", vnn); + goto again; + } } diff --git a/ctdb/include/ctdb.h b/ctdb/include/ctdb.h index 9a143cb80f9..5b7c5e4f2c2 100644 --- a/ctdb/include/ctdb.h +++ b/ctdb/include/ctdb.h @@ -224,7 +224,8 @@ struct ctdb_node_map { uint32_t num; struct ctdb_node_and_flags nodes[1]; }; -int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, uint32_t destnode, +int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, + struct timeval timeout, uint32_t destnode, TALLOC_CTX *mem_ctx, struct ctdb_node_map **nodemap); struct ctdb_key_list { @@ -275,7 +276,9 @@ int ctdb_ctrl_getrecmode(struct ctdb_context *ctdb, uint32_t destnode, uint32_t */ int ctdb_ctrl_setrecmode(struct ctdb_context *ctdb, uint32_t destnode, uint32_t recmode); -uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, +uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, + struct timeval timeout, + TALLOC_CTX *mem_ctx, uint32_t *num_nodes); int ctdb_status_reset(struct ctdb_context *ctdb, uint32_t destnode); diff --git a/ctdb/tools/ctdb_control.c b/ctdb/tools/ctdb_control.c index 2def6eaef7e..8bdee098e7e 100644 --- a/ctdb/tools/ctdb_control.c +++ b/ctdb/tools/ctdb_control.c @@ -127,7 +127,7 @@ static int control_status_all(struct ctdb_context *ctdb) uint32_t *nodes; uint32_t num_nodes; - nodes = ctdb_get_connected_nodes(ctdb, ctdb, &num_nodes); + nodes = ctdb_get_connected_nodes(ctdb, timeval_current_ofs(1, 0), ctdb, &num_nodes); CTDB_NO_MEMORY(ctdb, nodes); ZERO_STRUCT(status); @@ -197,7 +197,7 @@ static int control_status_reset_all(struct ctdb_context *ctdb) uint32_t *nodes; uint32_t num_nodes; - nodes = ctdb_get_connected_nodes(ctdb, ctdb, &num_nodes); + nodes = ctdb_get_connected_nodes(ctdb, timeval_current_ofs(1, 0), ctdb, &num_nodes); CTDB_NO_MEMORY(ctdb, nodes); for (i=0;i