------------------------------------------------------------
revno: 635
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Andrew Tridgell <[EMAIL PROTECTED]>
branch nick: tridge
timestamp: Fri 2007-09-21 15:32:11 +1000
message:
merge bugfix from ronnie
modified:
server/ctdb_persistent.c
ctdb_persistent.c-20070920053845-u2ggm5relkdor3xg-1
------------------------------------------------------------
revno: 432.1.294
revision-id: [EMAIL PROTECTED]
parent: [EMAIL PROTECTED]
committer: Ronnie Sahlberg <[EMAIL PROTECTED]>
branch nick: ctdb
timestamp: Fri 2007-09-21 15:19:33 +1000
message:
in ctdb_control_persistent_store() we must talloc_steal() the pointer to
c to prevent it from being immediately freed (and our persistent store
state with it) if we need to wait asynchronously for other nodes before
we can reply back to the client
modified:
server/ctdb_persistent.c
ctdb_persistent.c-20070920053845-u2ggm5relkdor3xg-1
=== modified file 'server/ctdb_persistent.c'
--- a/server/ctdb_persistent.c 2007-09-21 02:24:02 +0000
+++ b/server/ctdb_persistent.c 2007-09-21 05:19:33 +0000
@@ -44,6 +44,7 @@
{
struct ctdb_persistent_state *state = talloc_get_type(private_data,
struct
ctdb_persistent_state);
+
if (status != 0) {
DEBUG(0,("ctdb_persistent_callback failed with status %d
(%s)\n",
status, errormsg));
@@ -57,6 +58,18 @@
}
}
+/*
+ called if persistent store times out
+ */
+static void ctdb_persistent_store_timeout(struct event_context *ev, struct
timed_event *te,
+ struct timeval t, void *private_data)
+{
+ struct ctdb_persistent_state *state = talloc_get_type(private_data,
struct ctdb_persistent_state);
+
+ ctdb_request_control_reply(state->ctdb, state->c, NULL, -1, "timeout in
ctdb_persistent_state");
+
+ talloc_free(state);
+}
/*
store a persistent record - called from a ctdb client when it has updated
@@ -75,7 +88,7 @@
CTDB_NO_MEMORY(ctdb, state);
state->ctdb = ctdb;
- state->c = c;
+ state->c = talloc_steal(state, c);
for (i=0;i<ctdb->num_nodes;i++) {
struct ctdb_node *node = ctdb->nodes[i];
@@ -110,6 +123,12 @@
/* we need to wait for the replies */
*async_reply = true;
+
+ /* but we wont wait forever */
+ event_add_timed(ctdb->ev, state,
+ timeval_current_ofs(ctdb->tunable.control_timeout, 0),
+ ctdb_persistent_store_timeout, state);
+
return 0;
}