Commit 0664d633 authored by Marko Mäkelä's avatar Marko Mäkelä

MDEV-14952 Avoid repeated calls to btr_get_search_latch()

btr_cur_search_to_nth_level(), btr_search_guess_on_hash(),
btr_pcur_open_with_no_init_func(), row_sel_open_pcur():
Replace the parameter has_search_latch with the ahi_latch
(passed as NULL if the caller does not hold the latch).

btr_search_update_hash_node_on_insert(),
btr_search_update_hash_on_insert(),
btr_search_build_page_hash_index(): Add the parameter ahi_latch.

btr_search_x_lock(), btr_search_x_unlock(),
btr_search_s_lock(), btr_search_s_unlock(): Remove.
parent 4beb699a
...@@ -919,8 +919,7 @@ search tuple should be performed in the B-tree. InnoDB does an insert ...@@ -919,8 +919,7 @@ search tuple should be performed in the B-tree. InnoDB does an insert
immediately after the cursor. Thus, the cursor may end up on a user record, immediately after the cursor. Thus, the cursor may end up on a user record,
or on a page infimum record. */ or on a page infimum record. */
dberr_t dberr_t
btr_cur_search_to_nth_level( btr_cur_search_to_nth_level_func(
/*========================*/
dict_index_t* index, /*!< in: index */ dict_index_t* index, /*!< in: index */
ulint level, /*!< in: the tree level of search */ ulint level, /*!< in: the tree level of search */
const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in
...@@ -935,17 +934,16 @@ btr_cur_search_to_nth_level( ...@@ -935,17 +934,16 @@ btr_cur_search_to_nth_level(
cursor->left_block is used to store a pointer cursor->left_block is used to store a pointer
to the left neighbor page, in the cases to the left neighbor page, in the cases
BTR_SEARCH_PREV and BTR_MODIFY_PREV; BTR_SEARCH_PREV and BTR_MODIFY_PREV;
NOTE that if has_search_latch NOTE that if ahi_latch, we might not have a
is != 0, we maybe do not have a latch set cursor page latch, we assume that ahi_latch
on the cursor page, we assume protects the record! */
the caller uses his search latch
to protect the record! */
btr_cur_t* cursor, /*!< in/out: tree cursor; the cursor page is btr_cur_t* cursor, /*!< in/out: tree cursor; the cursor page is
s- or x-latched, but see also above! */ s- or x-latched, but see also above! */
ulint has_search_latch, #ifdef BTR_CUR_HASH_ADAPT
/*!< in: info on the latch mode the rw_lock_t* ahi_latch,
caller currently has on search system: /*!< in: currently held btr_search_latch
RW_S_LATCH, or 0 */ (in RW_S_LATCH mode), or NULL */
#endif /* BTR_CUR_HASH_ADAPT */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
unsigned line, /*!< in: line where called */ unsigned line, /*!< in: line where called */
mtr_t* mtr, /*!< in: mtr */ mtr_t* mtr, /*!< in: mtr */
...@@ -1123,7 +1121,7 @@ btr_cur_search_to_nth_level( ...@@ -1123,7 +1121,7 @@ btr_cur_search_to_nth_level(
&& mode != PAGE_CUR_LE_OR_EXTENDS && mode != PAGE_CUR_LE_OR_EXTENDS
# endif /* PAGE_CUR_LE_OR_EXTENDS */ # endif /* PAGE_CUR_LE_OR_EXTENDS */
&& !dict_index_is_spatial(index) && !dict_index_is_spatial(index)
/* If !has_search_latch, we do a dirty read of /* If !ahi_latch, we do a dirty read of
btr_search_enabled below, and btr_search_guess_on_hash() btr_search_enabled below, and btr_search_guess_on_hash()
will have to check it again. */ will have to check it again. */
&& btr_search_enabled && btr_search_enabled
...@@ -1131,7 +1129,7 @@ btr_cur_search_to_nth_level( ...@@ -1131,7 +1129,7 @@ btr_cur_search_to_nth_level(
&& !(tuple->info_bits & REC_INFO_MIN_REC_FLAG) && !(tuple->info_bits & REC_INFO_MIN_REC_FLAG)
&& btr_search_guess_on_hash(index, info, tuple, mode, && btr_search_guess_on_hash(index, info, tuple, mode,
latch_mode, cursor, latch_mode, cursor,
has_search_latch, mtr)) { ahi_latch, mtr)) {
/* Search using the hash index succeeded */ /* Search using the hash index succeeded */
...@@ -1152,10 +1150,12 @@ btr_cur_search_to_nth_level( ...@@ -1152,10 +1150,12 @@ btr_cur_search_to_nth_level(
/* If the hash search did not succeed, do binary search down the /* If the hash search did not succeed, do binary search down the
tree */ tree */
if (has_search_latch) { #ifdef BTR_CUR_HASH_ADAPT
if (ahi_latch) {
/* Release possible search latch to obey latching order */ /* Release possible search latch to obey latching order */
btr_search_s_unlock(index); rw_lock_s_unlock(ahi_latch);
} }
#endif /* BTR_CUR_HASH_ADAPT */
/* Store the position of the tree latch we push to mtr so that we /* 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) */ know how to release it when we have latched leaf node(s) */
...@@ -2222,15 +2222,17 @@ btr_cur_search_to_nth_level( ...@@ -2222,15 +2222,17 @@ btr_cur_search_to_nth_level(
ut_free(prev_tree_savepoints); ut_free(prev_tree_savepoints);
} }
if (has_search_latch) {
btr_search_s_lock(index);
}
if (mbr_adj) { if (mbr_adj) {
/* remember that we will need to adjust parent MBR */ /* remember that we will need to adjust parent MBR */
cursor->rtr_info->mbr_adj = true; cursor->rtr_info->mbr_adj = true;
} }
#ifdef BTR_CUR_HASH_ADAPT
if (ahi_latch) {
rw_lock_s_lock(ahi_latch);
}
#endif /* BTR_CUR_HASH_ADAPT */
DBUG_RETURN(err); DBUG_RETURN(err);
} }
...@@ -3300,10 +3302,14 @@ btr_cur_optimistic_insert( ...@@ -3300,10 +3302,14 @@ btr_cur_optimistic_insert(
ut_ad(entry->info_bits == REC_INFO_DEFAULT_ROW); ut_ad(entry->info_bits == REC_INFO_DEFAULT_ROW);
ut_ad(index->is_instant()); ut_ad(index->is_instant());
ut_ad(flags == BTR_NO_LOCKING_FLAG); ut_ad(flags == BTR_NO_LOCKING_FLAG);
} else if (!reorg && cursor->flag == BTR_CUR_HASH) {
btr_search_update_hash_node_on_insert(cursor);
} else { } else {
btr_search_update_hash_on_insert(cursor); rw_lock_t* ahi_latch = btr_get_search_latch(index);
if (!reorg && cursor->flag == BTR_CUR_HASH) {
btr_search_update_hash_node_on_insert(
cursor, ahi_latch);
} else {
btr_search_update_hash_on_insert(cursor, ahi_latch);
}
} }
#endif /* BTR_CUR_HASH_ADAPT */ #endif /* BTR_CUR_HASH_ADAPT */
...@@ -3509,7 +3515,8 @@ btr_cur_pessimistic_insert( ...@@ -3509,7 +3515,8 @@ btr_cur_pessimistic_insert(
ut_ad((flags & ~BTR_KEEP_IBUF_BITMAP) ut_ad((flags & ~BTR_KEEP_IBUF_BITMAP)
== BTR_NO_LOCKING_FLAG); == BTR_NO_LOCKING_FLAG);
} else { } else {
btr_search_update_hash_on_insert(cursor); btr_search_update_hash_on_insert(
cursor, btr_get_search_latch(index));
} }
#endif /* BTR_CUR_HASH_ADAPT */ #endif /* BTR_CUR_HASH_ADAPT */
if (inherit && !(flags & BTR_NO_LOCKING_FLAG)) { if (inherit && !(flags & BTR_NO_LOCKING_FLAG)) {
......
...@@ -353,7 +353,11 @@ btr_pcur_restore_position_func( ...@@ -353,7 +353,11 @@ btr_pcur_restore_position_func(
} }
btr_pcur_open_with_no_init_func(index, tuple, mode, latch_mode, btr_pcur_open_with_no_init_func(index, tuple, mode, latch_mode,
cursor, 0, file, line, mtr); cursor,
#ifdef BTR_CUR_HASH_ADAPT
NULL,
#endif /* BTR_CUR_HASH_ADAPT */
file, line, mtr);
/* Restore the old search mode */ /* Restore the old search mode */
cursor->search_mode = old_mode; cursor->search_mode = old_mode;
......
This diff is collapsed.
/***************************************************************************** /*****************************************************************************
Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1994, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -177,8 +177,7 @@ Note that if mode is PAGE_CUR_LE, which is used in inserts, then ...@@ -177,8 +177,7 @@ Note that if mode is PAGE_CUR_LE, which is used in inserts, then
cursor->up_match and cursor->low_match both will have sensible values. cursor->up_match and cursor->low_match both will have sensible values.
If mode is PAGE_CUR_GE, then up_match will a have a sensible value. */ If mode is PAGE_CUR_GE, then up_match will a have a sensible value. */
dberr_t dberr_t
btr_cur_search_to_nth_level( btr_cur_search_to_nth_level_func(
/*========================*/
dict_index_t* index, /*!< in: index */ dict_index_t* index, /*!< in: index */
ulint level, /*!< in: the tree level of search */ ulint level, /*!< in: the tree level of search */
const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in const dtuple_t* tuple, /*!< in: data tuple; NOTE: n_fields_cmp in
...@@ -197,23 +196,29 @@ btr_cur_search_to_nth_level( ...@@ -197,23 +196,29 @@ btr_cur_search_to_nth_level(
cursor->left_block is used to store a pointer cursor->left_block is used to store a pointer
to the left neighbor page, in the cases to the left neighbor page, in the cases
BTR_SEARCH_PREV and BTR_MODIFY_PREV; BTR_SEARCH_PREV and BTR_MODIFY_PREV;
NOTE that if has_search_latch NOTE that if ahi_latch, we might not have a
is != 0, we maybe do not have a latch set cursor page latch, we assume that ahi_latch
on the cursor page, we assume protects the record! */
the caller uses his search latch
to protect the record! */
btr_cur_t* cursor, /*!< in/out: tree cursor; the cursor page is btr_cur_t* cursor, /*!< in/out: tree cursor; the cursor page is
s- or x-latched, but see also above! */ s- or x-latched, but see also above! */
ulint has_search_latch, #ifdef BTR_CUR_HASH_ADAPT
/*!< in: latch mode the caller rw_lock_t* ahi_latch,
currently has on search system: /*!< in: currently held btr_search_latch
RW_S_LATCH, or 0 */ (in RW_S_LATCH mode), or NULL */
#endif /* BTR_CUR_HASH_ADAPT */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
unsigned line, /*!< in: line where called */ unsigned line, /*!< in: line where called */
mtr_t* mtr, /*!< in/out: mini-transaction */ mtr_t* mtr, /*!< in/out: mini-transaction */
ib_uint64_t autoinc = 0); ib_uint64_t autoinc = 0);
/*!< in: PAGE_ROOT_AUTO_INC to be written /*!< in: PAGE_ROOT_AUTO_INC to be written
(0 if none) */ (0 if none) */
#ifdef BTR_CUR_HASH_ADAPT
# define btr_cur_search_to_nth_level(i,l,t,m,lm,c,a,fi,li,mtr) \
btr_cur_search_to_nth_level_func(i,l,t,m,lm,c,a,fi,li,mtr)
#else /* BTR_CUR_HASH_ADAPT */
# define btr_cur_search_to_nth_level(i,l,t,m,lm,c,a,fi,li,mtr) \
btr_cur_search_to_nth_level_func(i,l,t,m,lm,c,fi,li,mtr)
#endif /* BTR_CUR_HASH_ADAPT */
/*****************************************************************//** /*****************************************************************//**
Opens a cursor at either end of an index. Opens a cursor at either end of an index.
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -136,20 +136,25 @@ btr_pcur_open_with_no_init_func( ...@@ -136,20 +136,25 @@ btr_pcur_open_with_no_init_func(
may end up on the previous page of the may end up on the previous page of the
record! */ record! */
ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ...; ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ...;
NOTE that if has_search_latch != 0 then NOTE that if ahi_latch then we might not
we maybe do not acquire a latch on the cursor acquire a cursor page latch, but assume
page, but assume that the caller uses his that the ahi_latch protects the record! */
btr search latch to protect the record! */
btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */ btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */
ulint has_search_latch, #ifdef BTR_CUR_HASH_ADAPT
/*!< in: latch mode the caller rw_lock_t* ahi_latch,
currently has on search system: /*!< in: adaptive hash index latch held
RW_S_LATCH, or 0 */ by the caller, or NULL if none */
#endif /* BTR_CUR_HASH_ADAPT */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
unsigned line, /*!< in: line where called */ unsigned line, /*!< in: line where called */
mtr_t* mtr); /*!< in: mtr */ mtr_t* mtr); /*!< in: mtr */
#define btr_pcur_open_with_no_init(ix,t,md,l,cur,has,m) \ #ifdef BTR_CUR_HASH_ADAPT
btr_pcur_open_with_no_init_func(ix,t,md,l,cur,has,__FILE__,__LINE__,m) # define btr_pcur_open_with_no_init(ix,t,md,l,cur,ahi,m) \
btr_pcur_open_with_no_init_func(ix,t,md,l,cur,ahi,__FILE__,__LINE__,m)
#else /* BTR_CUR_HASH_ADAPT */
# define btr_pcur_open_with_no_init(ix,t,md,l,cur,ahi,m) \
btr_pcur_open_with_no_init_func(ix,t,md,l,cur,__FILE__,__LINE__,m)
#endif /* BTR_CUR_HASH_ADAPT */
/*****************************************************************//** /*****************************************************************//**
Opens a persistent cursor at either end of an index. */ Opens a persistent cursor at either end of an index. */
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2015, 2017, MariaDB Corporation. Copyright (c) 2015, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -454,9 +454,12 @@ btr_pcur_open_low( ...@@ -454,9 +454,12 @@ btr_pcur_open_low(
ut_ad(!dict_index_is_spatial(index)); ut_ad(!dict_index_is_spatial(index));
err = btr_cur_search_to_nth_level( err = btr_cur_search_to_nth_level_func(
index, level, tuple, mode, latch_mode, index, level, tuple, mode, latch_mode, btr_cursor,
btr_cursor, 0, file, line, mtr, autoinc); #ifdef BTR_CUR_HASH_ADAPT
NULL,
#endif /* BTR_CUR_HASH_ADAPT */
file, line, mtr, autoinc);
if (err != DB_SUCCESS) { if (err != DB_SUCCESS) {
ib::warn() << " Error code: " << err ib::warn() << " Error code: " << err
...@@ -491,15 +494,15 @@ btr_pcur_open_with_no_init_func( ...@@ -491,15 +494,15 @@ btr_pcur_open_with_no_init_func(
may end up on the previous page of the may end up on the previous page of the
record! */ record! */
ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ...; ulint latch_mode,/*!< in: BTR_SEARCH_LEAF, ...;
NOTE that if has_search_latch != 0 then NOTE that if ahi_latch then we might not
we maybe do not acquire a latch on the cursor acquire a cursor page latch, but assume
page, but assume that the caller uses his that the ahi_latch protects the record! */
btr search latch to protect the record! */
btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */ btr_pcur_t* cursor, /*!< in: memory buffer for persistent cursor */
ulint has_search_latch, #ifdef BTR_CUR_HASH_ADAPT
/*!< in: latch mode the caller rw_lock_t* ahi_latch,
currently has on search system: /*!< in: adaptive hash index latch held
RW_S_LATCH, or 0 */ by the caller, or NULL if none */
#endif /* BTR_CUR_HASH_ADAPT */
const char* file, /*!< in: file name */ const char* file, /*!< in: file name */
unsigned line, /*!< in: line where called */ unsigned line, /*!< in: line where called */
mtr_t* mtr) /*!< in: mtr */ mtr_t* mtr) /*!< in: mtr */
...@@ -514,9 +517,12 @@ btr_pcur_open_with_no_init_func( ...@@ -514,9 +517,12 @@ btr_pcur_open_with_no_init_func(
btr_cursor = btr_pcur_get_btr_cur(cursor); btr_cursor = btr_pcur_get_btr_cur(cursor);
err = btr_cur_search_to_nth_level( err = btr_cur_search_to_nth_level_func(
index, 0, tuple, mode, latch_mode, btr_cursor, index, 0, tuple, mode, latch_mode, btr_cursor,
has_search_latch, file, line, mtr); #ifdef BTR_CUR_HASH_ADAPT
ahi_latch,
#endif /* BTR_CUR_HASH_ADAPT */
file, line, mtr);
cursor->pos_state = BTR_PCUR_IS_POSITIONED; cursor->pos_state = BTR_PCUR_IS_POSITIONED;
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2016, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2017, MariaDB Corporation. Copyright (c) 2017, 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -91,12 +91,11 @@ both have sensible values. ...@@ -91,12 +91,11 @@ both have sensible values.
we assume the caller uses his search latch we assume the caller uses his search latch
to protect the record! to protect the record!
@param[out] cursor tree cursor @param[out] cursor tree cursor
@param[in] has_search_latch @param[in] ahi_latch the adaptive hash index latch being held,
latch mode the caller currently has on or NULL
search system: RW_S/X_LATCH or 0
@param[in] mtr mini transaction @param[in] mtr mini transaction
@return TRUE if succeeded */ @return whether the search succeeded */
ibool bool
btr_search_guess_on_hash( btr_search_guess_on_hash(
dict_index_t* index, dict_index_t* index,
btr_search_t* info, btr_search_t* info,
...@@ -104,7 +103,7 @@ btr_search_guess_on_hash( ...@@ -104,7 +103,7 @@ btr_search_guess_on_hash(
ulint mode, ulint mode,
ulint latch_mode, ulint latch_mode,
btr_cur_t* cursor, btr_cur_t* cursor,
ulint has_search_latch, rw_lock_t* ahi_latch,
mtr_t* mtr); mtr_t* mtr);
/** Move or delete hash entries for moved records, usually in a page split. /** Move or delete hash entries for moved records, usually in a page split.
...@@ -140,17 +139,19 @@ btr_search_drop_page_hash_when_freed( ...@@ -140,17 +139,19 @@ btr_search_drop_page_hash_when_freed(
/** Updates the page hash index when a single record is inserted on a page. /** Updates the page hash index when a single record is inserted on a page.
@param[in] cursor cursor which was positioned to the place to insert @param[in] cursor cursor which was positioned to the place to insert
using btr_cur_search_, and the new record has been using btr_cur_search_, and the new record has been
inserted next to the cursor. */ inserted next to the cursor.
@param[in] ahi_latch the adaptive hash index latch */
void void
btr_search_update_hash_node_on_insert(btr_cur_t* cursor); btr_search_update_hash_node_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch);
/** Updates the page hash index when a single record is inserted on a page. /** Updates the page hash index when a single record is inserted on a page.
@param[in] cursor cursor which was positioned to the @param[in,out] cursor cursor which was positioned to the
place to insert using btr_cur_search_..., place to insert using btr_cur_search_...,
and the new record has been inserted next and the new record has been inserted next
to the cursor */ to the cursor
@param[in] ahi_latch the adaptive hash index latch */
void void
btr_search_update_hash_on_insert(btr_cur_t* cursor); btr_search_update_hash_on_insert(btr_cur_t* cursor, rw_lock_t* ahi_latch);
/** Updates the page hash index when a single record is deleted from a page. /** Updates the page hash index when a single record is deleted from a page.
@param[in] cursor cursor which was positioned on the record to delete @param[in] cursor cursor which was positioned on the record to delete
...@@ -163,18 +164,6 @@ btr_search_update_hash_on_delete(btr_cur_t* cursor); ...@@ -163,18 +164,6 @@ btr_search_update_hash_on_delete(btr_cur_t* cursor);
bool bool
btr_search_validate(); btr_search_validate();
/** X-Lock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_x_lock(const dict_index_t* index);
/** X-Unlock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_x_unlock(const dict_index_t* index);
/** Lock all search latches in exclusive mode. */ /** Lock all search latches in exclusive mode. */
UNIV_INLINE UNIV_INLINE
void void
...@@ -185,18 +174,6 @@ UNIV_INLINE ...@@ -185,18 +174,6 @@ UNIV_INLINE
void void
btr_search_x_unlock_all(); btr_search_x_unlock_all();
/** S-Lock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_s_lock(const dict_index_t* index);
/** S-Unlock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_s_unlock(const dict_index_t* index);
/** Lock all search latches in shared mode. */ /** Lock all search latches in shared mode. */
UNIV_INLINE UNIV_INLINE
void void
...@@ -243,15 +220,11 @@ btr_get_search_table(const dict_index_t* index); ...@@ -243,15 +220,11 @@ btr_get_search_table(const dict_index_t* index);
#else /* BTR_CUR_HASH_ADAPT */ #else /* BTR_CUR_HASH_ADAPT */
# define btr_search_sys_create(size) # define btr_search_sys_create(size)
# define btr_search_drop_page_hash_index(block) # define btr_search_drop_page_hash_index(block)
# define btr_search_s_lock(index)
# define btr_search_s_unlock(index)
# define btr_search_s_lock_all(index) # define btr_search_s_lock_all(index)
# define btr_search_s_unlock_all(index) # define btr_search_s_unlock_all(index)
# define btr_search_x_lock(index)
# define btr_search_x_unlock(index)
# define btr_search_info_update(index, cursor) # define btr_search_info_update(index, cursor)
# define btr_search_move_or_delete_hash_entries(new_block, block) # define btr_search_move_or_delete_hash_entries(new_block, block)
# define btr_search_update_hash_on_insert(cursor) # define btr_search_update_hash_on_insert(cursor, ahi_latch)
# define btr_search_update_hash_on_delete(cursor) # define btr_search_update_hash_on_delete(cursor)
# define btr_search_sys_resize(hash_size) # define btr_search_sys_resize(hash_size)
#endif /* BTR_CUR_HASH_ADAPT */ #endif /* BTR_CUR_HASH_ADAPT */
......
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2015, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2018, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -45,13 +46,11 @@ btr_search_info_create(mem_heap_t* heap) ...@@ -45,13 +46,11 @@ btr_search_info_create(mem_heap_t* heap)
} }
#ifdef BTR_CUR_HASH_ADAPT #ifdef BTR_CUR_HASH_ADAPT
/*********************************************************************//** /** Updates the search info.
Updates the search info. */ @param[in,out] info search info
@param[in,out] cursor cursor which was just positioned */
void void
btr_search_info_update_slow( btr_search_info_update_slow(btr_search_t* info, btr_cur_t* cursor);
/*========================*/
btr_search_t* info, /*!< in/out: search info */
btr_cur_t* cursor);/*!< in: cursor which was just positioned */
/*********************************************************************//** /*********************************************************************//**
Updates the search info. */ Updates the search info. */
...@@ -87,24 +86,6 @@ btr_search_info_update( ...@@ -87,24 +86,6 @@ btr_search_info_update(
btr_search_info_update_slow(info, cursor); btr_search_info_update_slow(info, cursor);
} }
/** X-Lock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_x_lock(const dict_index_t* index)
{
rw_lock_x_lock(btr_get_search_latch(index));
}
/** X-Unlock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_x_unlock(const dict_index_t* index)
{
rw_lock_x_unlock(btr_get_search_latch(index));
}
/** Lock all search latches in exclusive mode. */ /** Lock all search latches in exclusive mode. */
UNIV_INLINE UNIV_INLINE
void void
...@@ -125,24 +106,6 @@ btr_search_x_unlock_all() ...@@ -125,24 +106,6 @@ btr_search_x_unlock_all()
} }
} }
/** S-Lock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_s_lock(const dict_index_t* index)
{
rw_lock_s_lock(btr_get_search_latch(index));
}
/** S-Unlock the search latch (corresponding to given index)
@param[in] index index handler */
UNIV_INLINE
void
btr_search_s_unlock(const dict_index_t* index)
{
rw_lock_s_unlock(btr_get_search_latch(index));
}
/** Lock all search latches in shared mode. */ /** Lock all search latches in shared mode. */
UNIV_INLINE UNIV_INLINE
void void
......
...@@ -1272,24 +1272,19 @@ static ...@@ -1272,24 +1272,19 @@ static
void void
row_sel_open_pcur( row_sel_open_pcur(
/*==============*/ /*==============*/
plan_t* plan, /*!< in: table plan */ plan_t* plan, /*!< in: table plan */
ibool search_latch_locked, #ifdef BTR_CUR_HASH_ADAPT
/*!< in: TRUE if the thread currently rw_lock_t* ahi_latch,
has the search latch locked in /*!< in: the adaptive hash index latch */
s-mode */ #endif /* BTR_CUR_HASH_ADAPT */
mtr_t* mtr) /*!< in: mtr */ mtr_t* mtr) /*!< in/out: mini-transaction */
{ {
dict_index_t* index; dict_index_t* index;
func_node_t* cond; func_node_t* cond;
que_node_t* exp; que_node_t* exp;
ulint n_fields; ulint n_fields;
ulint has_search_latch = 0; /* RW_S_LATCH or 0 */
ulint i; ulint i;
if (search_latch_locked) {
has_search_latch = RW_S_LATCH;
}
index = plan->index; index = plan->index;
/* Calculate the value of the search tuple: the exact match columns /* Calculate the value of the search tuple: the exact match columns
...@@ -1325,7 +1320,7 @@ row_sel_open_pcur( ...@@ -1325,7 +1320,7 @@ row_sel_open_pcur(
btr_pcur_open_with_no_init(index, plan->tuple, plan->mode, btr_pcur_open_with_no_init(index, plan->tuple, plan->mode,
BTR_SEARCH_LEAF, &plan->pcur, BTR_SEARCH_LEAF, &plan->pcur,
has_search_latch, mtr); ahi_latch, mtr);
} else { } else {
/* Open the cursor to the start or the end of the index /* Open the cursor to the start or the end of the index
(FALSE: no init) */ (FALSE: no init) */
...@@ -1473,7 +1468,7 @@ row_sel_try_search_shortcut( ...@@ -1473,7 +1468,7 @@ row_sel_try_search_shortcut(
rw_lock_t* ahi_latch = btr_get_search_latch(index); rw_lock_t* ahi_latch = btr_get_search_latch(index);
rw_lock_s_lock(ahi_latch); rw_lock_s_lock(ahi_latch);
row_sel_open_pcur(plan, TRUE, mtr); row_sel_open_pcur(plan, ahi_latch, mtr);
const rec_t* rec = btr_pcur_get_rec(&(plan->pcur)); const rec_t* rec = btr_pcur_get_rec(&(plan->pcur));
...@@ -1659,8 +1654,11 @@ row_sel( ...@@ -1659,8 +1654,11 @@ row_sel(
if (!plan->pcur_is_open) { if (!plan->pcur_is_open) {
/* Evaluate the expressions to build the search tuple and /* Evaluate the expressions to build the search tuple and
open the cursor */ open the cursor */
row_sel_open_pcur(plan,
row_sel_open_pcur(plan, FALSE, &mtr); #ifdef BTR_CUR_HASH_ADAPT
NULL,
#endif /* BTR_CUR_HASH_ADAPT */
&mtr);
cursor_just_opened = TRUE; cursor_just_opened = TRUE;
...@@ -3841,7 +3839,7 @@ row_sel_try_search_shortcut_for_mysql( ...@@ -3841,7 +3839,7 @@ row_sel_try_search_shortcut_for_mysql(
rw_lock_t* ahi_latch = btr_get_search_latch(index); rw_lock_t* ahi_latch = btr_get_search_latch(index);
rw_lock_s_lock(ahi_latch); rw_lock_s_lock(ahi_latch);
btr_pcur_open_with_no_init(index, search_tuple, PAGE_CUR_GE, btr_pcur_open_with_no_init(index, search_tuple, PAGE_CUR_GE,
BTR_SEARCH_LEAF, pcur, RW_S_LATCH, mtr); BTR_SEARCH_LEAF, pcur, ahi_latch, mtr);
rec = btr_pcur_get_rec(pcur); rec = btr_pcur_get_rec(pcur);
if (!page_rec_is_user_rec(rec) || rec_is_default_row(rec, index)) { if (!page_rec_is_user_rec(rec) || rec_is_default_row(rec, index)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment