summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Gorrod <alexander.gorrod@mongodb.com>2016-04-22 13:43:49 +1000
committerAlex Gorrod <alexander.gorrod@mongodb.com>2016-06-01 10:48:12 +1000
commit71c0588a773dc828fb2872e5f574a65e358d6b28 (patch)
tree1744c58317692a76ef8ded759a5ccfa7275a2068
parent58765850aae5544f82ca8212d4525a5e57d55705 (diff)
downloadmongo-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.c23
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