Skip to content
Permalink
Browse files
Merge 10.3 into 10.4
  • Loading branch information
dr-m committed Sep 9, 2020
2 parents 9b68847 + 7e07e38 commit 66ae50a
Show file tree
Hide file tree
Showing 16 changed files with 257 additions and 162 deletions.
@@ -740,6 +740,17 @@ t2 CREATE TABLE `t2` (
CREATE TABLE t2 (f1 INT NOT NULL)ENGINE=InnoDB;
ERROR 42S01: Table 't2' already exists
DROP TABLE t2, t1;
#
# MDEV-23685 SIGSEGV on ADD FOREIGN KEY after failed attempt
# to create unique key on virtual column
#
CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b INT AS (a)) ENGINE=InnODB;
INSERT INTO t1 (pk,a) VALUES (1,10),(2,10);
ALTER TABLE t1 ADD UNIQUE INDEX ind9 (b), LOCK=SHARED;
ERROR 23000: Duplicate entry '10' for key 'ind9'
SET FOREIGN_KEY_CHECKS= 0;
ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (pk);
DROP TABLE t1;
# End of 10.2 tests
CREATE TABLE t1 (a GEOMETRY, INDEX(a(8)),
FOREIGN KEY (a) REFERENCES x (xx)) ENGINE=InnoDB;
@@ -720,6 +720,19 @@ SHOW CREATE TABLE t2;
CREATE TABLE t2 (f1 INT NOT NULL)ENGINE=InnoDB;
DROP TABLE t2, t1;

--echo #
--echo # MDEV-23685 SIGSEGV on ADD FOREIGN KEY after failed attempt
--echo # to create unique key on virtual column
--echo #
CREATE TABLE t1 (pk INT PRIMARY KEY, a INT, b INT AS (a)) ENGINE=InnODB;

INSERT INTO t1 (pk,a) VALUES (1,10),(2,10);
--error ER_DUP_ENTRY
ALTER TABLE t1 ADD UNIQUE INDEX ind9 (b), LOCK=SHARED;
SET FOREIGN_KEY_CHECKS= 0;
ALTER TABLE t1 ADD FOREIGN KEY (a) REFERENCES t1 (pk);
DROP TABLE t1;

--echo # End of 10.2 tests

