The branch, master has been updated via 0592ba2a4fbd1b3b7a6bd0780eadbd6d449baaad (commit) from c76c214be401cb116265ed17ffe6c77c979ded82 (commit)
http://gitweb.samba.org/?p=tridge/ctdb.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0592ba2a4fbd1b3b7a6bd0780eadbd6d449baaad Author: Andrew Tridgell <[EMAIL PROTECTED]> Date: Fri Aug 8 00:44:33 2008 +1000 fixed a looping error bug with the new transactions code ----------------------------------------------------------------------- Summary of changes: client/ctdb_client.c | 7 +++---- server/ctdb_persistent.c | 14 +++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) Changeset truncated at 500 lines: diff --git a/client/ctdb_client.c b/client/ctdb_client.c index cec16d1..3717096 100644 --- a/client/ctdb_client.c +++ b/client/ctdb_client.c @@ -3028,7 +3028,6 @@ struct ctdb_transaction_handle *ctdb_transaction_start(struct ctdb_db_context *c struct ctdb_transaction_handle *h; int ret; - /* we have a good transaction */ h = talloc_zero(mem_ctx, struct ctdb_transaction_handle); if (h == NULL) { DEBUG(DEBUG_ERR,(__location__ " oom for transaction handle\n")); @@ -3200,14 +3199,14 @@ int ctdb_transaction_commit(struct ctdb_transaction_handle *h) struct ctdb_context *ctdb = h->ctdb_db->ctdb; struct timeval timeout; - talloc_set_destructor(h, NULL); - if (h->m_write == NULL) { /* no changes were made */ talloc_free(h); return 0; } + talloc_set_destructor(h, NULL); + /* our commit strategy is quite complex. - we first try to commit the changes to all other nodes @@ -3258,7 +3257,7 @@ again: /* tell ctdbd that we are finished with our local commit */ ctdb_control(ctdb, CTDB_CURRENT_NODE, h->ctdb_db->db_id, CTDB_CONTROL_TRANS2_FINISHED, CTDB_CTRL_FLAG_NOREPLY, - tdb_null, NULL, NULL, &status, NULL, NULL); + tdb_null, NULL, NULL, NULL, NULL, NULL); talloc_free(h); return 0; } diff --git a/server/ctdb_persistent.c b/server/ctdb_persistent.c index 6a8a100..5b88b4b 100644 --- a/server/ctdb_persistent.c +++ b/server/ctdb_persistent.c @@ -189,31 +189,39 @@ static int ctdb_persistent_store(struct ctdb_persistent_write_state *state) for (i=0;i<m->count;i++) { struct ctdb_ltdb_header oldheader; struct ctdb_ltdb_header header; - TDB_DATA key, data; + TDB_DATA key, data, olddata; + TALLOC_CTX *tmp_ctx = talloc_new(state); rec = ctdb_marshall_loop_next(m, rec, NULL, &header, &key, &data); if (rec == NULL) { DEBUG(DEBUG_ERR,("Failed to get next record %d for db_id 0x%08x in ctdb_persistent_store\n", i, state->ctdb_db->db_id)); + talloc_free(tmp_ctx); goto failed; } /* fetch the old header and ensure the rsn is less than the new rsn */ - ret = ctdb_ltdb_fetch(state->ctdb_db, key, &oldheader, NULL, NULL); + ret = ctdb_ltdb_fetch(state->ctdb_db, key, &oldheader, tmp_ctx, &olddata); if (ret != 0) { DEBUG(DEBUG_ERR,("Failed to fetch old record for db_id 0x%08x in ctdb_persistent_store\n", state->ctdb_db->db_id)); + talloc_free(tmp_ctx); goto failed; } - if (oldheader.rsn >= header.rsn) { + if (oldheader.rsn >= header.rsn && + (olddata.dsize != data.dsize || + memcmp(olddata.dptr, data.dptr, data.dsize) != 0)) { DEBUG(DEBUG_CRIT,("existing header for db_id 0x%08x has larger RSN %llu than new RSN %llu in ctdb_persistent_store\n", state->ctdb_db->db_id, (unsigned long long)oldheader.rsn, (unsigned long long)header.rsn)); + talloc_free(tmp_ctx); goto failed; } + talloc_free(tmp_ctx); + ret = ctdb_ltdb_store(state->ctdb_db, key, &header, data); if (ret != 0) { DEBUG(DEBUG_CRIT,("Failed to store record for db_id 0x%08x in ctdb_persistent_store\n", -- CTDB repository