Rev 287: make sure we ignore requeued ctdb_call packets of older generations except for packets from the client in http://samba.org/~tridge/ctdb

tridge at samba.org tridge at samba.org
Sat May 12 08:08:51 GMT 2007


------------------------------------------------------------
revno: 287
revision-id: tridge at samba.org-20070512080850-g6h43oqsh8ngm5np
parent: tridge at samba.org-20070512060456-ooug9gdg7obqndrj
committer: Andrew Tridgell <tridge at samba.org>
branch nick: tridge
timestamp: Sat 2007-05-12 18:08:50 +1000
message:
  make sure we ignore requeued ctdb_call packets of older generations except for packets from the client
modified:
  common/ctdb_call.c             ctdb_call.c-20061128065342-to93h6eejj5kon81-1
  common/ctdb_daemon.c           ctdb_daemon.c-20070409200331-3el1kqgdb9m4ib0g-1
  common/ctdb_ltdb.c             ctdb_ltdb.c-20061128065342-to93h6eejj5kon81-2
  common/ctdb_recover.c          ctdb_recover.c-20070503002147-admmfgt1oj6gexfo-1
  include/ctdb_private.h         ctdb_private.h-20061117234101-o3qt14umlg9en8z0-13
=== modified file 'common/ctdb_call.c'
--- a/common/ctdb_call.c	2007-05-11 00:33:43 +0000
+++ b/common/ctdb_call.c	2007-05-12 08:08:50 +0000
@@ -363,7 +363,7 @@
 	
 	/* fetch the current record */
 	ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, key, &header, hdr, &data2,
-					   ctdb_recv_raw_pkt, ctdb);
+					   ctdb_recv_raw_pkt, ctdb, False);
 	if (ret == -1) {
 		ctdb_fatal(ctdb, "ctdb_req_dmaster failed to fetch record");
 		return;
@@ -433,7 +433,7 @@
 	   if the call will be answered locally */
 
 	ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, call.key, &header, hdr, &data,
-					   ctdb_recv_raw_pkt, ctdb);
+					   ctdb_recv_raw_pkt, ctdb, False);
 	if (ret == -1) {
 		ctdb_send_error(ctdb, hdr, ret, "ltdb fetch failed in ctdb_request_call");
 		return;
@@ -556,7 +556,7 @@
 	data.dsize = c->datalen;
 
 	ret = ctdb_ltdb_lock_requeue(ctdb_db, key, hdr,
-				     ctdb_recv_raw_pkt, ctdb);
+				     ctdb_recv_raw_pkt, ctdb, False);
 	if (ret == -2) {
 		return;
 	}

=== modified file 'common/ctdb_daemon.c'
--- a/common/ctdb_daemon.c	2007-05-12 04:34:21 +0000
+++ b/common/ctdb_daemon.c	2007-05-12 08:08:50 +0000
@@ -413,7 +413,7 @@
 
 	ret = ctdb_ltdb_lock_fetch_requeue(ctdb_db, key, &header, 
 					   (struct ctdb_req_header *)c, &data,
-					   daemon_incoming_packet, client);
+					   daemon_incoming_packet, client, True);
 	if (ret == -2) {
 		/* will retry later */
 		ctdb->status.pending_calls--;

=== modified file 'common/ctdb_ltdb.c'
--- a/common/ctdb_ltdb.c	2007-05-11 00:33:43 +0000
+++ b/common/ctdb_ltdb.c	2007-05-12 08:08:50 +0000
@@ -195,6 +195,8 @@
 	void (*recv_pkt)(void *, uint8_t *, uint32_t);
 	void *recv_context;
 	struct ctdb_req_header *hdr;
+	uint32_t generation;
+	bool ignore_generation;
 };
 
 /*
@@ -203,6 +205,12 @@
 static void lock_fetch_callback(void *p)
 {
 	struct lock_fetch_state *state = talloc_get_type(p, struct lock_fetch_state);
+	if (!state->ignore_generation &&
+	    state->generation != state->ctdb->vnn_map->generation) {
+		DEBUG(0,("Discarding previous generation lockwait packet\n"));
+		talloc_free(state->hdr);
+		return;
+	}
 	state->recv_pkt(state->recv_context, (uint8_t *)state->hdr, state->hdr->length);
 	DEBUG(2,(__location__ " PACKET REQUEUED\n"));
 }
@@ -235,7 +243,7 @@
 int ctdb_ltdb_lock_requeue(struct ctdb_db_context *ctdb_db, 
 			   TDB_DATA key, struct ctdb_req_header *hdr,
 			   void (*recv_pkt)(void *, uint8_t *, uint32_t ),
-			   void *recv_context)
+			   void *recv_context, bool ignore_generation)
 {
 	int ret;
 	struct tdb_context *tdb = ctdb_db->ltdb->tdb;
@@ -267,6 +275,8 @@
 	state->hdr = hdr;
 	state->recv_pkt = recv_pkt;
 	state->recv_context = recv_context;
+	state->generation = ctdb_db->ctdb->vnn_map->generation;
+	state->ignore_generation = ignore_generation;
 
 	/* now the contended path */
 	h = ctdb_lockwait(ctdb_db, key, lock_fetch_callback, state);
