From 0492446818675d7f37c6837069ae7803da4fe97f Mon Sep 17 00:00:00 2001 From: Rich Prohaska <prohaska@tokutek.com> Date: Tue, 14 Jan 2014 19:14:18 -0500 Subject: [PATCH] #147 dont hold locktree manager mutex when escalating --- locktree/manager.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/locktree/manager.cc b/locktree/manager.cc index 5c31c0d2303..e27adc82cab 100644 --- a/locktree/manager.cc +++ b/locktree/manager.cc @@ -341,20 +341,21 @@ void locktree::manager::escalate_all_locktrees(void) { if (0) fprintf(stderr, "%d %s:%u\n", toku_os_gettid(), __PRETTY_FUNCTION__, __LINE__); uint64_t t0 = toku_current_time_microsec(); - mutex_lock(); - // get all locktrees + mutex_lock(); int num_locktrees = m_locktree_map.size(); locktree **locktrees = new locktree *[num_locktrees]; for (int i = 0; i < num_locktrees; i++) { int r = m_locktree_map.fetch(i, &locktrees[i]); invariant_zero(r); + reference_lt(locktrees[i]); } + mutex_unlock(); // escalate them escalate_locktrees(locktrees, num_locktrees); + delete [] locktrees; - mutex_unlock(); uint64_t t1 = toku_current_time_microsec(); add_escalator_wait_time(t1 - t0); @@ -483,6 +484,7 @@ void locktree::manager::escalate_locktrees(locktree **locktrees, int num_locktre tokutime_t t0 = toku_time_now(); for (int i = 0; i < num_locktrees; i++) { locktrees[i]->escalate(m_lt_escalate_callback, m_lt_escalate_callback_extra); + release_lt(locktrees[i]); } tokutime_t t1 = toku_time_now(); @@ -510,6 +512,7 @@ void locktree::manager::escalate_lock_trees_for_txn(TXNID txnid UU(), locktree * // get lock trees for txnid const int num_locktrees = 1; locktree *locktrees[1] = { lt }; + reference_lt(lt); // escalate these lock trees locktree::escalator this_escalator;