From 179c44e7da554049ded2c3733cfc83d440945496 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sun, 8 Jul 2012 18:18:12 -0700 Subject: [PATCH 1/2] Revert "libmdb: Do not use the MDB_txbody.mtb_txnid field." This reverts commit 4a0b30499caab8628efcedb8be5643fead7cd17e. --- libraries/libmdb/mdb.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 0c8e6aa0e5..38825e948e 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -511,17 +511,11 @@ typedef struct MDB_txbody { */ pthread_mutex_t mtb_mutex; #endif -#if MDB_VERSION == 1 /** The ID of the last transaction committed to the database. * This is recorded here only for convenience; the value can always * be determined by reading the main database meta pages. - * - * Value is unused, but maintained for backwards compatibility. - * Drop this or mtb_me_toggle when changing MDB_VERSION. - * (Reading both should have been done atomically.) */ txnid_t mtb_txnid; -#endif /** The number of slots that have been used in the reader table. * This always records the maximum count, it is not decremented * when readers release their slots. @@ -542,9 +536,7 @@ typedef struct MDB_txninfo { #define mti_version mt1.mtb.mtb_version #define mti_mutex mt1.mtb.mtb_mutex #define mti_rmname mt1.mtb.mtb_rmname -#if MDB_VERSION == 1 #define mti_txnid mt1.mtb.mtb_txnid -#endif #define mti_numreaders mt1.mtb.mtb_numreaders #define mti_me_toggle mt1.mtb.mtb_me_toggle char pad[(sizeof(MDB_txbody)+CACHELINE-1) & ~(CACHELINE-1)]; @@ -1584,19 +1576,18 @@ mdb_txn_renew0(MDB_txn *txn) pthread_setspecific(env->me_txkey, r); } txn->mt_toggle = env->me_txns->mti_me_toggle; - txn->mt_txnid = r->mr_txnid = env->me_metas[txn->mt_toggle]->mm_txnid; - + txn->mt_txnid = env->me_txns->mti_txnid; /* This happens if a different process was the * last writer to the DB. */ if (env->me_wtxnid < txn->mt_txnid) mt_dbflag = DB_STALE; + r->mr_txnid = txn->mt_txnid; txn->mt_u.reader = r; } else { LOCK_MUTEX_W(env); - txn->mt_toggle = env->me_txns->mti_me_toggle; - txn->mt_txnid = env->me_metas[txn->mt_toggle]->mm_txnid; + txn->mt_txnid = env->me_txns->mti_txnid; if (env->me_wtxnid < txn->mt_txnid) mt_dbflag = DB_STALE; txn->mt_txnid++; @@ -1604,6 +1595,7 @@ mdb_txn_renew0(MDB_txn *txn) if (txn->mt_txnid == mdb_debug_start) mdb_debug = 1; #endif + txn->mt_toggle = env->me_txns->mti_me_toggle; txn->mt_u.dirty_list = env->me_dirty_list; txn->mt_u.dirty_list[0].mid = 0; txn->mt_free_pgs = env->me_free_pgs; From e562f53e10b07ed439d3dae934198d3e9cdb9834 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sun, 8 Jul 2012 18:24:11 -0700 Subject: [PATCH 2/2] Drop me_toggle, unused --- libraries/libmdb/mdb.c | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 38825e948e..983c75c8de 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -521,11 +521,6 @@ typedef struct MDB_txbody { * when readers release their slots. */ unsigned mtb_numreaders; - /** The ID of the most recent meta page in the database. - * This is recorded here only for convenience; the value can always - * be determined by reading the main database meta pages. - */ - uint32_t mtb_me_toggle; } MDB_txbody; /** The actual reader table definition. */ @@ -538,7 +533,6 @@ typedef struct MDB_txninfo { #define mti_rmname mt1.mtb.mtb_rmname #define mti_txnid mt1.mtb.mtb_txnid #define mti_numreaders mt1.mtb.mtb_numreaders -#define mti_me_toggle mt1.mtb.mtb_me_toggle char pad[(sizeof(MDB_txbody)+CACHELINE-1) & ~(CACHELINE-1)]; } mt1; union { @@ -1575,8 +1569,9 @@ mdb_txn_renew0(MDB_txn *txn) r = &env->me_txns->mti_readers[i]; pthread_setspecific(env->me_txkey, r); } - txn->mt_toggle = env->me_txns->mti_me_toggle; txn->mt_txnid = env->me_txns->mti_txnid; + txn->mt_toggle = txn->mt_txnid & 1; + txn->mt_next_pgno = env->me_metas[txn->mt_toggle]->mm_last_pg+1; /* This happens if a different process was the * last writer to the DB. */ @@ -1588,6 +1583,8 @@ mdb_txn_renew0(MDB_txn *txn) LOCK_MUTEX_W(env); txn->mt_txnid = env->me_txns->mti_txnid; + txn->mt_toggle = txn->mt_txnid & 1; + txn->mt_next_pgno = env->me_metas[txn->mt_toggle]->mm_last_pg+1; if (env->me_wtxnid < txn->mt_txnid) mt_dbflag = DB_STALE; txn->mt_txnid++; @@ -1595,14 +1592,12 @@ mdb_txn_renew0(MDB_txn *txn) if (txn->mt_txnid == mdb_debug_start) mdb_debug = 1; #endif - txn->mt_toggle = env->me_txns->mti_me_toggle; txn->mt_u.dirty_list = env->me_dirty_list; txn->mt_u.dirty_list[0].mid = 0; txn->mt_free_pgs = env->me_free_pgs; txn->mt_free_pgs[0] = 0; env->me_txn = txn; } - txn->mt_next_pgno = env->me_metas[txn->mt_toggle]->mm_last_pg+1; /* Copy the DB arrays */ LAZY_RWLOCK_RDLOCK(&env->me_dblock); @@ -2394,7 +2389,6 @@ mdb_env_write_meta(MDB_txn *txn) * how stale their view of these values is. */ LAZY_MUTEX_LOCK(&env->me_txns->mti_mutex); - txn->mt_env->me_txns->mti_me_toggle = toggle; txn->mt_env->me_txns->mti_txnid = txn->mt_txnid; LAZY_MUTEX_UNLOCK(&env->me_txns->mti_mutex); @@ -2598,7 +2592,6 @@ mdb_env_share_locks(MDB_env *env) { int toggle = mdb_env_pick_meta(env); - env->me_txns->mti_me_toggle = toggle; env->me_txns->mti_txnid = env->me_metas[toggle]->mm_txnid; #ifdef _WIN32 @@ -2916,7 +2909,6 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl) env->me_txns->mti_magic = MDB_MAGIC; env->me_txns->mti_txnid = 0; env->me_txns->mti_numreaders = 0; - env->me_txns->mti_me_toggle = 0; } else { if (env->me_txns->mti_magic != MDB_MAGIC) {