|
|
|
@ -1084,6 +1084,7 @@ struct MDB_txn { |
|
|
|
|
#define MDB_TXN_ERROR 0x02 /**< txn is unusable after an error */ |
|
|
|
|
#define MDB_TXN_DIRTY 0x04 /**< must write, even if dirty list is empty */ |
|
|
|
|
#define MDB_TXN_SPILLS 0x08 /**< txn or a parent has spilled pages */ |
|
|
|
|
#define MDB_TXN_NOSYNC 0x10 /**< don't sync this txn on commit */ |
|
|
|
|
/** @} */ |
|
|
|
|
unsigned int mt_flags; /**< @ref mdb_txn */ |
|
|
|
|
/** #dirty_list room: Array size - \#dirty pages visible to this txn.
|
|
|
|
@ -2755,6 +2756,8 @@ mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn **ret) |
|
|
|
|
txn->mt_dbflags = (unsigned char *)(txn->mt_dbs + env->me_maxdbs); |
|
|
|
|
txn->mt_dbiseqs = env->me_dbiseqs; |
|
|
|
|
} else { |
|
|
|
|
if (flags & MDB_NOSYNC) |
|
|
|
|
txn->mt_flags |= MDB_TXN_NOSYNC; |
|
|
|
|
txn->mt_cursors = (MDB_cursor **)(txn->mt_dbs + env->me_maxdbs); |
|
|
|
|
if (parent) { |
|
|
|
|
txn->mt_dbiseqs = parent->mt_dbiseqs; |
|
|
|
@ -3486,9 +3489,12 @@ mdb_txn_commit(MDB_txn *txn) |
|
|
|
|
mdb_audit(txn); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
if ((rc = mdb_page_flush(txn, 0)) || |
|
|
|
|
(rc = mdb_env_sync(env, 0)) || |
|
|
|
|
(rc = mdb_env_write_meta(txn))) |
|
|
|
|
if ((rc = mdb_page_flush(txn, 0))) |
|
|
|
|
goto fail; |
|
|
|
|
if (!F_ISSET(txn->mt_flags, MDB_TXN_NOSYNC) && |
|
|
|
|
(rc = mdb_env_sync(env, 0))) |
|
|
|
|
goto fail; |
|
|
|
|
if ((rc = mdb_env_write_meta(txn))) |
|
|
|
|
goto fail; |
|
|
|
|
|
|
|
|
|
/* Free P_LOOSE pages left behind in dirty_list */ |
|
|
|
@ -3682,6 +3688,8 @@ mdb_env_write_meta(MDB_txn *txn) |
|
|
|
|
__sync_synchronize(); |
|
|
|
|
#endif |
|
|
|
|
mp->mm_txnid = txn->mt_txnid; |
|
|
|
|
if (F_ISSET(txn->mt_flags, MDB_TXN_NOSYNC)) |
|
|
|
|
goto done; |
|
|
|
|
if (!(env->me_flags & (MDB_NOMETASYNC|MDB_NOSYNC))) { |
|
|
|
|
unsigned meta_size = env->me_psize; |
|
|
|
|
rc = (env->me_flags & MDB_MAPASYNC) ? MS_ASYNC : MS_SYNC; |
|
|
|
@ -3718,7 +3726,8 @@ mdb_env_write_meta(MDB_txn *txn) |
|
|
|
|
off += PAGEHDRSZ; |
|
|
|
|
|
|
|
|
|
/* Write to the SYNC fd */ |
|
|
|
|
mfd = env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC) ? |
|
|
|
|
mfd = ((env->me_flags & (MDB_NOSYNC|MDB_NOMETASYNC)) || |
|
|
|
|
(txn->mt_flags & MDB_TXN_NOSYNC)) ? |
|
|
|
|
env->me_fd : env->me_mfd; |
|
|
|
|
#ifdef _WIN32 |
|
|
|
|
{ |
|
|
|
|