diff options
author | Alex Gorrod <alexander.gorrod@mongodb.com> | 2016-04-22 13:43:49 +1000 |
---|---|---|
committer | Alex Gorrod <alexander.gorrod@mongodb.com> | 2016-06-01 10:48:12 +1000 |
commit | 71c0588a773dc828fb2872e5f574a65e358d6b28 (patch) | |
tree | 1744c58317692a76ef8ded759a5ccfa7275a2068 | |
parent | 58765850aae5544f82ca8212d4525a5e57d55705 (diff) | |
download | mongo-71c0588a773dc828fb2872e5f574a65e358d6b28.tar.gz |
Merge pull request #2677 from wiredtiger/wt-2560-spin
WT-2560 Spin on transaction locks.
(cherry picked from commit f498d8c1c1d3fbbb6cb44c16fa85ab0de2a4aafc)
-rw-r--r-- | src/txn/txn.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/src/txn/txn.c b/src/txn/txn.c index 1e3164f9a20..ab1cd622057 100644 --- a/src/txn/txn.c +++ b/src/txn/txn.c @@ -112,6 +112,7 @@ int __wt_txn_get_snapshot(WT_SESSION_IMPL *session) { WT_CONNECTION_IMPL *conn; + WT_DECL_RET; WT_TXN *txn; WT_TXN_GLOBAL *txn_global; WT_TXN_STATE *s, *txn_state; @@ -124,7 +125,15 @@ __wt_txn_get_snapshot(WT_SESSION_IMPL *session) txn_global = &conn->txn_global; txn_state = WT_SESSION_TXN_STATE(session); - WT_RET(__wt_readlock(session, txn_global->scan_rwlock)); + /* + * Spin waiting for the lock: the sleeps in our blocking readlock + * implementation are too slow for scanning the transaction table. + */ + while ((ret = + __wt_try_readlock(session, txn_global->scan_rwlock)) == EBUSY) + WT_PAUSE(); + WT_RET(ret); + current_id = snap_min = txn_global->current; prev_oldest_id = txn_global->oldest_id; @@ -273,7 +282,11 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, bool force) return (0); /* First do a read-only scan. */ - WT_RET(__wt_readlock(session, txn_global->scan_rwlock)); + if (force) + WT_RET(__wt_readlock(session, txn_global->scan_rwlock)); + else if ((ret = + __wt_try_readlock(session, txn_global->scan_rwlock)) != 0) + return (ret == EBUSY ? 0 : ret); __txn_oldest_scan(session, &oldest_id, &last_running, &oldest_session); WT_RET(__wt_readunlock(session, txn_global->scan_rwlock)); @@ -288,7 +301,11 @@ __wt_txn_update_oldest(WT_SESSION_IMPL *session, bool force) return (0); /* It looks like an update is necessary, wait for exclusive access. */ - WT_RET(__wt_writelock(session, txn_global->scan_rwlock)); + if (force) + WT_RET(__wt_writelock(session, txn_global->scan_rwlock)); + else if ((ret = + __wt_try_writelock(session, txn_global->scan_rwlock)) != 0) + return (ret == EBUSY ? 0 : ret); /* * If the oldest ID has been updated while we waited, don't bother |