]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
merged ronnies code to delay client requests when in recovery mode
authorAndrew Tridgell <tridge@samba.org>
Wed, 9 May 2007 21:43:18 +0000 (07:43 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 9 May 2007 21:43:18 +0000 (07:43 +1000)
(This used to be ctdb commit dfca37076d642f3407c63dfe3b685287d27c8f8d)

1  2 
ctdb/common/ctdb_daemon.c

index ce5cc73eaa68f38680cd53938272a8ed29bcd5cb,c7a07f354d26758488ebc75b5ccb1304c0f79831..704ad8f1d8960a73889440a9b475d30b75e4ae6f
@@@ -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++;