summaryrefslogtreecommitdiff
path: root/innobase/btr
diff options
context:
space:
mode:
authorunknown <aivanov@mysql.com>2006-01-31 21:41:48 +0300
committerunknown <aivanov@mysql.com>2006-01-31 21:41:48 +0300
commit6a9a96dc61613ba16e7f87e3681709c2f0e8f580 (patch)
tree9e475e84c7ce72ff8bc4402d9ee012a703984545 /innobase/btr
parent107ad3a03e2b76da117bc05624e807d9936fe73f (diff)
downloadmariadb-git-6a9a96dc61613ba16e7f87e3681709c2f0e8f580.tar.gz
Fixed: BUG#15653, BUG#16157, BUG#16229, BUG#16298, BUG#16387, BUG#16582.
Applied innodb-5.0-ss149/162 snapshots. innobase/btr/btr0sea.c: Applied innodb-5.0-149/162 snapshots. Account for a race condition when dropping the adaptive hash index for a B-tree page (Bug #16582). btr_search_drop_page_hash_index(): Retry the operation if a hash index with different parameters was built meanwhile. Add diagnostics for the case that hash node pointers to the page remain. This fix is from Heikki. btr_search_info-update_hash(), btr_search_info_update_slow(): Document the parameter "info" as in/out. innobase/dict/dict0dict.c: Applied innodb-5.0-149/162 snapshots. Do not mistake TABLENAME_ibfk_0 for auto generated id (Bug #16387). dict_table_get_highest_foreign_id(): Ignore foreign constraint identifiers starting with the pattern TABLENAME_ibfk_0. innobase/dict/dict0load.c: Applied innodb-5.0-149/162 snapshots. dict_load_columns(): Set the charset-collation code DATA_MYSQL_BINARY_CHARSET_COLL for those binary string columns that lack a charset-collation code, i.e., the tables were created with an older version of MySQL/InnoDB than 4.1.2 (Bug #16298). innobase/fil/fil0fil.c: Applied innodb-5.0-149/162 snapshots. Keep track on unflushed modifications to file spaces. When there are tens of thousands of file spaces, flushing all files in fil_flush_file_spaces() would be very slow (Bug #15653). fil_flush_file_spaces(): Only flush unflushed file spaces. fil_space_t, fil_system_t: Add a list of unflushed spaces. innobase/include/univ.i: Applied innodb-5.0-149/162 snapshots. Avoid breaking --with-debug builds on QNS and other systems whose compiler pretends to be GCC 2. Outside __WIN__ define UNIV_INLINE as static inline. innobase/os/os0sync.c: Applied innodb-5.0-149/162 snapshots. Replace goto in os_event_wait with a normal loop. innobase/srv/srv0start.c: Applied innodb-5.0-149/162 snapshots. Fix bug #16157, a crash when innodb_log_group_home_dir is set to an empty string. This patch is from Heikki. mysql-test/r/innodb.result: Applied innodb-5.0-149/162 snapshots. Fixed results for added test cases. mysql-test/t/innodb.test: Applied innodb-5.0-149/162 snapshots. Added test cases. sql/ha_innodb.cc: Applied innodb-5.0-149/162 snapshots. Remove some declarations of unused global variables and member variables of class ha_innobase. Added diagnostic code trx_print() to innobase_query_caching_of_table_permitted() to find reason why we are holding adaptive search latch. Fixed bug #16229 MySQL/InnoDB uses full explicit table locks in trigger processing. Take a InnoDB table lock only if user has explicitly requested a table lock. Added some additional comments to store_lock() and external_lock(). Fixed some code style errors. Remember to use noninlined versions of the functions on ha_innodb.cc ! sql/ha_innodb.h: Applied innodb-5.0-149/162 snapshots. Remove some declarations of unused global variables and member variables of class ha_innobase.
Diffstat (limited to 'innobase/btr')
-rw-r--r--innobase/btr/btr0sea.c44
1 files changed, 39 insertions, 5 deletions
diff --git a/innobase/btr/btr0sea.c b/innobase/btr/btr0sea.c
index 81f23cfa99c..32e22aa51bc 100644
--- a/innobase/btr/btr0sea.c
+++ b/innobase/btr/btr0sea.c
@@ -191,7 +191,7 @@ static
void
btr_search_info_update_hash(
/*========================*/
- btr_search_t* info, /* in: search info */
+ btr_search_t* info, /* in/out: search info */
btr_cur_t* cursor) /* in: cursor which was just positioned */
{
dict_index_t* index;
@@ -452,7 +452,7 @@ Updates the search info. */
void
btr_search_info_update_slow(
/*========================*/
- btr_search_t* info, /* in: search info */
+ btr_search_t* info, /* in/out: search info */
btr_cur_t* cursor) /* in: cursor which was just positioned */
{
buf_block_t* block;
@@ -912,12 +912,12 @@ btr_search_drop_page_hash_index(
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_SHARED));
ut_ad(!rw_lock_own(&btr_search_latch, RW_LOCK_EX));
#endif /* UNIV_SYNC_DEBUG */
-
+retry:
rw_lock_s_lock(&btr_search_latch);
block = buf_block_align(page);
- if (!block->is_hashed) {
+ if (UNIV_LIKELY(!block->is_hashed)) {
rw_lock_s_unlock(&btr_search_latch);
@@ -958,6 +958,8 @@ btr_search_drop_page_hash_index(
tree_id = btr_page_get_index_id(page);
+ ut_a(0 == ut_dulint_cmp(tree_id, index->id));
+
prev_fold = 0;
heap = NULL;
@@ -992,6 +994,26 @@ next_rec:
rw_lock_x_lock(&btr_search_latch);
+ if (UNIV_UNLIKELY(!block->is_hashed)) {
+ /* Someone else has meanwhile dropped the hash index */
+
+ goto cleanup;
+ }
+
+ ut_a(block->index == index);
+
+ if (UNIV_UNLIKELY(block->curr_n_fields != n_fields)
+ || UNIV_UNLIKELY(block->curr_n_bytes != n_bytes)) {
+
+ /* Someone else has meanwhile built a new hash index on the
+ page, with different parameters */
+
+ rw_lock_x_unlock(&btr_search_latch);
+
+ mem_free(folds);
+ goto retry;
+ }
+
for (i = 0; i < n_cached; i++) {
ha_remove_all_nodes_to_page(table, folds[i], page);
@@ -999,8 +1021,20 @@ next_rec:
block->is_hashed = FALSE;
block->index = NULL;
+cleanup:
+ if (UNIV_UNLIKELY(block->n_pointers)) {
+ /* Corruption */
+ ut_print_timestamp(stderr);
+ fprintf(stderr,
+" InnoDB: Corruption of adaptive hash index. After dropping\n"
+"InnoDB: the hash index to a page of %s, still %lu hash nodes remain.\n",
+ index->name, (ulong) block->n_pointers);
+ rw_lock_x_unlock(&btr_search_latch);
- rw_lock_x_unlock(&btr_search_latch);
+ btr_search_validate();
+ } else {
+ rw_lock_x_unlock(&btr_search_latch);
+ }
mem_free(folds);
}