Commit b283fd40 authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.7 into 10.8

parents 95239862 cac6f0a8
...@@ -32,7 +32,7 @@ a ...@@ -32,7 +32,7 @@ a
connection con1; connection con1;
drop table t1; drop table t1;
connection default; connection default;
SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%";
LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME LOCK_MODE LOCK_TYPE TABLE_SCHEMA TABLE_NAME
MDL_SHARED_HIGH_PRIO Table metadata lock test t1 MDL_SHARED_HIGH_PRIO Table metadata lock test t1
MDL_INTENTION_EXCLUSIVE Schema metadata lock test MDL_INTENTION_EXCLUSIVE Schema metadata lock test
......
...@@ -39,7 +39,7 @@ let $wait_condition= ...@@ -39,7 +39,7 @@ let $wait_condition=
select count(*) = 1 from information_schema.processlist select count(*) = 1 from information_schema.processlist
where state = "Waiting for table metadata lock"; where state = "Waiting for table metadata lock";
--source include/wait_condition.inc --source include/wait_condition.inc
SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info; SELECT LOCK_MODE, LOCK_TYPE, TABLE_SCHEMA, TABLE_NAME FROM information_schema.metadata_lock_info where table_name not like "innodb_%";
--error ER_LOCK_DEADLOCK --error ER_LOCK_DEADLOCK
select * from t1; select * from t1;
backup unlock; backup unlock;
......
...@@ -5,6 +5,9 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted"); ...@@ -5,6 +5,9 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\."); call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\.");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'"); call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
call mtr.add_suppression("InnoDB: Failed to read page .* from file '.*'");
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore corruption");
# restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt # restart: --file-key-management-filename=MYSQL_TEST_DIR/std_data/keys2.txt
SET GLOBAL innodb_file_per_table = ON; SET GLOBAL innodb_file_per_table = ON;
create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20; create table t1(a int not null primary key auto_increment, c char(200), b blob, index(b(10))) engine=innodb row_format=compressed encrypted=yes encryption_key_id=20;
......
...@@ -10,6 +10,9 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted"); ...@@ -10,6 +10,9 @@ call mtr.add_suppression("InnoDB: Plugin initialization aborted");
call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\."); call mtr.add_suppression("Plugin 'InnoDB' init function returned error\\.");
call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed."); call mtr.add_suppression("Plugin 'InnoDB' registration as a STORAGE ENGINE failed.");
call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'"); call mtr.add_suppression("InnoDB: Cannot apply log to \\[page id: space=[1-9][0-9]*, page number=0\\] of corrupted file '.*test.t[1-5]\\.ibd'");
call mtr.add_suppression("InnoDB: Failed to read page .* from file '.*'");
call mtr.add_suppression("InnoDB: OPT_PAGE_CHECKSUM mismatch");
call mtr.add_suppression("InnoDB: Set innodb_force_recovery=1 to ignore corruption");
-- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt -- let $restart_parameters=--file-key-management-filename=$MYSQL_TEST_DIR/std_data/keys2.txt
-- source include/restart_mysqld.inc -- source include/restart_mysqld.inc
......
...@@ -515,7 +515,7 @@ class flush_tables_error_handler : public Internal_error_handler ...@@ -515,7 +515,7 @@ class flush_tables_error_handler : public Internal_error_handler
Sql_condition ** cond_hdl) Sql_condition ** cond_hdl)
{ {
*cond_hdl= NULL; *cond_hdl= NULL;
if (sql_errno == ER_OPEN_AS_READONLY) if (sql_errno == ER_OPEN_AS_READONLY || sql_errno == ER_LOCK_WAIT_TIMEOUT)
{ {
handled_errors++; handled_errors++;
return TRUE; return TRUE;
...@@ -600,24 +600,43 @@ bool flush_tables(THD *thd, flush_tables_type flag) ...@@ -600,24 +600,43 @@ bool flush_tables(THD *thd, flush_tables_type flag)
else else
{ {
/* /*
HA_OPEN_FOR_FLUSH is used to allow us to open the table even if No free TABLE instances available. We have to open a new one.
TABLE_SHARE::incompatible_version is set. It also will tell
SEQUENCE engine that we don't have to read the sequence information Try to take a MDL lock to ensure we can open a new table instance.
(which may cause deadlocks with concurrently running ALTER TABLE or If the lock fails, it means that some DDL operation or flush tables
ALTER SEQUENCE) as we will close the table at once. with read lock is ongoing.
In this case we cannot sending the HA_EXTRA_FLUSH signal.
*/ */
if (!open_table_from_share(thd, share, &empty_clex_str,
HA_OPEN_KEYFILE, 0, MDL_request mdl_request;
HA_OPEN_FOR_ALTER | HA_OPEN_FOR_FLUSH, MDL_REQUEST_INIT(&mdl_request, MDL_key::TABLE,
tmp_table, FALSE, share->db.str,
NULL)) share->table_name.str,
MDL_SHARED, MDL_EXPLICIT);
if (!thd->mdl_context.acquire_lock(&mdl_request, 0))
{ {
(void) tmp_table->file->extra(HA_EXTRA_FLUSH);
/* /*
We don't put the table into the TDC as the table was not fully HA_OPEN_FOR_FLUSH is used to allow us to open the table even if
opened (we didn't open triggers) TABLE_SHARE::incompatible_version is set. It also will tell
SEQUENCE engine that we don't have to read the sequence information
(which may cause deadlocks with concurrently running ALTER TABLE or
ALTER SEQUENCE) as we will close the table at once.
*/ */
closefrm(tmp_table); if (!open_table_from_share(thd, share, &empty_clex_str,
HA_OPEN_KEYFILE, 0,
HA_OPEN_FOR_ALTER | HA_OPEN_FOR_FLUSH,
tmp_table, FALSE,
NULL))
{
(void) tmp_table->file->extra(HA_EXTRA_FLUSH);
/*
We don't put the table into the TDC as the table was not fully
opened (we didn't open triggers)
*/
closefrm(tmp_table);
}
thd->mdl_context.release_lock(mdl_request.ticket);
} }
} }
tdc_release_share(share); tdc_release_share(share);
......
...@@ -946,17 +946,13 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p, ...@@ -946,17 +946,13 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p,
(fil_space_t::zip_size(flags), (fil_space_t::zip_size(flags),
page), size); page), size);
if (!space) if (!space)
{ goto release_and_fail;
block->page.lock.x_unlock();
goto fail;
}
space->free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT); space->free_limit= fsp_header_get_field(page, FSP_FREE_LIMIT);
space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page); space->free_len= flst_get_len(FSP_HEADER_OFFSET + FSP_FREE + page);
block->page.lock.x_unlock();
fil_node_t *node= UT_LIST_GET_FIRST(space->chain); fil_node_t *node= UT_LIST_GET_FIRST(space->chain);
node->deferred= true; node->deferred= true;
if (!space->acquire()) if (!space->acquire())
goto fail; goto release_and_fail;
fil_names_dirty(space); fil_names_dirty(space);
const bool is_compressed= fil_space_t::is_compressed(flags); const bool is_compressed= fil_space_t::is_compressed(flags);
#ifdef _WIN32 #ifdef _WIN32
...@@ -973,14 +969,16 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p, ...@@ -973,14 +969,16 @@ bool recv_sys_t::recover_deferred(recv_sys_t::map::iterator &p,
~4095ULL, is_sparse)) ~4095ULL, is_sparse))
{ {
space->release(); space->release();
goto fail; goto release_and_fail;
} }
node->deferred= false; node->deferred= false;
space->release(); space->release();
it->second.space= space; it->second.space= space;
block->page.lock.x_unlock();
return false; return false;
} }
release_and_fail:
block->page.lock.x_unlock(); block->page.lock.x_unlock();
} }
......
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