|
|
@ -1224,7 +1224,9 @@ mdb_page_alloc(MDB_cursor *mc, int num) |
|
|
|
last = *kptr; |
|
|
|
last = *kptr; |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
MDB_val key; |
|
|
|
MDB_val key; |
|
|
|
int rc, exact = 0; |
|
|
|
int rc, exact; |
|
|
|
|
|
|
|
again: |
|
|
|
|
|
|
|
exact = 0; |
|
|
|
last = txn->mt_env->me_pglast + 1; |
|
|
|
last = txn->mt_env->me_pglast + 1; |
|
|
|
leaf = NULL; |
|
|
|
leaf = NULL; |
|
|
|
key.mv_data = &last; |
|
|
|
key.mv_data = &last; |
|
|
@ -1254,13 +1256,17 @@ mdb_page_alloc(MDB_cursor *mc, int num) |
|
|
|
if (!txn->mt_env->me_pgfirst) { |
|
|
|
if (!txn->mt_env->me_pgfirst) { |
|
|
|
mdb_node_read(txn, leaf, &data); |
|
|
|
mdb_node_read(txn, leaf, &data); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
txn->mt_env->me_pglast = last; |
|
|
|
|
|
|
|
if (!txn->mt_env->me_pgfirst) |
|
|
|
|
|
|
|
txn->mt_env->me_pgfirst = last; |
|
|
|
idl = (ID *) data.mv_data; |
|
|
|
idl = (ID *) data.mv_data; |
|
|
|
|
|
|
|
/* We might have a zero-length IDL due to freelist growth
|
|
|
|
|
|
|
|
* during a prior commit |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
if (!idl[0]) goto again; |
|
|
|
mop = malloc(sizeof(MDB_oldpages) + MDB_IDL_SIZEOF(idl) - sizeof(pgno_t)); |
|
|
|
mop = malloc(sizeof(MDB_oldpages) + MDB_IDL_SIZEOF(idl) - sizeof(pgno_t)); |
|
|
|
mop->mo_next = txn->mt_env->me_pghead; |
|
|
|
mop->mo_next = txn->mt_env->me_pghead; |
|
|
|
mop->mo_txnid = last; |
|
|
|
mop->mo_txnid = last; |
|
|
|
txn->mt_env->me_pglast = last; |
|
|
|
|
|
|
|
if (!txn->mt_env->me_pgfirst) |
|
|
|
|
|
|
|
txn->mt_env->me_pgfirst = last; |
|
|
|
|
|
|
|
txn->mt_env->me_pghead = mop; |
|
|
|
txn->mt_env->me_pghead = mop; |
|
|
|
memcpy(mop->mo_pages, idl, MDB_IDL_SIZEOF(idl)); |
|
|
|
memcpy(mop->mo_pages, idl, MDB_IDL_SIZEOF(idl)); |
|
|
|
|
|
|
|
|
|
|
|