------------------------------------------------------------ revno: 287 revision-id: [EMAIL PROTECTED] parent: [EMAIL PROTECTED] committer: Andrew Tridgell <[EMAIL PROTECTED]> 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,