|
|
@ -610,11 +610,11 @@ typedef struct MDB_rxbody { |
|
|
|
* started from so we can avoid overwriting any data used in that |
|
|
|
* started from so we can avoid overwriting any data used in that |
|
|
|
* particular version. |
|
|
|
* particular version. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
txnid_t mrb_txnid; |
|
|
|
volatile txnid_t mrb_txnid; |
|
|
|
/** The process ID of the process owning this reader txn. */ |
|
|
|
/** The process ID of the process owning this reader txn. */ |
|
|
|
MDB_PID_T mrb_pid; |
|
|
|
volatile MDB_PID_T mrb_pid; |
|
|
|
/** The thread ID of the thread owning this txn. */ |
|
|
|
/** The thread ID of the thread owning this txn. */ |
|
|
|
MDB_THR_T mrb_tid; |
|
|
|
volatile MDB_THR_T mrb_tid; |
|
|
|
} MDB_rxbody; |
|
|
|
} MDB_rxbody; |
|
|
|
|
|
|
|
|
|
|
|
/** The actual reader record, with cacheline padding. */ |
|
|
|
/** The actual reader record, with cacheline padding. */ |
|
|
@ -664,12 +664,12 @@ typedef struct MDB_txbody { |
|
|
|
* This is recorded here only for convenience; the value can always |
|
|
|
* This is recorded here only for convenience; the value can always |
|
|
|
* be determined by reading the main database meta pages. |
|
|
|
* be determined by reading the main database meta pages. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
txnid_t mtb_txnid; |
|
|
|
volatile txnid_t mtb_txnid; |
|
|
|
/** The number of slots that have been used in the reader table.
|
|
|
|
/** The number of slots that have been used in the reader table.
|
|
|
|
* This always records the maximum count, it is not decremented |
|
|
|
* This always records the maximum count, it is not decremented |
|
|
|
* when readers release their slots. |
|
|
|
* when readers release their slots. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
unsigned mtb_numreaders; |
|
|
|
volatile unsigned mtb_numreaders; |
|
|
|
} MDB_txbody; |
|
|
|
} MDB_txbody; |
|
|
|
|
|
|
|
|
|
|
|
/** The actual reader table definition. */ |
|
|
|
/** The actual reader table definition. */ |
|
|
@ -942,7 +942,7 @@ typedef struct MDB_meta { |
|
|
|
/** Any persistent environment flags. @ref mdb_env */ |
|
|
|
/** Any persistent environment flags. @ref mdb_env */ |
|
|
|
#define mm_flags mm_dbs[0].md_flags |
|
|
|
#define mm_flags mm_dbs[0].md_flags |
|
|
|
pgno_t mm_last_pg; /**< last used page in file */ |
|
|
|
pgno_t mm_last_pg; /**< last used page in file */ |
|
|
|
txnid_t mm_txnid; /**< txnid that committed this page */ |
|
|
|
volatile txnid_t mm_txnid; /**< txnid that committed this page */ |
|
|
|
} MDB_meta; |
|
|
|
} MDB_meta; |
|
|
|
|
|
|
|
|
|
|
|
/** Buffer for a stack-allocated meta page.
|
|
|
|
/** Buffer for a stack-allocated meta page.
|
|
|
@ -3601,6 +3601,10 @@ mdb_env_write_meta(MDB_txn *txn) |
|
|
|
mp->mm_dbs[0] = txn->mt_dbs[0]; |
|
|
|
mp->mm_dbs[0] = txn->mt_dbs[0]; |
|
|
|
mp->mm_dbs[1] = txn->mt_dbs[1]; |
|
|
|
mp->mm_dbs[1] = txn->mt_dbs[1]; |
|
|
|
mp->mm_last_pg = txn->mt_next_pgno - 1; |
|
|
|
mp->mm_last_pg = txn->mt_next_pgno - 1; |
|
|
|
|
|
|
|
#if !(defined(_MSC_VER) || defined(__i386__) || defined(__x86_64__)) |
|
|
|
|
|
|
|
/* LY: issue a memory barrier, if not x86. ITS#7969 */ |
|
|
|
|
|
|
|
__sync_synchronize(); |
|
|
|
|
|
|
|
#endif |
|
|
|
mp->mm_txnid = txn->mt_txnid; |
|
|
|
mp->mm_txnid = txn->mt_txnid; |
|
|
|
if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { |
|
|
|
if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { |
|
|
|
unsigned meta_size = env->me_psize; |
|
|
|
unsigned meta_size = env->me_psize; |
|
|
|