#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.
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;
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 */
__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;
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
{