|
|
@ -168,6 +168,11 @@ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
typedef ULONG pgno_t; |
|
|
|
typedef ULONG pgno_t; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** A transaction ID.
|
|
|
|
|
|
|
|
* See struct MDB_txn.mt_txnid for details. |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
typedef ULONG txnid_t; |
|
|
|
|
|
|
|
|
|
|
|
/** @defgroup debug Debug Macros
|
|
|
|
/** @defgroup debug Debug Macros
|
|
|
|
* @{ |
|
|
|
* @{ |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -382,7 +387,7 @@ 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. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
ULONG mrb_txnid; |
|
|
|
txnid_t mrb_txnid; |
|
|
|
/** The process ID of the process owning this reader txn. */ |
|
|
|
/** The process ID of the process owning this reader txn. */ |
|
|
|
pid_t mrb_pid; |
|
|
|
pid_t mrb_pid; |
|
|
|
/** The thread ID of the thread owning this txn. */ |
|
|
|
/** The thread ID of the thread owning this txn. */ |
|
|
@ -431,7 +436,7 @@ 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. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
ULONG mtb_txnid; |
|
|
|
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. |
|
|
@ -641,7 +646,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 */ |
|
|
|
ULONG mm_txnid; /**< txnid that committed this page */ |
|
|
|
txnid_t mm_txnid; /**< txnid that committed this page */ |
|
|
|
} MDB_meta; |
|
|
|
} MDB_meta; |
|
|
|
|
|
|
|
|
|
|
|
/** Auxiliary DB info.
|
|
|
|
/** Auxiliary DB info.
|
|
|
@ -669,7 +674,7 @@ struct MDB_txn { |
|
|
|
* Only committed write transactions increment the ID. If a transaction |
|
|
|
* Only committed write transactions increment the ID. If a transaction |
|
|
|
* aborts, the ID may be re-used by the next writer. |
|
|
|
* aborts, the ID may be re-used by the next writer. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
ULONG mt_txnid; |
|
|
|
txnid_t mt_txnid; |
|
|
|
MDB_env *mt_env; /**< the DB environment */ |
|
|
|
MDB_env *mt_env; /**< the DB environment */ |
|
|
|
/** The list of pages that became unused during this transaction.
|
|
|
|
/** The list of pages that became unused during this transaction.
|
|
|
|
* This is an #IDL. |
|
|
|
* This is an #IDL. |
|
|
@ -754,7 +759,7 @@ typedef struct MDB_oldpages { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
struct MDB_oldpages *mo_next; |
|
|
|
struct MDB_oldpages *mo_next; |
|
|
|
/** The ID of the transaction in which these pages were freed. */ |
|
|
|
/** The ID of the transaction in which these pages were freed. */ |
|
|
|
ULONG mo_txnid; |
|
|
|
txnid_t mo_txnid; |
|
|
|
/** An #IDL of the pages */ |
|
|
|
/** An #IDL of the pages */ |
|
|
|
pgno_t mo_pages[1]; /* dynamic */ |
|
|
|
pgno_t mo_pages[1]; /* dynamic */ |
|
|
|
} MDB_oldpages; |
|
|
|
} MDB_oldpages; |
|
|
@ -966,7 +971,7 @@ mdb_alloc_page(MDB_cursor *mc, int num) |
|
|
|
/* See if there's anything in the free DB */ |
|
|
|
/* See if there's anything in the free DB */ |
|
|
|
MDB_cursor m2; |
|
|
|
MDB_cursor m2; |
|
|
|
MDB_node *leaf; |
|
|
|
MDB_node *leaf; |
|
|
|
ULONG *kptr, oldest; |
|
|
|
txnid_t *kptr, oldest; |
|
|
|
|
|
|
|
|
|
|
|
m2.mc_txn = txn; |
|
|
|
m2.mc_txn = txn; |
|
|
|
m2.mc_dbi = FREE_DBI; |
|
|
|
m2.mc_dbi = FREE_DBI; |
|
|
@ -974,13 +979,13 @@ mdb_alloc_page(MDB_cursor *mc, int num) |
|
|
|
m2.mc_flags = 0; |
|
|
|
m2.mc_flags = 0; |
|
|
|
mdb_search_page(&m2, NULL, 0); |
|
|
|
mdb_search_page(&m2, NULL, 0); |
|
|
|
leaf = NODEPTR(m2.mc_pg[m2.mc_top], 0); |
|
|
|
leaf = NODEPTR(m2.mc_pg[m2.mc_top], 0); |
|
|
|
kptr = (ULONG *)NODEKEY(leaf); |
|
|
|
kptr = (txnid_t *)NODEKEY(leaf); |
|
|
|
|
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
unsigned int i; |
|
|
|
unsigned int i; |
|
|
|
oldest = txn->mt_txnid - 1; |
|
|
|
oldest = txn->mt_txnid - 1; |
|
|
|
for (i=0; i<txn->mt_env->me_txns->mti_numreaders; i++) { |
|
|
|
for (i=0; i<txn->mt_env->me_txns->mti_numreaders; i++) { |
|
|
|
ULONG mr = txn->mt_env->me_txns->mti_readers[i].mr_txnid; |
|
|
|
txnid_t mr = txn->mt_env->me_txns->mti_readers[i].mr_txnid; |
|
|
|
if (mr && mr < oldest) |
|
|
|
if (mr && mr < oldest) |
|
|
|
oldest = mr; |
|
|
|
oldest = mr; |
|
|
|
} |
|
|
|
} |
|
|
@ -1374,7 +1379,7 @@ mdb_txn_commit(MDB_txn *txn) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
/* write to last page of freeDB */ |
|
|
|
/* write to last page of freeDB */ |
|
|
|
key.mv_size = sizeof(pgno_t); |
|
|
|
key.mv_size = sizeof(pgno_t); |
|
|
|
key.mv_data = (char *)&txn->mt_txnid; |
|
|
|
key.mv_data = &txn->mt_txnid; |
|
|
|
data.mv_data = txn->mt_free_pgs; |
|
|
|
data.mv_data = txn->mt_free_pgs; |
|
|
|
/* The free list can still grow during this call,
|
|
|
|
/* The free list can still grow during this call,
|
|
|
|
* despite the pre-emptive touches above. So check |
|
|
|
* despite the pre-emptive touches above. So check |
|
|
@ -1397,7 +1402,7 @@ mdb_txn_commit(MDB_txn *txn) |
|
|
|
|
|
|
|
|
|
|
|
mop = env->me_pghead; |
|
|
|
mop = env->me_pghead; |
|
|
|
key.mv_size = sizeof(pgno_t); |
|
|
|
key.mv_size = sizeof(pgno_t); |
|
|
|
key.mv_data = (char *)&mop->mo_txnid; |
|
|
|
key.mv_data = &mop->mo_txnid; |
|
|
|
data.mv_size = MDB_IDL_SIZEOF(mop->mo_pages); |
|
|
|
data.mv_size = MDB_IDL_SIZEOF(mop->mo_pages); |
|
|
|
data.mv_data = mop->mo_pages; |
|
|
|
data.mv_data = mop->mo_pages; |
|
|
|
mdb_cursor_put(&mc, &key, &data, 0); |
|
|
|
mdb_cursor_put(&mc, &key, &data, 0); |
|
|
|