------------------------------------------------------------ revno: 266 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> branch nick: tridge timestamp: Thu 2007-05-10 07:43:18 +1000 message: merged ronnies code to delay client requests when in recovery mode modified: common/ctdb_daemon.c ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1 ------------------------------------------------------------ revno: 197.1.90 merged: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Ronnie Sahlberg <[EMAIL PROTECTED]> branch nick: ctdb timestamp: Wed 2007-05-09 14:08:11 +1000 message: hang the event from the retry structure instead of the hdr structure ------------------------------------------------------------ revno: 197.1.89 merged: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Ronnie Sahlberg <[EMAIL PROTECTED]> branch nick: ctdb timestamp: Wed 2007-05-09 14:06:47 +1000 message: when we are in recovery mode and we get a REQ_CALL from a client, defer it for one second and try again === modified file 'common/ctdb_daemon.c' --- a/common/ctdb_daemon.c 2007-05-08 23:59:23 +0000 +++ b/common/ctdb_daemon.c 2007-05-09 21:43:18 +0000 @@ -334,6 +334,30 @@ } +struct ctdb_client_retry { + struct ctdb_client *client; + struct ctdb_req_call *call; +}; + +static void daemon_request_call_from_client(struct ctdb_client *client, + struct ctdb_req_call *c); + +/* + triggered after a one second delay, retrying a client packet + that was deferred because of the daemon being in recovery mode + */ +static void retry_client_packet(struct event_context *ev, struct timed_event *te, + struct timeval t, void *private_data) +{ + struct ctdb_client_retry *retry = talloc_get_type(private_data, struct ctdb_client_retry); + + daemon_request_call_from_client(retry->client, retry->call); + + talloc_free(retry); +} + + + /* this is called when the ctdb daemon received a ctdb request call from a local client over the unix domain socket @@ -350,6 +374,29 @@ int ret; struct ctdb_context *ctdb = client->ctdb; + if (ctdb->recovery_mode != CTDB_RECOVERY_NORMAL) { + struct ctdb_client_retry *retry; + + DEBUG(0,(__location__ " ctdb call %u from client" + " while we are in recovery mode. Deferring it\n", + c->hdr.reqid)); + + /* hang the event and the structure off client */ + retry = talloc(client, struct ctdb_client_retry); + CTDB_NO_MEMORY_VOID(ctdb, retry); + retry->client = client; + retry->call = c; + + /* this ensures that after the retry happens we + eventually free this request */ + talloc_steal(retry, c); + + event_add_timed(ctdb->ev, retry, timeval_current_ofs(1,0), retry_client_packet, retry); + return; + } + + + ctdb->status.total_calls++; ctdb->status.pending_calls++;