ctdb-daemon: Use database generation in packet headers for database requests
authorAmitay Isaacs <amitay@gmail.com>
Tue, 15 Sep 2015 06:50:19 +0000 (16:50 +1000)
committerAmitay Isaacs <amitay@samba.org>
Wed, 7 Oct 2015 12:53:27 +0000 (14:53 +0200)
Signed-off-by: Amitay Isaacs <amitay@gmail.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
ctdb/server/ctdb_call.c
ctdb/server/ctdb_ltdb_server.c

index a158d26936034af15c37d070a80d01902f308666..9a43b9ae272f6c4b8c77979bb1bc83beca5d959c 100644 (file)
@@ -190,6 +190,7 @@ static void ctdb_send_dmaster_reply(struct ctdb_db_context *ctdb_db,
 
        r->hdr.destnode  = new_dmaster;
        r->hdr.reqid     = reqid;
+       r->hdr.generation = ctdb_db->generation;
        r->rsn           = header->rsn;
        r->keylen        = key.dsize;
        r->datalen       = data.dsize;
@@ -242,6 +243,7 @@ static void ctdb_call_send_dmaster(struct ctdb_db_context *ctdb_db,
        CTDB_NO_MEMORY_FATAL(ctdb, r);
        r->hdr.destnode  = lmaster;
        r->hdr.reqid     = c->hdr.reqid;
+       r->hdr.generation = ctdb_db->generation;
        r->db_id         = c->db_id;
        r->rsn           = header->rsn;
        r->dmaster       = c->hdr.srcnode;
@@ -416,7 +418,7 @@ struct dmaster_defer_call {
 };
 
 struct dmaster_defer_queue {
-       struct ctdb_context *ctdb;
+       struct ctdb_db_context *ctdb_db;
        uint32_t generation;
        struct dmaster_defer_call *deferred_calls;
 };
@@ -436,7 +438,7 @@ static void dmaster_defer_reprocess(struct tevent_context *ev,
 static int dmaster_defer_queue_destructor(struct dmaster_defer_queue *ddq)
 {
        /* Ignore requests, if database recovery happens in-between. */
-       if (ddq->generation != ddq->ctdb->vnn_map->generation) {
+       if (ddq->generation != ddq->ctdb_db->generation) {
                return 0;
        }
 
@@ -490,7 +492,7 @@ static int dmaster_defer_setup(struct ctdb_db_context *ctdb_db,
                talloc_free(k);
                return -1;
        }
-       ddq->ctdb = ctdb_db->ctdb;
+       ddq->ctdb_db = ctdb_db;
        ddq->generation = hdr->generation;
        ddq->deferred_calls = NULL;
 
@@ -1024,6 +1026,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
                CTDB_NO_MEMORY_FATAL(ctdb, r);
                r->hdr.destnode  = c->hdr.srcnode;
                r->hdr.reqid     = c->hdr.reqid;
+               r->hdr.generation = ctdb_db->generation;
                r->status        = 0;
                r->datalen       = data.dsize + sizeof(struct ctdb_ltdb_header);
                header.rsn      -= 2;
@@ -1108,6 +1111,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
        CTDB_NO_MEMORY_FATAL(ctdb, r);
        r->hdr.destnode  = hdr->srcnode;
        r->hdr.reqid     = hdr->reqid;
+       r->hdr.generation = ctdb_db->generation;
        r->status        = call->status;
        r->datalen       = call->reply_data.dsize;
        if (call->reply_data.dsize) {
@@ -1314,7 +1318,7 @@ static void ctdb_call_resend(struct ctdb_call_state *state)
 {
        struct ctdb_context *ctdb = state->ctdb_db->ctdb;
 
-       state->generation = ctdb->vnn_map->generation;
+       state->generation = state->ctdb_db->generation;
 
        /* use a new reqid, in case the old reply does eventually come in */
        ctdb_reqid_remove(ctdb, state->reqid);
@@ -1439,6 +1443,7 @@ struct ctdb_call_state *ctdb_daemon_call_send_remote(struct ctdb_db_context *ctd
 
        /* this limits us to 16k outstanding messages - not unreasonable */
        state->c->hdr.reqid     = state->reqid;
+       state->c->hdr.generation = ctdb_db->generation;
        state->c->flags         = call->flags;
        state->c->db_id         = ctdb_db->db_id;
        state->c->callid        = call->call_id;
@@ -1453,7 +1458,7 @@ struct ctdb_call_state *ctdb_daemon_call_send_remote(struct ctdb_db_context *ctd
        state->call->key.dptr       = &state->c->data[0];
 
        state->state  = CTDB_CALL_WAIT;
-       state->generation = ctdb->vnn_map->generation;
+       state->generation = ctdb_db->generation;
 
        DLIST_ADD(ctdb_db->pending_calls, state);
 
index 440ca7bccc4224ce2a5c4ef303b4d5813cd336be..b387adb970069a81acb12183680a7c3011836411 100644 (file)
@@ -241,6 +241,7 @@ store:
 
 struct lock_fetch_state {
        struct ctdb_context *ctdb;
+       struct ctdb_db_context *ctdb_db;
        void (*recv_pkt)(void *, struct ctdb_req_header *);
        void *recv_context;
        struct ctdb_req_header *hdr;
@@ -255,7 +256,7 @@ static void lock_fetch_callback(void *p, bool locked)
 {
        struct lock_fetch_state *state = talloc_get_type(p, struct lock_fetch_state);
        if (!state->ignore_generation &&
-           state->generation != state->ctdb->vnn_map->generation) {
+           state->generation != state->ctdb_db->generation) {
                DEBUG(DEBUG_NOTICE,("Discarding previous generation lockwait packet\n"));
                talloc_free(state->hdr);
                return;
@@ -321,10 +322,11 @@ int ctdb_ltdb_lock_requeue(struct ctdb_db_context *ctdb_db,
 
        state = talloc(hdr, struct lock_fetch_state);
        state->ctdb = ctdb_db->ctdb;
+       state->ctdb_db = ctdb_db;
        state->hdr = hdr;
        state->recv_pkt = recv_pkt;
        state->recv_context = recv_context;
-       state->generation = ctdb_db->ctdb->vnn_map->generation;
+       state->generation = ctdb_db->generation;
        state->ignore_generation = ignore_generation;
 
        /* now the contended path */