diff options
author | unknown <heikki@hundin.mysql.fi> | 2002-09-08 03:01:53 +0300 |
---|---|---|
committer | unknown <heikki@hundin.mysql.fi> | 2002-09-08 03:01:53 +0300 |
commit | fab80610af9a5cf2619991085117ecc3d3daabc5 (patch) | |
tree | f8e862b0af566a9d0a9634f0def83762b22e8456 /innobase/btr | |
parent | 94bbbc7f360ea6484f47d4cbe2e6151f0ef7fc92 (diff) | |
download | mariadb-git-fab80610af9a5cf2619991085117ecc3d3daabc5.tar.gz |
btr0cur.c:
Remove long latch hold which happened if we scanned long an index without finding any record visible to the current consistent read
innobase/btr/btr0cur.c:
Remove long latch hold which happened if we scanned long an index without finding any record visible to the current consistent read
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 ada7e482b7e..8abf918366a 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; 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) { |