------------------------------------------------------------
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++;
 

Reply via email to