[SCM] CTDB repository - branch libctdb updated - ctdb-1.0.114-93-g7e9d5cf
Ronnie Sahlberg
sahlberg at samba.org
Tue May 11 22:50:23 MDT 2010
The branch, libctdb has been updated
via 7e9d5cf24672d50d95094cd5c52a901d38c65527 (commit)
via 709615ac804b7d93082cdca5b43f292fc7caea17 (commit)
from 0ecfea29e46dbb2c3892ddafddb82039c6416fe1 (commit)
http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=libctdb
- Log -----------------------------------------------------------------
commit 7e9d5cf24672d50d95094cd5c52a901d38c65527
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed May 12 14:34:17 2010 +1000
remove the timeout parameter to ctdb_control_send() and
have all callers set this explicitely when they need a timeout
for the control
commit 709615ac804b7d93082cdca5b43f292fc7caea17
Author: Ronnie Sahlberg <ronniesahlberg at gmail.com>
Date: Wed May 12 14:16:17 2010 +1000
move some timed event calls out from libctdb and put it back in client/ctdb_client.c
-----------------------------------------------------------------------
Summary of changes:
client/ctdb_client.c | 99 +++++++++++++++++++++++++++++++++++++++++-------
include/ctdb_private.h | 7 +++-
libctdb/ctdb_client.c | 30 +-------------
libctdb/libctdb.c | 6 +-
server/ctdb_takeover.c | 26 ++++++++----
5 files changed, 113 insertions(+), 55 deletions(-)
Changeset truncated at 500 lines:
diff --git a/client/ctdb_client.c b/client/ctdb_client.c
index a0d5997..7b49931 100644
--- a/client/ctdb_client.c
+++ b/client/ctdb_client.c
@@ -254,7 +254,11 @@ int ctdb_control(struct ctdb_context *ctdb, uint32_t destnode, uint64_t srvid,
state = ctdb_control_send(ctdb, destnode, srvid, opcode,
flags, data, mem_ctx,
- timeout, errormsg);
+ errormsg);
+ if (state != NULL && timeout && !timeval_is_zero(timeout)) {
+ event_add_timed(ctdb->ev, state, *timeout, ctdb_control_timeout_func, state);
+ }
+
return ctdb_control_recv(ctdb, state, mem_ctx, outdata, status,
errormsg);
}
@@ -323,11 +327,14 @@ int ctdb_ctrl_shutdown(struct ctdb_context *ctdb, struct timeval timeout, uint32
state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_SHUTDOWN, 0, tdb_null,
- NULL, &timeout, NULL);
+ NULL, NULL);
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " ctdb_control for shutdown failed\n"));
return -1;
}
+ if (!timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
return 0;
}
@@ -377,9 +384,17 @@ int ctdb_ctrl_getvnnmap(struct ctdb_context *ctdb, struct timeval timeout, uint3
struct ctdb_client_control_state *
ctdb_ctrl_getrecmode_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
{
- return ctdb_control_send(ctdb, destnode, 0,
+ struct ctdb_client_control_state *state;
+
+ state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_GET_RECMODE, 0, tdb_null,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
+ return state;
}
int ctdb_ctrl_getrecmode_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *recmode)
@@ -443,9 +458,16 @@ struct ctdb_client_control_state *
ctdb_ctrl_getrecmaster_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx,
struct timeval timeout, uint32_t destnode)
{
- return ctdb_control_send(ctdb, destnode, 0,
+ struct ctdb_client_control_state *state;
+
+ state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_GET_RECMASTER, 0, tdb_null,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
+ return state;
}
int ctdb_ctrl_getrecmaster_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *recmaster)
@@ -672,7 +694,11 @@ struct ctdb_client_control_state *ctdb_ctrl_pulldb_send(
state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_PULL_DB, 0, indata,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
talloc_free(pull);
return state;
@@ -1278,9 +1304,16 @@ int ctdb_ctrl_getpid(struct ctdb_context *ctdb, struct timeval timeout, uint32_t
struct ctdb_client_control_state *
ctdb_ctrl_freeze_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode, uint32_t priority)
{
- return ctdb_control_send(ctdb, destnode, priority,
+ struct ctdb_client_control_state *state;
+
+ state = ctdb_control_send(ctdb, destnode, priority,
CTDB_CONTROL_FREEZE, 0, tdb_null,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
+ return state;
}
/*
@@ -2243,9 +2276,16 @@ uint32_t ctdb_get_pnn(struct ctdb_context *ctdb)
struct ctdb_client_control_state *
ctdb_ctrl_uptime_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
{
- return ctdb_control_send(ctdb, destnode, 0,
+ struct ctdb_client_control_state *state;
+
+ state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_UPTIME, 0, tdb_null,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
+ return state;
}
int ctdb_ctrl_uptime_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, struct ctdb_uptime **uptime)
@@ -2407,12 +2447,15 @@ int ctdb_client_async_control(struct ctdb_context *ctdb,
uint32_t pnn = nodes[j];
state = ctdb_control_send(ctdb, pnn, srvid, opcode,
- 0, data, async_data, &timeout, NULL);
+ 0, data, async_data, NULL);
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Failed to call async control %u\n", (unsigned)opcode));
talloc_free(async_data);
return -1;
}
+ if (!timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
ctdb_client_async_add(async_data, state);
}
@@ -2596,9 +2639,16 @@ ctdb_read_pnn_lock(int fd, int32_t pnn)
struct ctdb_client_control_state *
ctdb_ctrl_getcapabilities_send(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct timeval timeout, uint32_t destnode)
{
- return ctdb_control_send(ctdb, destnode, 0,
+ struct ctdb_client_control_state *state;
+
+ state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_GET_CAPABILITIES, 0, tdb_null,
- mem_ctx, &timeout, NULL);
+ mem_ctx, NULL);
+ if (state != NULL && !timeval_is_zero(&timeout)) {
+ event_add_timed(ctdb->ev, state, timeout, ctdb_control_timeout_func, state);
+ }
+
+ return state;
}
int ctdb_ctrl_getcapabilities_recv(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, struct ctdb_client_control_state *state, uint32_t *capabilities)
@@ -3480,3 +3530,24 @@ int ctdb_ctrl_get_db_priority(struct ctdb_context *ctdb, struct timeval timeout,
return 0;
}
+
+/* time out handler for ctdb_control */
+void ctdb_control_timeout_func(struct event_context *ev, struct timed_event *te,
+ struct timeval t, void *private_data)
+{
+ struct ctdb_client_control_state *state = talloc_get_type(private_data, struct ctdb_client_control_state);
+
+ DEBUG(DEBUG_ERR,(__location__ " control timed out. reqid:%u opcode:%u "
+ "dstnode:%u\n", state->reqid, state->c->opcode,
+ state->c->hdr.destnode));
+
+ state->state = CTDB_CONTROL_TIMEOUT;
+
+ /* if we had a callback registered for this control, pull the response
+ and call the callback.
+ */
+ if (state->async.fn) {
+ event_add_timed(state->ctdb->ev, state, timeval_zero(), ctdb_invoke_control_callback, state);
+ }
+}
+
diff --git a/include/ctdb_private.h b/include/ctdb_private.h
index 685048b..90d4c13 100644
--- a/include/ctdb_private.h
+++ b/include/ctdb_private.h
@@ -1075,7 +1075,6 @@ ctdb_control_send(struct ctdb_context *ctdb,
uint32_t destnode, uint64_t srvid,
uint32_t opcode, uint32_t flags, TDB_DATA data,
TALLOC_CTX *mem_ctx,
- struct timeval *timeout,
char **errormsg);
@@ -1647,4 +1646,10 @@ int verify_remote_ip_allocation(struct ctdb_context *ctdb,
int update_ip_assignment_tree(struct ctdb_context *ctdb,
struct ctdb_public_ip *ip);
+void ctdb_control_timeout_func(struct event_context *ev,
+ struct timed_event *te,
+ struct timeval t, void *private_data);
+
+void ctdb_invoke_control_callback(struct event_context *ev, struct timed_event *te, struct timeval t, void *private_data);
+
#endif
diff --git a/libctdb/ctdb_client.c b/libctdb/ctdb_client.c
index c7ce138..23faa4b 100644
--- a/libctdb/ctdb_client.c
+++ b/libctdb/ctdb_client.c
@@ -216,7 +216,7 @@ int ctdb_control_recv(struct ctdb_context *ctdb,
called when a control completes or timesout to invoke the callback
function the user provided
*/
-static void invoke_control_callback(struct event_context *ev, struct timed_event *te,
+void ctdb_invoke_control_callback(struct event_context *ev, struct timed_event *te,
struct timeval t, void *private_data)
{
struct ctdb_client_control_state *state;
@@ -278,7 +278,7 @@ static void ctdb_client_reply_control(struct ctdb_context *ctdb,
and call the callback.
*/
if (state->async.fn) {
- event_add_timed(ctdb->ev, state, timeval_zero(), invoke_control_callback, state);
+ event_add_timed(ctdb->ev, state, timeval_zero(), ctdb_invoke_control_callback, state);
}
}
@@ -436,32 +436,11 @@ static int ctdb_client_queue_pkt(struct ctdb_context *ctdb, struct ctdb_req_head
}
-/* time out handler for ctdb_control */
-static void control_timeout_func(struct event_context *ev, struct timed_event *te,
- struct timeval t, void *private_data)
-{
- struct ctdb_client_control_state *state = talloc_get_type(private_data, struct ctdb_client_control_state);
-
- DEBUG(DEBUG_ERR,(__location__ " control timed out. reqid:%u opcode:%u "
- "dstnode:%u\n", state->reqid, state->c->opcode,
- state->c->hdr.destnode));
-
- state->state = CTDB_CONTROL_TIMEOUT;
-
- /* if we had a callback registered for this control, pull the response
- and call the callback.
- */
- if (state->async.fn) {
- event_add_timed(state->ctdb->ev, state, timeval_zero(), invoke_control_callback, state);
- }
-}
-
/* async version of send control request */
struct ctdb_client_control_state *ctdb_control_send(struct ctdb_context *ctdb,
uint32_t destnode, uint64_t srvid,
uint32_t opcode, uint32_t flags, TDB_DATA data,
TALLOC_CTX *mem_ctx,
- struct timeval *timeout,
char **errormsg)
{
struct ctdb_client_control_state *state;
@@ -504,11 +483,6 @@ struct ctdb_client_control_state *ctdb_control_send(struct ctdb_context *ctdb,
memcpy(&c->data[0], data.dptr, data.dsize);
}
- /* timeout */
- if (timeout && !timeval_is_zero(timeout)) {
- event_add_timed(ctdb->ev, state, *timeout, control_timeout_func, state);
- }
-
ret = ctdb_client_queue_pkt(ctdb, &(c->hdr));
if (ret != 0) {
talloc_free(state);
diff --git a/libctdb/libctdb.c b/libctdb/libctdb.c
index 254be93..638874c 100644
--- a/libctdb/libctdb.c
+++ b/libctdb/libctdb.c
@@ -164,7 +164,7 @@ ctdb_getrecmaster_send(struct ctdb_context *ctdb,
state = ctdb_control_send(ctdb, destnode, 0,
CTDB_CONTROL_GET_RECMASTER, 0, tdb_null,
- ctdb, NULL, NULL);
+ ctdb, NULL);
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Failed to send GET_RECMASTER control\n"));
@@ -246,7 +246,7 @@ ctdb_set_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid,
state = ctdb_control_send(ctdb, CTDB_CURRENT_NODE, srvid,
CTDB_CONTROL_REGISTER_SRVID, 0, tdb_null,
- ctdb, NULL, NULL);
+ ctdb, NULL);
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Failed to send REGISTER_SRVID control\n"));
@@ -320,7 +320,7 @@ ctdb_remove_message_handler_send(struct ctdb_context *ctdb, uint64_t srvid,
state = ctdb_control_send(ctdb, CTDB_CURRENT_NODE, srvid,
CTDB_CONTROL_DEREGISTER_SRVID, 0, tdb_null,
- ctdb, NULL, NULL);
+ ctdb, NULL);
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Failed to send DEREGISTER_SRVID control\n"));
diff --git a/server/ctdb_takeover.c b/server/ctdb_takeover.c
index 6857f37..596a7ee 100644
--- a/server/ctdb_takeover.c
+++ b/server/ctdb_takeover.c
@@ -1218,7 +1218,6 @@ int ctdb_takeover_run(struct ctdb_context *ctdb, struct ctdb_node_map *nodemap)
struct ctdb_public_ip_list *all_ips, *tmp_ip;
int maxnode, maxnum=0, minnode, minnum=0, num;
TDB_DATA data;
- struct timeval timeout;
struct client_async_data *async_data;
struct ctdb_client_control_state *state;
TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
@@ -1442,24 +1441,29 @@ finished:
ipv4.pnn = tmp_ip->pnn;
ipv4.sin = tmp_ip->addr.ip;
- timeout = TAKEOVER_TIMEOUT();
+
data.dsize = sizeof(ipv4);
data.dptr = (uint8_t *)&ipv4;
state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
0, CTDB_CONTROL_RELEASE_IPv4, 0,
data, async_data,
- &timeout, NULL);
+ NULL);
+ if (state != NULL) {
+ event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+ }
} else {
ip.pnn = tmp_ip->pnn;
ip.addr = tmp_ip->addr;
- timeout = TAKEOVER_TIMEOUT();
data.dsize = sizeof(ip);
data.dptr = (uint8_t *)&ip;
state = ctdb_control_send(ctdb, nodemap->nodes[i].pnn,
0, CTDB_CONTROL_RELEASE_IP, 0,
data, async_data,
- &timeout, NULL);
+ NULL);
+ if (state != NULL) {
+ event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+ }
}
if (state == NULL) {
@@ -1492,24 +1496,28 @@ finished:
ipv4.pnn = tmp_ip->pnn;
ipv4.sin = tmp_ip->addr.ip;
- timeout = TAKEOVER_TIMEOUT();
data.dsize = sizeof(ipv4);
data.dptr = (uint8_t *)&ipv4;
state = ctdb_control_send(ctdb, tmp_ip->pnn,
0, CTDB_CONTROL_TAKEOVER_IPv4, 0,
data, async_data,
- &timeout, NULL);
+ NULL);
+ if (state != NULL) {
+ event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+ }
} else {
ip.pnn = tmp_ip->pnn;
ip.addr = tmp_ip->addr;
- timeout = TAKEOVER_TIMEOUT();
data.dsize = sizeof(ip);
data.dptr = (uint8_t *)&ip;
state = ctdb_control_send(ctdb, tmp_ip->pnn,
0, CTDB_CONTROL_TAKEOVER_IP, 0,
data, async_data,
- &timeout, NULL);
+ NULL);
+ if (state != NULL) {
+ event_add_timed(ctdb->ev, state, TAKEOVER_TIMEOUT(), ctdb_control_timeout_func, state);
+ }
}
if (state == NULL) {
DEBUG(DEBUG_ERR,(__location__ " Failed to call async control CTDB_CONTROL_TAKEOVER_IP to node %u\n", tmp_ip->pnn));
--
CTDB repository
More information about the samba-cvs
mailing list