# MDEV-21792 Server aborts upon attempt to create foreign key on spatial field
@@ -1087,8 +1087,7 @@ btr_create(
if (UNIV_UNLIKELY(type & DICT_IBUF)) {
/* Allocate first the ibuf header page */
buf_block_t* ibuf_hdr_block = fseg_create(
space, 0,
IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr);
space, IBUF_HEADER + IBUF_TREE_SEG_HEADER, mtr);

if (ibuf_hdr_block == NULL) {
return(FIL_NULL);
@@ -1118,7 +1117,7 @@ btr_create(

flst_init(block, PAGE_HEADER + PAGE_BTR_IBUF_FREE_LIST, mtr);
} else {
block = fseg_create(space, 0,
block = fseg_create(space,
PAGE_HEADER + PAGE_BTR_SEG_TOP, mtr);

if (block == NULL) {
@@ -1127,8 +1126,9 @@ btr_create(

buf_block_dbg_add_level(block, SYNC_TREE_NODE_NEW);

if (!fseg_create(space, block->page.id.page_no(),
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr)) {
if (!fseg_create(space,
PAGE_HEADER + PAGE_BTR_SEG_LEAF, mtr,
false, block)) {
/* Not enough space for new segment, free root
segment before return. */
btr_free_root(block, mtr,
@@ -5588,14 +5588,13 @@ buf_page_create(
{
buf_frame_t* frame;
buf_block_t* block;
buf_block_t* free_block = NULL;
buf_pool_t* buf_pool = buf_pool_get(page_id);
rw_lock_t* hash_lock;

ut_ad(mtr->is_active());
ut_ad(page_id.space() != 0 || !zip_size);

free_block = buf_LRU_get_free_block(buf_pool);
loop:
buf_block_t *free_block = buf_LRU_get_free_block(buf_pool);

buf_pool_mutex_enter(buf_pool);

@@ -5604,54 +5603,99 @@ buf_page_create(

block = (buf_block_t*) buf_page_hash_get_low(buf_pool, page_id);

if (block
if (UNIV_LIKELY_NULL(block)
&& buf_page_in_file(&block->page)
&& !buf_pool_watch_is_sentinel(buf_pool, &block->page)) {
ut_d(block->page.file_page_was_freed = FALSE);

#ifdef BTR_CUR_HASH_ADAPT
bool drop_hash_entry =
(block->page.state == BUF_BLOCK_FILE_PAGE
&& block->index);

if (drop_hash_entry) {
/* Avoid a hang if I/O is going on. Release
the buffer pool mutex and page hash lock
and wait for I/O to complete */
while (buf_block_get_io_fix(block) != BUF_IO_NONE) {
block->fix();
const dict_index_t *drop_hash_entry= nullptr;
#endif
switch (const auto page_state= buf_block_get_state(block)) {
default:
ut_ad(0);
break;
case BUF_BLOCK_ZIP_PAGE:
case BUF_BLOCK_ZIP_DIRTY:
buf_block_init_low(free_block);
mutex_enter(&buf_pool->zip_mutex);

buf_page_mutex_enter(free_block);
if (buf_page_get_io_fix(&block->page) != BUF_IO_NONE) {
mutex_exit(&buf_pool->zip_mutex);
rw_lock_x_unlock(hash_lock);
buf_LRU_block_free_non_file_page(free_block);
buf_pool_mutex_exit(buf_pool);
buf_page_mutex_exit(free_block);

goto loop;
}

rw_lock_x_lock(&free_block->lock);

buf_relocate(&block->page, &free_block->page);
if (page_state == BUF_BLOCK_ZIP_DIRTY) {
ut_ad(block->page.in_flush_list);
ut_ad(block->page.oldest_modification > 0);
buf_flush_relocate_on_flush_list(
&block->page, &free_block->page);
} else {
ut_ad(block->page.oldest_modification == 0);
ut_ad(!block->page.in_flush_list);
#ifdef UNIV_DEBUG
UT_LIST_REMOVE(
buf_pool->zip_clean, &block->page);
#endif
}

free_block->page.state = BUF_BLOCK_FILE_PAGE;
mutex_exit(&buf_pool->zip_mutex);
free_block->lock_hash_val = lock_rec_hash(
page_id.space(), page_id.page_no());
buf_unzip_LRU_add_block(free_block, false);
buf_page_free_descriptor(&block->page);
block = free_block;
buf_block_buf_fix_inc(block, __FILE__, __LINE__);
buf_page_mutex_exit(free_block);
free_block = nullptr;
break;
case BUF_BLOCK_FILE_PAGE:
buf_block_buf_fix_inc(block, __FILE__, __LINE__);
const uint32_t num_fix_count= mtr->get_fix_count(block)
+ 1;
while (buf_block_get_io_fix(block) != BUF_IO_NONE
|| (num_fix_count
!= block->page.buf_fix_count)) {
buf_pool_mutex_exit(buf_pool);
rw_lock_x_unlock(hash_lock);

os_thread_yield();

buf_pool_mutex_enter(buf_pool);
rw_lock_x_lock(hash_lock);
block->unfix();
}

rw_lock_x_lock(&block->lock);
}
#ifdef BTR_CUR_HASH_ADAPT
drop_hash_entry = block->index;
#endif
break;
}
/* Page can be found in buf_pool */
buf_pool_mutex_exit(buf_pool);
rw_lock_x_unlock(hash_lock);

buf_block_free(free_block);
if (free_block) {
buf_block_free(free_block);
}

#ifdef BTR_CUR_HASH_ADAPT
if (drop_hash_entry) {
if (UNIV_LIKELY_NULL(drop_hash_entry)) {
btr_search_drop_page_hash_index(block);
rw_lock_x_unlock(&block->lock);
}
#endif /* BTR_CUR_HASH_ADAPT */

if (!recv_recovery_is_on()) {
return buf_page_get_with_no_latch(page_id, zip_size,
mtr);
}
mtr_memo_push(mtr, block, MTR_MEMO_PAGE_X_FIX);

mutex_exit(&recv_sys.mutex);
block = buf_page_get_with_no_latch(page_id, zip_size, mtr);
mutex_enter(&recv_sys.mutex);
return block;
}

@@ -5666,6 +5710,8 @@ buf_page_create(

buf_page_init(buf_pool, page_id, zip_size, block);

rw_lock_x_lock(&block->lock);

rw_lock_x_unlock(hash_lock);

/* The block must be put to the LRU list */
@@ -5683,7 +5729,6 @@ buf_page_create(
by IO-fixing and X-latching the block. */

buf_page_set_io_fix(&block->page, BUF_IO_READ);
rw_lock_x_lock(&block->lock);

buf_page_mutex_exit(block);
/* buf_pool->mutex may be released and reacquired by
@@ -5705,12 +5750,11 @@ buf_page_create(
buf_unzip_LRU_add_block(block, FALSE);

buf_page_set_io_fix(&block->page, BUF_IO_NONE);
rw_lock_x_unlock(&block->lock);
}

buf_pool_mutex_exit(buf_pool);

mtr_memo_push(mtr, block, MTR_MEMO_BUF_FIX);
mtr_memo_push(mtr, block, MTR_MEMO_PAGE_X_FIX);

buf_page_set_accessed(&block->page);

@@ -170,6 +170,7 @@ buf_dblwr_create()
{
buf_block_t* block2;
buf_block_t* new_block;
buf_block_t* trx_sys_block;
byte* doublewrite;
byte* fseg_header;
ulint page_no;
@@ -205,9 +206,12 @@ buf_dblwr_create()
}
}

block2 = fseg_create(fil_system.sys_space, TRX_SYS_PAGE_NO,
TRX_SYS_DOUBLEWRITE
+ TRX_SYS_DOUBLEWRITE_FSEG, &mtr);
trx_sys_block = buf_page_get(page_id_t(TRX_SYS_SPACE, TRX_SYS_PAGE_NO),
0, RW_X_LATCH, &mtr);

block2 = fseg_create(fil_system.sys_space,
TRX_SYS_DOUBLEWRITE + TRX_SYS_DOUBLEWRITE_FSEG,
&mtr, false, trx_sys_block);

if (block2 == NULL) {
too_small:
@@ -1,7 +1,7 @@
/*****************************************************************************
Copyright (c) 1996, 2017, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2016, 2019, MariaDB Corporation.
Copyright (c) 2016, 2020, MariaDB Corporation.
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
@@ -142,7 +142,7 @@ dict_hdr_create(

/* Create the dictionary header file block in a new, allocated file
segment in the system tablespace */
block = fseg_create(fil_system.sys_space, 0,
block = fseg_create(fil_system.sys_space,
DICT_HDR + DICT_HDR_FSEG_HEADER, mtr);

ut_a(DICT_HDR_PAGE_NO == block->page.id.page_no());
@@ -6047,7 +6047,11 @@ dict_foreign_qualify_index(
return(false);
}

if (index->type & (DICT_SPATIAL | DICT_FTS)) {
if (index->type & (DICT_SPATIAL | DICT_FTS | DICT_CORRUPT)) {
return false;
}

if (index->online_status >= ONLINE_INDEX_ABORTED) {
return false;
}

0 comments on commit 66ae50a

Please sign in to comment.