Commit f5b9b860 authored by Zardosht Kasheff's avatar Zardosht Kasheff Committed by Yoni Fogel

[t:4153], check in fix to main line

git-svn-id: file:///svn/toku/tokudb@37056 c7de825b-a66e-492c-adef-691d508d4ae1
parent ca761b09
...@@ -440,26 +440,32 @@ int toku_txn_abort_with_lsn(TOKUTXN txn, YIELDF yield, void *yieldv, LSN oplsn, ...@@ -440,26 +440,32 @@ int toku_txn_abort_with_lsn(TOKUTXN txn, YIELDF yield, void *yieldv, LSN oplsn,
} }
struct txn_fsync_log_info { struct txn_fsync_log_info {
TOKUTXN txn; TOKULOGGER logger;
LSN do_fsync_lsn;
int r; int r;
}; };
static void do_txn_fsync_log(void *thunk) { static void do_txn_fsync_log(void *thunk) {
struct txn_fsync_log_info *info = (struct txn_fsync_log_info *) thunk; struct txn_fsync_log_info *info = (struct txn_fsync_log_info *) thunk;
TOKUTXN txn = info->txn; info->r = toku_logger_fsync_if_lsn_not_fsynced(info->logger, info->do_fsync_lsn);
info->r = toku_logger_fsync_if_lsn_not_fsynced(txn->logger, txn->do_fsync_lsn);
} }
int toku_txn_maybe_fsync_log(TOKUTXN txn, YIELDF yield, void *yieldv) { int toku_txn_maybe_fsync_log(TOKULOGGER logger, LSN do_fsync_lsn, BOOL do_fsync, YIELDF yield, void *yieldv) {
int r = 0; int r = 0;
if (txn->logger && txn->do_fsync) { if (logger && do_fsync) {
struct txn_fsync_log_info info = { .txn = txn }; struct txn_fsync_log_info info = { .logger = logger, .do_fsync_lsn = do_fsync_lsn };
yield(do_txn_fsync_log, &info, yieldv); yield(do_txn_fsync_log, &info, yieldv);
r = info.r; r = info.r;
} }
return r; return r;
} }
void toku_txn_get_fsync_info(TOKUTXN ttxn, BOOL* do_fsync, LSN* do_fsync_lsn) {
*do_fsync = ttxn->do_fsync;
*do_fsync_lsn = ttxn->do_fsync_lsn;
}
void toku_txn_close_txn(TOKUTXN txn) { void toku_txn_close_txn(TOKUTXN txn) {
TOKULOGGER logger = txn->logger; TOKULOGGER logger = txn->logger;
......
...@@ -41,7 +41,9 @@ int toku_txn_abort_txn(TOKUTXN txn, YIELDF yield, void *yieldv, ...@@ -41,7 +41,9 @@ int toku_txn_abort_txn(TOKUTXN txn, YIELDF yield, void *yieldv,
int toku_txn_abort_with_lsn(TOKUTXN txn, YIELDF yield, void *yieldv, LSN oplsn, int toku_txn_abort_with_lsn(TOKUTXN txn, YIELDF yield, void *yieldv, LSN oplsn,
TXN_PROGRESS_POLL_FUNCTION poll, void *poll_extra); TXN_PROGRESS_POLL_FUNCTION poll, void *poll_extra);
int toku_txn_maybe_fsync_log(TOKUTXN txn, YIELDF yield, void *yieldv); int toku_txn_maybe_fsync_log(TOKULOGGER logger, LSN do_fsync_lsn, BOOL do_fsync, YIELDF yield, void *yieldv);
void toku_txn_get_fsync_info(TOKUTXN ttxn, BOOL* do_fsync, LSN* do_fsync_lsn);
void toku_txn_close_txn(TOKUTXN txn); void toku_txn_close_txn(TOKUTXN txn);
XIDS toku_txn_get_xids (TOKUTXN); XIDS toku_txn_get_xids (TOKUTXN);
......
...@@ -2688,9 +2688,20 @@ toku_txn_commit(DB_TXN * txn, u_int32_t flags, ...@@ -2688,9 +2688,20 @@ toku_txn_commit(DB_TXN * txn, u_int32_t flags,
// Close the logger after releasing the locks // Close the logger after releasing the locks
r = toku_txn_release_locks(txn); r = toku_txn_release_locks(txn);
//toku_logger_txn_close(db_txn_struct_i(txn)->tokutxn); TOKUTXN ttxn = db_txn_struct_i(txn)->tokutxn;
toku_txn_maybe_fsync_log(db_txn_struct_i(txn)->tokutxn, ydb_yield, NULL); TOKULOGGER logger = txn->mgrp->i->logger;
toku_txn_close_txn(db_txn_struct_i(txn)->tokutxn); LSN do_fsync_lsn;
BOOL do_fsync;
//
// quickie fix for 5.2.0, need to extract these variables so that
// we can do the fsync after the close of txn. We need to do it
// after the close because if we do it before, there are race
// conditions exposed by test_stress1.c (#4145, #4153)
//
toku_txn_get_fsync_info(ttxn, &do_fsync, &do_fsync_lsn);
toku_txn_close_txn(ttxn);
toku_txn_maybe_fsync_log(logger, do_fsync_lsn, do_fsync, ydb_yield, NULL);
// the toxutxn is freed, and we must free the rest. */ // the toxutxn is freed, and we must free the rest. */
//Promote list to parent (dbs that must close before abort) //Promote list to parent (dbs that must close before abort)
...@@ -2759,7 +2770,6 @@ toku_txn_abort(DB_TXN * txn, ...@@ -2759,7 +2770,6 @@ toku_txn_abort(DB_TXN * txn,
assert(r==0); assert(r==0);
r = toku_txn_release_locks(txn); r = toku_txn_release_locks(txn);
//toku_logger_txn_close(db_txn_struct_i(txn)->tokutxn); //toku_logger_txn_close(db_txn_struct_i(txn)->tokutxn);
toku_txn_maybe_fsync_log(db_txn_struct_i(txn)->tokutxn, ydb_yield, NULL);
toku_txn_close_txn(db_txn_struct_i(txn)->tokutxn); toku_txn_close_txn(db_txn_struct_i(txn)->tokutxn);
#if !TOKUDB_NATIVE_H #if !TOKUDB_NATIVE_H
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment