add a generation field to the pdu header.
authorRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 15:06:26 +0000 (01:06 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 15:06:26 +0000 (01:06 +1000)
this will allow a node to verify that a received pdu is sent from a node
in the same generation instance of a cluster.

common/ctdb_call.c
common/ctdb_client.c
common/ctdb_control.c
common/ctdb_daemon.c
common/ctdb_message.c
direct/ctdbd_test.c
include/ctdb_private.h

index 86da20ea2e83e3f2a51daf00b0f45991f2720a3c..3b2602c4d9e30a4f97f28612eb2af487b553f7f5 100644 (file)
@@ -149,6 +149,7 @@ static void ctdb_send_error(struct ctdb_context *ctdb,
        r->hdr.length    = len + msglen;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REPLY_ERROR;
        r->hdr.destnode  = hdr->srcnode;
        r->hdr.srcnode   = ctdb->vnn;
@@ -178,6 +179,7 @@ static void ctdb_call_send_redirect(struct ctdb_context *ctdb,
        r->hdr.length = sizeof(*r);
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REPLY_REDIRECT;
        r->hdr.destnode  = c->hdr.srcnode;
        r->hdr.srcnode   = ctdb->vnn;
@@ -232,6 +234,7 @@ static void ctdb_send_dmaster_reply(struct ctdb_db_context *ctdb_db,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REPLY_DMASTER;
        r->hdr.destnode  = new_dmaster;
        r->hdr.srcnode   = ctdb->vnn;
@@ -274,6 +277,7 @@ static void ctdb_call_send_dmaster(struct ctdb_db_context *ctdb_db,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REQ_DMASTER;
        r->hdr.destnode  = lmaster;
        r->hdr.srcnode   = ctdb->vnn;
@@ -490,6 +494,7 @@ void ctdb_request_call(struct ctdb_context *ctdb, struct ctdb_req_header *hdr)
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REPLY_CALL;
        r->hdr.destnode  = hdr->srcnode;
        r->hdr.srcnode   = hdr->destnode;
@@ -755,6 +760,7 @@ struct ctdb_call_state *ctdb_daemon_call_send_remote(struct ctdb_db_context *ctd
        state->c->hdr.length    = len;
        state->c->hdr.ctdb_magic = CTDB_MAGIC;
        state->c->hdr.ctdb_version = CTDB_VERSION;
+       state->c->hdr.generation= ctdb_db->ctdb->vnn_map->generation;
        state->c->hdr.operation = CTDB_REQ_CALL;
        state->c->hdr.destnode  = header->dmaster;
        /*
index e9f1e8eb79f96b0363fe455a8792f3808412f830..b0fcfd28a6c10546388ce24b665fa02eb5ec6ce5 100644 (file)
@@ -334,6 +334,7 @@ struct ctdb_client_call_state *ctdb_call_send(struct ctdb_db_context *ctdb_db,
        c->hdr.ctdb_magic = CTDB_MAGIC;
        c->hdr.ctdb_version = CTDB_VERSION;
        c->hdr.operation = CTDB_REQ_CALL;
+       c->hdr.generation= ctdb->vnn_map->generation;
        /* this limits us to 16k outstanding messages - not unreasonable */
        c->hdr.reqid     = ctdb_reqid_new(ctdb, state);
        c->flags         = call->flags;
@@ -394,6 +395,7 @@ int ctdb_set_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
        c.hdr.length       = sizeof(c);
        c.hdr.ctdb_magic   = CTDB_MAGIC;
        c.hdr.ctdb_version = CTDB_VERSION;
+       c.hdr.generation   = ctdb->vnn_map->generation;
        c.hdr.operation    = CTDB_REQ_REGISTER;
        c.srvid            = srvid;
 
@@ -424,6 +426,7 @@ int ctdb_send_message(struct ctdb_context *ctdb, uint32_t vnn,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REQ_MESSAGE;
        r->hdr.destnode  = vnn;
        r->hdr.srcnode   = ctdb->vnn;
@@ -454,6 +457,7 @@ void ctdb_connect_wait(struct ctdb_context *ctdb)
        r.hdr.length     = sizeof(r);
        r.hdr.ctdb_magic = CTDB_MAGIC;
        r.hdr.ctdb_version = CTDB_VERSION;
+       r.hdr.generation= ctdb->vnn_map->generation;
        r.hdr.operation = CTDB_REQ_CONNECT_WAIT;
 
        DEBUG(3,("ctdb_connect_wait: sending to ctdbd\n"));
@@ -609,6 +613,7 @@ void ctdb_shutdown(struct ctdb_context *ctdb)
        r.hdr.length       = len;
        r.hdr.ctdb_magic   = CTDB_MAGIC;
        r.hdr.ctdb_version = CTDB_VERSION;
+       r.hdr.generation   = ctdb->vnn_map->generation;
        r.hdr.operation    = CTDB_REQ_SHUTDOWN;
        r.hdr.reqid        = 0;
 
@@ -692,6 +697,7 @@ int ctdb_control(struct ctdb_context *ctdb, uint32_t destnode, uint64_t srvid,
        c->hdr.length       = len;
        c->hdr.ctdb_magic   = CTDB_MAGIC;
        c->hdr.ctdb_version = CTDB_VERSION;
+       c->hdr.generation   = ctdb->vnn_map->generation;
        c->hdr.operation    = CTDB_REQ_CONTROL;
        c->hdr.reqid        = state->reqid;
        c->hdr.destnode     = destnode;
index 423e4eedfc75f6135c31c94bc3e716132bdf64e3..4728c852c71c94f8c4531b8f5cbb53e95cd45e9c 100644 (file)
@@ -168,6 +168,7 @@ void ctdb_request_control(struct ctdb_context *ctdb, struct ctdb_req_header *hdr
        r->hdr.length       = len;
        r->hdr.ctdb_magic   = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation   = ctdb->vnn_map->generation;
        r->hdr.operation    = CTDB_REPLY_CONTROL;
        r->hdr.destnode     = hdr->srcnode;
        r->hdr.srcnode      = ctdb->vnn;
@@ -246,6 +247,7 @@ int ctdb_daemon_send_control(struct ctdb_context *ctdb, uint32_t destnode,
        c->hdr.length       = len;
        c->hdr.ctdb_magic   = CTDB_MAGIC;
        c->hdr.ctdb_version = CTDB_VERSION;
+       c->hdr.generation= ctdb->vnn_map->generation;
        c->hdr.operation    = CTDB_REQ_CONTROL;
        c->hdr.destnode     = destnode;
        c->hdr.srcnode      = ctdb->vnn;
index 49f3e24a1a0c71029b8909ac44b02cec48ed64a7..db1447c53b5e61d900b42fcc0fb381ec58f0a9d3 100644 (file)
@@ -123,6 +123,7 @@ static void daemon_message_handler(struct ctdb_context *ctdb, uint64_t srvid,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REQ_MESSAGE;
        r->srvid         = srvid;
        r->datalen       = data.dsize;
@@ -188,6 +189,7 @@ static void daemon_request_shutdown(struct ctdb_client *client,
                rf->hdr.length    = len;
                rf->hdr.ctdb_magic = CTDB_MAGIC;
                rf->hdr.ctdb_version = CTDB_VERSION;
+               rf->hdr.generation= ctdb->vnn_map->generation;
                rf->hdr.operation = CTDB_REQ_FINISHED;
                rf->hdr.destnode  = node;
                rf->hdr.srcnode   = ctdb->vnn;
@@ -228,6 +230,7 @@ static void daemon_request_connect_wait(struct ctdb_client *client,
        r.hdr.length     = sizeof(r);
        r.hdr.ctdb_magic = CTDB_MAGIC;
        r.hdr.ctdb_version = CTDB_VERSION;
+       r.hdr.generation= client->ctdb->vnn_map->generation;
        r.hdr.operation = CTDB_REPLY_CONNECT_WAIT;
        r.vnn           = ctdb_get_vnn(client->ctdb);
        r.num_connected = client->ctdb->num_connected;
@@ -321,6 +324,7 @@ static void daemon_call_from_client_callback(struct ctdb_call_state *state)
        r->hdr.length       = length;
        r->hdr.ctdb_magic   = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation   = client->ctdb->vnn_map->generation;
        r->hdr.operation    = CTDB_REPLY_CALL;
        r->hdr.reqid        = dstate->reqid;
        r->datalen          = dstate->call->reply_data.dsize;
@@ -736,6 +740,7 @@ static void daemon_control_callback(struct ctdb_context *ctdb,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REPLY_CONTROL;
        r->hdr.reqid     = state->reqid;
        r->status        = status;
index 379af26e03e8e76f62e430115d92ca7344057edc..4f58259890669bb021e9b9d5f7a0b05df5451a1c 100644 (file)
@@ -127,6 +127,7 @@ int ctdb_daemon_send_message(struct ctdb_context *ctdb, uint32_t vnn,
        r->hdr.length    = len;
        r->hdr.ctdb_magic = CTDB_MAGIC;
        r->hdr.ctdb_version = CTDB_VERSION;
+       r->hdr.generation= ctdb->vnn_map->generation;
        r->hdr.operation = CTDB_REQ_MESSAGE;
        r->hdr.destnode  = vnn;
        r->hdr.srcnode   = ctdb->vnn;
index 00b9f967dfef983783054f6051e0cdd198936ea4..1a3c2054b9d8719d77e4f714ea2a2a96c1cb0f34 100644 (file)
@@ -59,6 +59,7 @@ void register_pid_with_daemon(int fd, int pid)
        r.hdr.length       = sizeof(r);
        r.hdr.ctdb_magic   = CTDB_MAGIC;
        r.hdr.ctdb_version = CTDB_VERSION;
+       r.hdr.generation   = 1;
        r.hdr.operation    = CTDB_REQ_REGISTER;
        r.srvid            = pid;
 
@@ -80,6 +81,7 @@ int wait_for_cluster(int fd)
        req.hdr.length       = sizeof(req);
        req.hdr.ctdb_magic   = CTDB_MAGIC;
        req.hdr.ctdb_version = CTDB_VERSION;
+       req.hdr.generation   = 1;
        req.hdr.operation    = CTDB_REQ_CONNECT_WAIT;
 
        /* XXX must deal with partial writes here */
@@ -119,6 +121,7 @@ int send_a_message(int fd, int ourvnn, int vnn, int pid, TDB_DATA data)
        r.hdr.length     = len;
        r.hdr.ctdb_magic = CTDB_MAGIC;
        r.hdr.ctdb_version = CTDB_VERSION;
+       r.hdr.generation = 1;
        r.hdr.operation  = CTDB_REQ_MESSAGE;
        r.hdr.destnode   = vnn;
        r.hdr.srcnode    = ourvnn;
@@ -201,6 +204,7 @@ void fetch_record(int fd, uint32_t db_id, TDB_DATA key)
        req->hdr.length      = len;
        req->hdr.ctdb_magic  = CTDB_MAGIC;
        req->hdr.ctdb_version = CTDB_VERSION;
+       req->hdr.generation  = 1;
        req->hdr.operation   = CTDB_REQ_CALL;
        req->hdr.reqid       = 1;
 
index f3d0f72e128d7387cba8a3f04301e21ed5494b1d..3c249c25f5ab9b312269d786c4e7f6609ce49fd2 100644 (file)
@@ -312,6 +312,7 @@ struct ctdb_req_header {
        uint32_t length;
        uint32_t ctdb_magic;
        uint32_t ctdb_version;
+       uint32_t generation;
        uint32_t operation;
        uint32_t destnode;
        uint32_t srcnode;