@@ -291,11 +301,12 @@
 				 TDB_DATA key, struct ctdb_ltdb_header *header, 
 				 struct ctdb_req_header *hdr, TDB_DATA *data,
 				 void (*recv_pkt)(void *, uint8_t *, uint32_t ),
-				 void *recv_context)
+				 void *recv_context, bool ignore_generation)
 {
 	int ret;
 
-	ret = ctdb_ltdb_lock_requeue(ctdb_db, key, hdr, recv_pkt, recv_context);
+	ret = ctdb_ltdb_lock_requeue(ctdb_db, key, hdr, recv_pkt, 
+				     recv_context, ignore_generation);
 	if (ret == 0) {
 		ret = ctdb_ltdb_fetch(ctdb_db, key, header, hdr, data);
 		if (ret != 0) {

=== modified file 'common/ctdb_recover.c'
--- a/common/ctdb_recover.c	2007-05-12 05:29:06 +0000
+++ b/common/ctdb_recover.c	2007-05-12 08:08:50 +0000
@@ -318,7 +318,9 @@
 			DEBUG(0, (__location__ " Unable to fetch record\n"));
 			goto failed;
 		}
-		if (header.rsn < hdr->rsn) {
+		/* the <= is to cope with just-created records, which
+		   have a rsn of zero */
+		if (header.rsn <= hdr->rsn) {
 			ret = ctdb_ltdb_store(ctdb_db, key, hdr, data);
 			if (ret != 0) {
 				DEBUG(0, (__location__ " Unable to store record\n"));

=== modified file 'include/ctdb_private.h'
--- a/include/ctdb_private.h	2007-05-12 05:51:08 +0000
+++ b/include/ctdb_private.h	2007-05-12 08:08:50 +0000
@@ -556,12 +556,12 @@
 int ctdb_ltdb_lock_requeue(struct ctdb_db_context *ctdb_db, 
 			   TDB_DATA key, struct ctdb_req_header *hdr,
 			   void (*recv_pkt)(void *, uint8_t *, uint32_t ),
-			   void *recv_context);
+			   void *recv_context, bool ignore_generation);
 int ctdb_ltdb_lock_fetch_requeue(struct ctdb_db_context *ctdb_db, 
 				 TDB_DATA key, struct ctdb_ltdb_header *header, 
 				 struct ctdb_req_header *hdr, TDB_DATA *data,
 				 void (*recv_pkt)(void *, uint8_t *, uint32_t ),
-				 void *recv_context);
+				 void *recv_context, bool ignore_generation);
 void ctdb_recv_pkt(struct ctdb_context *ctdb, uint8_t *data, uint32_t length);
 
 struct ctdb_call_state *ctdb_call_local_send(struct ctdb_db_context *ctdb_db, 



More information about the samba-cvs mailing list