mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Applying InnoDB snapshot 5.1-ss5488,part 2. Fixes BUG#45749
BUG#45749 - Race condition in SET GLOBAL innodb_commit_concurrency=DEFAULT Detailed revision comments: r5419 | marko | 2009-06-25 16:11:57 +0300 (Thu, 25 Jun 2009) | 18 lines branches/5.1: Merge r5418 from branches/zip: ------------------------------------------------------------------------ r5418 | marko | 2009-06-25 15:55:52 +0300 (Thu, 25 Jun 2009) | 5 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/handler/ha_innodb.cc M /branches/zip/mysql-test/innodb_bug42101-nonzero.result M /branches/zip/mysql-test/innodb_bug42101-nonzero.test M /branches/zip/mysql-test/innodb_bug42101.result M /branches/zip/mysql-test/innodb_bug42101.test branches/zip: Fix a race condition caused by SET GLOBAL innodb_commit_concurrency=DEFAULT. (Bug #45749) When innodb_commit_concurrency is initially set nonzero, DEFAULT would change it back to 0, triggering Bug #42101. rb://139 approved by Heikki Tuuri. ------------------------------------------------------------------------
This commit is contained in:
@ -11,11 +11,15 @@ set global innodb_commit_concurrency=42;
|
|||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
@@innodb_commit_concurrency
|
@@innodb_commit_concurrency
|
||||||
42
|
42
|
||||||
|
set global innodb_commit_concurrency=DEFAULT;
|
||||||
|
select @@innodb_commit_concurrency;
|
||||||
|
@@innodb_commit_concurrency
|
||||||
|
1
|
||||||
set global innodb_commit_concurrency=0;
|
set global innodb_commit_concurrency=0;
|
||||||
ERROR HY000: Incorrect arguments to SET
|
ERROR HY000: Incorrect arguments to SET
|
||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
@@innodb_commit_concurrency
|
@@innodb_commit_concurrency
|
||||||
42
|
1
|
||||||
set global innodb_commit_concurrency=1;
|
set global innodb_commit_concurrency=1;
|
||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
@@innodb_commit_concurrency
|
@@innodb_commit_concurrency
|
||||||
|
@ -16,3 +16,7 @@ set global innodb_commit_concurrency=0;
|
|||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
@@innodb_commit_concurrency
|
@@innodb_commit_concurrency
|
||||||
0
|
0
|
||||||
|
set global innodb_commit_concurrency=DEFAULT;
|
||||||
|
select @@innodb_commit_concurrency;
|
||||||
|
@@innodb_commit_concurrency
|
||||||
|
0
|
||||||
|
@ -12,6 +12,8 @@ set global innodb_commit_concurrency=1;
|
|||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
set global innodb_commit_concurrency=42;
|
set global innodb_commit_concurrency=42;
|
||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
|
set global innodb_commit_concurrency=DEFAULT;
|
||||||
|
select @@innodb_commit_concurrency;
|
||||||
--error ER_WRONG_ARGUMENTS
|
--error ER_WRONG_ARGUMENTS
|
||||||
set global innodb_commit_concurrency=0;
|
set global innodb_commit_concurrency=0;
|
||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
|
@ -15,3 +15,5 @@ set global innodb_commit_concurrency=42;
|
|||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
set global innodb_commit_concurrency=0;
|
set global innodb_commit_concurrency=0;
|
||||||
select @@innodb_commit_concurrency;
|
select @@innodb_commit_concurrency;
|
||||||
|
set global innodb_commit_concurrency=DEFAULT;
|
||||||
|
select @@innodb_commit_concurrency;
|
||||||
|
@ -166,6 +166,20 @@ static handler *innobase_create_handler(handlerton *hton,
|
|||||||
|
|
||||||
static const char innobase_hton_name[]= "InnoDB";
|
static const char innobase_hton_name[]= "InnoDB";
|
||||||
|
|
||||||
|
/** @brief Initialize the default value of innodb_commit_concurrency.
|
||||||
|
|
||||||
|
Once InnoDB is running, the innodb_commit_concurrency must not change
|
||||||
|
from zero to nonzero. (Bug #42101)
|
||||||
|
|
||||||
|
The initial default value is 0, and without this extra initialization,
|
||||||
|
SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter
|
||||||
|
to 0, even if it was initially set to nonzero at the command line
|
||||||
|
or configuration file. */
|
||||||
|
static
|
||||||
|
void
|
||||||
|
innobase_commit_concurrency_init_default(void);
|
||||||
|
/*==========================================*/
|
||||||
|
|
||||||
/*****************************************************************
|
/*****************************************************************
|
||||||
Check for a valid value of innobase_commit_concurrency. */
|
Check for a valid value of innobase_commit_concurrency. */
|
||||||
static
|
static
|
||||||
@ -1775,6 +1789,8 @@ innobase_init(
|
|||||||
(char*)"latin1_swedish_ci"));
|
(char*)"latin1_swedish_ci"));
|
||||||
memcpy(srv_latin1_ordering, my_charset_latin1.sort_order, 256);
|
memcpy(srv_latin1_ordering, my_charset_latin1.sort_order, 256);
|
||||||
|
|
||||||
|
innobase_commit_concurrency_init_default();
|
||||||
|
|
||||||
/* Since we in this module access directly the fields of a trx
|
/* Since we in this module access directly the fields of a trx
|
||||||
struct, and due to different headers and flags it might happen that
|
struct, and due to different headers and flags it might happen that
|
||||||
mutex_t has a different size in this module and in InnoDB
|
mutex_t has a different size in this module and in InnoDB
|
||||||
@ -8464,3 +8480,21 @@ mysql_declare_plugin(innobase)
|
|||||||
NULL /* reserved */
|
NULL /* reserved */
|
||||||
}
|
}
|
||||||
mysql_declare_plugin_end;
|
mysql_declare_plugin_end;
|
||||||
|
|
||||||
|
/** @brief Initialize the default value of innodb_commit_concurrency.
|
||||||
|
|
||||||
|
Once InnoDB is running, the innodb_commit_concurrency must not change
|
||||||
|
from zero to nonzero. (Bug #42101)
|
||||||
|
|
||||||
|
The initial default value is 0, and without this extra initialization,
|
||||||
|
SET GLOBAL innodb_commit_concurrency=DEFAULT would set the parameter
|
||||||
|
to 0, even if it was initially set to nonzero at the command line
|
||||||
|
or configuration file. */
|
||||||
|
static
|
||||||
|
void
|
||||||
|
innobase_commit_concurrency_init_default(void)
|
||||||
|
/*==========================================*/
|
||||||
|
{
|
||||||
|
MYSQL_SYSVAR_NAME(commit_concurrency).def_val
|
||||||
|
= innobase_commit_concurrency;
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user