diff options
author | monty@mashka.mysql.fi <> | 2002-09-11 14:49:38 +0300 |
---|---|---|
committer | monty@mashka.mysql.fi <> | 2002-09-11 14:49:38 +0300 |
commit | 8b7521eb7f8bf0ebcceacf308b8c6c36f31735c5 (patch) | |
tree | 780174860f876a082066a96b632c69be18d7282f /innobase/btr | |
parent | fa4e07bf978d62fe72b295dac42b31374a2e012e (diff) | |
parent | 75a39efa416cc9db479a1902ecb03a9772e85ebb (diff) | |
download | mariadb-git-8b7521eb7f8bf0ebcceacf308b8c6c36f31735c5.tar.gz |
Merge with 3.23.53
Diffstat (limited to 'innobase/btr')
-rw-r--r-- | innobase/btr/btr0cur.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/innobase/btr/btr0cur.c b/innobase/btr/btr0cur.c index 25a7060883c..e35ff2ca69e 100644 --- a/innobase/btr/btr0cur.c +++ b/innobase/btr/btr0cur.c @@ -302,6 +302,9 @@ btr_cur_search_to_nth_level( rw_lock_s_unlock(&btr_search_latch); } + /* Store the position of the tree latch we push to mtr so that we + know how to release it when we have latched leaf node(s) */ + savepoint = mtr_set_savepoint(mtr); tree = index->tree; @@ -506,12 +509,18 @@ btr_cur_open_at_index_side( ulint root_height = 0; /* remove warning */ rec_t* node_ptr; ulint estimate; + ulint savepoint; estimate = latch_mode & BTR_ESTIMATE; latch_mode = latch_mode & ~BTR_ESTIMATE; tree = index->tree; + /* Store the position of the tree latch we push to mtr so that we + know how to release it when we have latched the leaf node */ + + savepoint = mtr_set_savepoint(mtr); + if (latch_mode == BTR_MODIFY_TREE) { mtr_x_lock(dict_tree_get_lock(tree), mtr); } else { @@ -544,6 +553,22 @@ btr_cur_open_at_index_side( if (height == 0) { btr_cur_latch_leaves(tree, page, space, page_no, latch_mode, cursor, mtr); + + /* In versions <= 3.23.52 we had forgotten to + release the tree latch here. If in an index scan + we had to scan far to find a record visible to the + current transaction, that could starve others + waiting for the tree latch. */ + + if ((latch_mode != BTR_MODIFY_TREE) + && (latch_mode != BTR_CONT_MODIFY_TREE)) { + + /* Release the tree s-latch */ + + mtr_release_s_latch_at_savepoint( + mtr, savepoint, + dict_tree_get_lock(tree)); + } } if (from_left) { |