From: Andrew Tridgell Date: Wed, 9 May 2007 21:43:18 +0000 (+1000) Subject: merged ronnies code to delay client requests when in recovery mode X-Git-Tag: tevent-0.9.20~348^2~2765 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ba47b43c6b577f92e1729552c3aac0441dc3796b;p=thirdparty%2Fsamba.git merged ronnies code to delay client requests when in recovery mode (This used to be ctdb commit dfca37076d642f3407c63dfe3b685287d27c8f8d) --- ba47b43c6b577f92e1729552c3aac0441dc3796b diff --cc ctdb/common/ctdb_daemon.c index ce5cc73eaa6,c7a07f354d2..704ad8f1d89 --- a/ctdb/common/ctdb_daemon.c +++ b/ctdb/common/ctdb_daemon.c @@@ -334,6 -334,6 +334,30 @@@ static void daemon_call_from_client_cal } ++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 -350,6 +374,29 @@@ static void daemon_request_call_from_cl 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++;