From 0e4cf497ca11a7298e2bd896cb594bd52085a1d4 Mon Sep 17 00:00:00 2001 From: Daniel Black Date: Thu, 9 Jun 2022 18:27:59 +1000 Subject: [PATCH 1/5] MDEV-28782 mariadb-tzinfo-to-sql to work in bootstrap mode Work around MDEV-28718 for now, but also optimize the interation of information_schema.SYSTEM_VARIABLES. Add test case to show that tzinfo data into bootstrap is desired functionality. Bug report thanks to Dan Lenski of AWS. --- mysql-test/main/bootstrap.result | 6 +++ mysql-test/main/bootstrap.test | 26 ++++++++++++ .../main/mysql_tzinfo_to_sql_symlink.result | 40 +++++++++---------- sql/tztime.cc | 8 ++-- 4 files changed, 56 insertions(+), 24 deletions(-) diff --git a/mysql-test/main/bootstrap.result b/mysql-test/main/bootstrap.result index 96aec014093..f77ff0bc194 100644 --- a/mysql-test/main/bootstrap.result +++ b/mysql-test/main/bootstrap.result @@ -34,4 +34,10 @@ name dl EXAMPLE ha_example.so truncate table mysql.plugin; # Kill the server +# +# MDEV-28782 mariadb-tzinfo-to-sql to work in bootstrap mode +# +# +# End of 10.6 tests +# # restart diff --git a/mysql-test/main/bootstrap.test b/mysql-test/main/bootstrap.test index d75d3154064..e2f882f1d19 100644 --- a/mysql-test/main/bootstrap.test +++ b/mysql-test/main/bootstrap.test @@ -133,4 +133,30 @@ EOF --exec $MYSQLD_BOOTSTRAP_CMD --default-time-zone=Europe/Moscow < $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 --remove_file $MYSQLTEST_VARDIR/tmp/bootstrap_9969.sql +--echo # +--echo # MDEV-28782 mariadb-tzinfo-to-sql to work in bootstrap mode +--echo # + +--write_file $MYSQLTEST_VARDIR/tmp/tz.sql +use test; + +create table time_zone like mysql.time_zone; +create table time_zone_leap_second like mysql.time_zone_leap_second; +create table time_zone_name like mysql.time_zone_name; +create table time_zone_transition like mysql.time_zone_transition; +create table time_zone_transition_type like mysql.time_zone_transition_type; + +EOF +--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog std_data/zoneinfo/GMT GMT 2>/dev/null >> $MYSQLTEST_VARDIR/tmp/tz.sql +--append_file $MYSQLTEST_VARDIR/tmp/tz.sql +DROP TABLE time_zone, time_zone_leap_second, time_zone_name, time_zone_transition, time_zone_transition_type; +EOF +--exec $MYSQLD_BOOTSTRAP_CMD < $MYSQLTEST_VARDIR/tmp/tz.sql >> $MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1 +--remove_file $MYSQLTEST_VARDIR/tmp/tz.sql + +--echo # +--echo # End of 10.6 tests +--echo # + +# restore --source include/start_mysqld.inc diff --git a/mysql-test/main/mysql_tzinfo_to_sql_symlink.result b/mysql-test/main/mysql_tzinfo_to_sql_symlink.result index c87aedcc247..a6be207434f 100644 --- a/mysql-test/main/mysql_tzinfo_to_sql_symlink.result +++ b/mysql-test/main/mysql_tzinfo_to_sql_symlink.result @@ -7,9 +7,9 @@ CREATE TABLE time_zone_leap_second LIKE mysql.time_zone_leap_second; # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above # # Verbose run -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); @@ -56,9 +56,9 @@ execute immediate if(@wsrep_cannot_replicate_tz, concat('ALTER TABLE time_zone_t # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases # # Run on zoneinfo directory -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); @@ -116,9 +116,9 @@ COUNT(*) # # Run on zoneinfo directory --skip-write-binlog # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; @@ -188,9 +188,9 @@ TRUNCATE TABLE time_zone_leap_second; # # Testing with explicit timezonefile # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); @@ -252,9 +252,9 @@ TRUNCATE TABLE time_zone_leap_second; # # Testing with explicit timezonefile --skip-write-binlog # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; @@ -310,9 +310,9 @@ TRUNCATE TABLE time_zone_leap_second; # # Testing --leap # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); @@ -373,9 +373,9 @@ TRUNCATE TABLE time_zone_leap_second; # # Testing --skip-write-binlog --leap # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; @@ -425,9 +425,9 @@ COM_TRUNCATE 1 # # Testing --skip-write-binlog # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; @@ -447,9 +447,9 @@ UNLOCK TABLES; COMMIT; SET SESSION SQL_LOG_BIN=@save_sql_log_bin; execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0'); -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_is_on, 'SET @save_wsrep_on=@@WSREP_ON, WSREP_ON=OFF', 'do 0'); SET @save_sql_log_bin=@@SQL_LOG_BIN; SET SESSION SQL_LOG_BIN=0; @@ -471,9 +471,9 @@ execute immediate if(@wsrep_is_on, 'SET SESSION WSREP_ON=@save_wsrep_on', 'do 0' # # MDEV-6236 - [PATCH] mysql_tzinfo_to_sql may produce invalid SQL # -set @wsrep_is_on=(select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES); +set @wsrep_is_on=(select sum(SESSION_VALUE='ON') from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'); SELECT concat('%', GROUP_CONCAT(OPTION), '%') INTO @replicate_opt FROM (SELECT DISTINCT concat('REPLICATE_', UPPER(ENGINE)) AS OPTION FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME IN ('time_zone', 'time_zone_name', 'time_zone_transition', 'time_zone_transition_type', 'time_zone_leap_second') AND ENGINE in ('MyISAM', 'Aria')) AS o ORDER BY OPTION DESC; -set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES); +set @wsrep_cannot_replicate_tz=@wsrep_is_on AND (select sum(GLOBAL_VALUE NOT LIKE @replicate_opt) from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone'", 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, 'ALTER TABLE time_zone ENGINE=InnoDB', 'do 0'); execute immediate if(@wsrep_cannot_replicate_tz, "select ENGINE into @time_zone_name_engine from information_schema.TABLES where TABLE_SCHEMA=DATABASE() and TABLE_NAME='time_zone_name'", 'do 0'); diff --git a/sql/tztime.cc b/sql/tztime.cc index c9db4eaaef0..4725e26a4c1 100644 --- a/sql/tztime.cc +++ b/sql/tztime.cc @@ -2726,11 +2726,11 @@ static const char *trunc_tables_const= "TRUNCATE TABLE time_zone_transition;\n" "TRUNCATE TABLE time_zone_transition_type;\n"; static const char *wsrep_is_on= - "select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON')" - " from information_schema.SYSTEM_VARIABLES"; + "select sum(SESSION_VALUE='ON')" + " from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'"; static const char *wsrep_cannot_replicate_tz= - "select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt)" - " from information_schema.SYSTEM_VARIABLES"; + "select sum(GLOBAL_VALUE NOT LIKE @replicate_opt)" + " from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'"; int main(int argc, char **argv) From 3b662c6ebd26b54ce534d9e7451cdc31e6c0046c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 21 Jun 2022 14:40:31 +0300 Subject: [PATCH 2/5] MDEV-28782 fixup: ./mtr --embedded --- .../main/mysql_tzinfo_to_sql_symlink.test | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mysql-test/main/mysql_tzinfo_to_sql_symlink.test b/mysql-test/main/mysql_tzinfo_to_sql_symlink.test index 34df1281c38..857f24e610f 100644 --- a/mysql-test/main/mysql_tzinfo_to_sql_symlink.test +++ b/mysql-test/main/mysql_tzinfo_to_sql_symlink.test @@ -3,6 +3,8 @@ --source include/not_windows.inc --source include/no_protocol.inc +let $is_embedded=`select version() like '%embedded%'`; + CREATE TABLE time_zone LIKE mysql.time_zone; CREATE TABLE time_zone_name LIKE mysql.time_zone_name; CREATE TABLE time_zone_transition LIKE mysql.time_zone_transition; @@ -61,6 +63,9 @@ SELECT COUNT(*) FROM time_zone_transition; SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_leap_second; +if ($is_embedded) { +--replace_column 1 0 2 0 +} SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@SQL_LOG_BIN; SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff FROM information_schema.global_status g @@ -95,6 +100,9 @@ SELECT COUNT(*) FROM time_zone_transition; SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_leap_second; +if ($is_embedded) { +--replace_column 1 0 2 0 +} SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@SQL_LOG_BIN; SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff FROM information_schema.global_status g @@ -127,6 +135,9 @@ SELECT COUNT(*) FROM time_zone_transition; SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_leap_second; +if ($is_embedded) { +--replace_column 1 0 2 0 +} SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@SQL_LOG_BIN; SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff FROM information_schema.global_status g @@ -159,6 +170,9 @@ SELECT COUNT(*) FROM time_zone_transition; SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_leap_second; +if ($is_embedded) { +--replace_column 1 0 2 0 +} SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@SQL_LOG_BIN; SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff FROM information_schema.global_status g @@ -191,6 +205,9 @@ SELECT COUNT(*) FROM time_zone_transition; SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_leap_second; +if ($is_embedded) { +--replace_column 1 0 2 0 +} SELECT @wsrep_is_on, @wsrep_cannot_replicate_tz, @save_wsrep_on, @save_sql_log_bin, @@SQL_LOG_BIN; SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff FROM information_schema.global_status g From 55f02c24a679ef9b4350a3d1fd5e0f9a39af25a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 21 Jun 2022 14:40:40 +0300 Subject: [PATCH 3/5] MDEV-28845 fixup: Prevent an infinite loop buf_page_create_low(): Before retrying, release the exclusive page latch in order to prevent an infinite loop in buf_pool_t::corrupted_evict(). --- storage/innobase/buf/buf0buf.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index bec4aa46701..706e36dd8e6 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -3235,6 +3235,7 @@ retry: if (UNIV_UNLIKELY(id != page_id)) { ut_ad(id.is_corrupted()); + bpage->lock.x_unlock(); goto retry; } mysql_mutex_lock(&buf_pool.mutex); From 2e43af69e3e34019374b8d49f2599ec22a8095fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 21 Jun 2022 16:59:21 +0300 Subject: [PATCH 4/5] MDEV-28870 InnoDB: Missing FILE_CREATE, FILE_DELETE or FILE_MODIFY before FILE_CHECKPOINT There was a race condition between log_checkpoint_low() and deleting or renaming data files. The scenario is as follows: 1. The buffer pool does not contain dirty pages. 2. A FILE_DELETE or FILE_RENAME record is written. 3. The checkpoint LSN will be moved ahead of the write of the record. 4. The server is killed before the file is actually renamed or deleted. We will prevent this race condition by ensuring that a log checkpoint cannot occur between the durable write and the file system operation: 1. Durably write the FILE_DELETE or FILE_RENAME record. 2. Perform the file system operation. 3. Allow any log checkpoint to proceed. mtr_t::commit_file(): Implement the DELETE or RENAME logic. fil_delete_tablespace(): Delegate some of the logic to mtr_t::commit_file(). fil_space_t::rename(): Delegate some logic to mtr_t::commit_file(). Remove the debug injection point fil_rename_tablespace_failure_2 because we do test RENAME failures without any debug injection. fil_name_write_rename_low(), fil_name_write_rename(): Remove. Tested by Matthias Leich --- .../suite/innodb/r/innodb-wl5980-debug.result | 27 --- .../suite/innodb/t/innodb-wl5980-debug.test | 52 ---- storage/innobase/fil/fil0fil.cc | 223 +++--------------- storage/innobase/include/mtr0mtr.h | 6 + storage/innobase/mtr/mtr0mtr.cc | 86 +++++++ 5 files changed, 131 insertions(+), 263 deletions(-) delete mode 100644 mysql-test/suite/innodb/r/innodb-wl5980-debug.result delete mode 100644 mysql-test/suite/innodb/t/innodb-wl5980-debug.test diff --git a/mysql-test/suite/innodb/r/innodb-wl5980-debug.result b/mysql-test/suite/innodb/r/innodb-wl5980-debug.result deleted file mode 100644 index 51cff4393aa..00000000000 --- a/mysql-test/suite/innodb/r/innodb-wl5980-debug.result +++ /dev/null @@ -1,27 +0,0 @@ -call mtr.add_suppression("Cannot find space id [0-9]+ in the tablespace memory cache"); -call mtr.add_suppression("Cannot rename table 'test/t1' to 'test/t2' since the dictionary cache already contains 'test/t2'."); -# -# WL5980 Remote tablespace debug error injection tests. -# -CREATE TABLE t1 (a int KEY, b text) ENGINE=Innodb DATA DIRECTORY='MYSQL_TMP_DIR/alt_dir' ; -INSERT INTO t1 VALUES (1, 'tablespace'); -SELECT * FROM t1; -a b -1 tablespace -# -# Test the second injection point in fil_rename_tablespace(). -# Make sure the table is useable after this failure. -# -SET @save_dbug=@@debug_dbug; -SET debug_dbug="+d,fil_rename_tablespace_failure_2"; -RENAME TABLE t1 TO t2; -SET debug_dbug=@save_dbug; -INSERT INTO t1 VALUES (2, 'tablespace'); -SELECT * FROM t1; -a b -1 tablespace -2 tablespace -# -# Cleanup -# -DROP TABLE t1; diff --git a/mysql-test/suite/innodb/t/innodb-wl5980-debug.test b/mysql-test/suite/innodb/t/innodb-wl5980-debug.test deleted file mode 100644 index dbb8ad33676..00000000000 --- a/mysql-test/suite/innodb/t/innodb-wl5980-debug.test +++ /dev/null @@ -1,52 +0,0 @@ -# -# This testcase is to check the various debug injection points -# to make sure error conditions react corectly and acheive -# better code coverage. -# - -# Not supported in embedded ---source include/not_embedded.inc ---source include/have_debug.inc ---source include/have_innodb.inc ---source include/have_symlink.inc - -# These messages are expected in the log -call mtr.add_suppression("Cannot find space id [0-9]+ in the tablespace memory cache"); -call mtr.add_suppression("Cannot rename table 'test/t1' to 'test/t2' since the dictionary cache already contains 'test/t2'."); - -# Set up some variables -LET $MYSQL_DATA_DIR = `select @@datadir`; -LET $data_directory_clause = DATA DIRECTORY='$MYSQL_TMP_DIR/alt_dir'; ---enable_query_log - ---echo # ---echo # WL5980 Remote tablespace debug error injection tests. ---echo # - ---replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR -eval CREATE TABLE t1 (a int KEY, b text) ENGINE=Innodb $data_directory_clause ; -INSERT INTO t1 VALUES (1, 'tablespace'); -SELECT * FROM t1; - ---echo # ---echo # Test the second injection point in fil_rename_tablespace(). ---echo # Make sure the table is useable after this failure. ---echo # -SET @save_dbug=@@debug_dbug; -SET debug_dbug="+d,fil_rename_tablespace_failure_2"; ---disable_result_log ---error ER_ERROR_ON_RENAME -RENAME TABLE t1 TO t2; ---enable_result_log -SET debug_dbug=@save_dbug; -INSERT INTO t1 VALUES (2, 'tablespace'); -SELECT * FROM t1; - ---echo # ---echo # Cleanup ---echo # - -DROP TABLE t1; - ---rmdir $MYSQL_TMP_DIR/alt_dir/test ---rmdir $MYSQL_TMP_DIR/alt_dir diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc index 18f68aa5dd6..316920d3fe3 100644 --- a/storage/innobase/fil/fil0fil.cc +++ b/storage/innobase/fil/fil0fil.cc @@ -128,19 +128,6 @@ bool fil_space_t::try_to_close(bool print_info) return false; } -/** Rename a single-table tablespace. -The tablespace must exist in the memory cache. -@param[in] id tablespace identifier -@param[in] old_path old file name -@param[in] new_path_in new file name, -or NULL if it is located in the normal data directory -@return true if success */ -static bool -fil_rename_tablespace( - ulint id, - const char* old_path, - const char* new_path_in); - /* IMPLEMENTATION OF THE TABLESPACE MEMORY CACHE ============================================= @@ -1523,40 +1510,6 @@ inline void mtr_t::log_file_op(mfile_type_t type, ulint space_id, m_log.push(reinterpret_cast(path), uint32_t(len)); } -/** Write redo log for renaming a file. -@param[in] space_id tablespace id -@param[in] old_name tablespace file name -@param[in] new_name tablespace file name after renaming -@param[in,out] mtr mini-transaction */ -static -void -fil_name_write_rename_low( - ulint space_id, - const char* old_name, - const char* new_name, - mtr_t* mtr) -{ - ut_ad(!is_predefined_tablespace(space_id)); - mtr->log_file_op(FILE_RENAME, space_id, old_name, new_name); -} - -/** Write redo log for renaming a file. -@param[in] space_id tablespace id -@param[in] old_name tablespace file name -@param[in] new_name tablespace file name after renaming */ -static void -fil_name_write_rename( - ulint space_id, - const char* old_name, - const char* new_name) -{ - mtr_t mtr; - mtr.start(); - fil_name_write_rename_low(space_id, old_name, new_name, &mtr); - mtr.commit(); - log_write_up_to(mtr.commit_lsn(), true); -} - /** Write FILE_MODIFY for a file. @param[in] space_id tablespace id @param[in] name tablespace file name @@ -1688,41 +1641,8 @@ pfs_os_file_t fil_delete_tablespace(ulint id) mtr_t mtr; mtr.start(); mtr.log_file_op(FILE_DELETE, id, space->chain.start->name); - mtr.commit(); - log_write_up_to(mtr.commit_lsn(), true); - - /* Remove any additional files. */ - if (char *cfg_name= fil_make_filepath(space->chain.start->name, - fil_space_t::name_type{}, CFG, - false)) - { - os_file_delete_if_exists(innodb_data_file_key, cfg_name, nullptr); - ut_free(cfg_name); - } - if (FSP_FLAGS_HAS_DATA_DIR(space->flags)) - RemoteDatafile::delete_link_file(space->name()); - - /* Remove the directory entry. The file will actually be deleted - when our caller closes the handle. */ - os_file_delete(innodb_data_file_key, space->chain.start->name); - - mysql_mutex_lock(&fil_system.mutex); - /* Sanity checks after reacquiring fil_system.mutex */ - ut_ad(space == fil_space_get_by_id(id)); - ut_ad(!space->referenced()); - ut_ad(space->is_stopping()); - ut_ad(UT_LIST_GET_LEN(space->chain) == 1); - /* Detach the file handle. */ - handle= fil_system.detach(space, true); - mysql_mutex_unlock(&fil_system.mutex); - - mysql_mutex_lock(&log_sys.mutex); - if (space->max_lsn) - { - ut_d(space->max_lsn = 0); - fil_system.named_spaces.remove(*space); - } - mysql_mutex_unlock(&log_sys.mutex); + handle= space->chain.start->handle; + mtr.commit_file(*space, nullptr); fil_space_free_low(space); } @@ -1847,120 +1767,55 @@ char *fil_make_filepath(const char* path, const table_name_t name, dberr_t fil_space_t::rename(const char *path, bool log, bool replace) { ut_ad(UT_LIST_GET_LEN(chain) == 1); - ut_ad(!is_system_tablespace(id)); + ut_ad(!is_predefined_tablespace(id)); const char *old_path= chain.start->name; + ut_ad(strchr(old_path, '/')); + ut_ad(strchr(path, '/')); + if (!strcmp(path, old_path)) return DB_SUCCESS; - if (log) + if (!log) { - bool exists= false; - os_file_type_t ftype; - - if (os_file_status(old_path, &exists, &ftype) && !exists) - { - ib::error() << "Cannot rename '" << old_path << "' to '" << path - << "' because the source file does not exist."; - return DB_TABLESPACE_NOT_FOUND; - } - - exists= false; - if (replace); - else if (!os_file_status(path, &exists, &ftype) || exists) - { - ib::error() << "Cannot rename '" << old_path << "' to '" << path - << "' because the target file exists."; - return DB_TABLESPACE_EXISTS; - } - - fil_name_write_rename(id, old_path, path); + if (!os_file_rename(innodb_data_file_key, old_path, path)) + return DB_ERROR; + mysql_mutex_lock(&fil_system.mutex); + ut_free(chain.start->name); + chain.start->name= mem_strdup(path); + mysql_mutex_unlock(&fil_system.mutex); + return DB_SUCCESS; } - return fil_rename_tablespace(id, old_path, path) ? DB_SUCCESS : DB_ERROR; -} + bool exists= false; + os_file_type_t ftype; -/** Rename a single-table tablespace. -The tablespace must exist in the memory cache. -@param[in] id tablespace identifier -@param[in] old_path old file name -@param[in] new_path_in new file name, -or NULL if it is located in the normal data directory -@return true if success */ -static bool -fil_rename_tablespace( - ulint id, - const char* old_path, - const char* new_path_in) -{ - fil_space_t* space; - fil_node_t* node; - ut_a(id != 0); + /* Check upfront if the rename operation might succeed, because we + must durably write redo log before actually attempting to execute + the rename in the file system. */ + if (os_file_status(old_path, &exists, &ftype) && !exists) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the source file does not exist.", + old_path, path); + return DB_TABLESPACE_NOT_FOUND; + } - mysql_mutex_lock(&fil_system.mutex); + exists= false; + if (replace); + else if (!os_file_status(path, &exists, &ftype) || exists) + { + sql_print_error("InnoDB: Cannot rename '%s' to '%s'" + " because the target file exists.", + old_path, path); + return DB_TABLESPACE_EXISTS; + } - space = fil_space_get_by_id(id); - - if (space == NULL) { - ib::error() << "Cannot find space id " << id - << " in the tablespace memory cache, though the file '" - << old_path - << "' in a rename operation should have that id."; - mysql_mutex_unlock(&fil_system.mutex); - return(false); - } - - /* The following code must change when InnoDB supports - multiple datafiles per tablespace. */ - ut_a(UT_LIST_GET_LEN(space->chain) == 1); - node = UT_LIST_GET_FIRST(space->chain); - space->reacquire(); - - mysql_mutex_unlock(&fil_system.mutex); - - char* new_file_name = mem_strdup(new_path_in); - char* old_file_name = node->name; - - ut_ad(strchr(old_file_name, '/')); - ut_ad(strchr(new_file_name, '/')); - - if (!recv_recovery_is_on()) { - mysql_mutex_lock(&log_sys.mutex); - } - - /* log_sys.mutex is above fil_system.mutex in the latching order */ - mysql_mutex_assert_owner(&log_sys.mutex); - mysql_mutex_lock(&fil_system.mutex); - space->release(); - ut_ad(node->name == old_file_name); - bool success; - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", - goto skip_second_rename; ); - success = os_file_rename(innodb_data_file_key, - old_file_name, - new_file_name); - DBUG_EXECUTE_IF("fil_rename_tablespace_failure_2", -skip_second_rename: - success = false; ); - - ut_ad(node->name == old_file_name); - - if (success) { - node->name = new_file_name; - } else { - old_file_name = new_file_name; - } - - if (!recv_recovery_is_on()) { - mysql_mutex_unlock(&log_sys.mutex); - } - - mysql_mutex_unlock(&fil_system.mutex); - - ut_free(old_file_name); - - return(success); + mtr_t mtr; + mtr.start(); + mtr.log_file_op(FILE_RENAME, id, old_path, path); + return mtr.commit_file(*this, path) ? DB_SUCCESS : DB_ERROR; } /** Create a tablespace file. diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index 8a2f862f47f..8a3fe59ac59 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -102,6 +102,12 @@ struct mtr_t { @param space tablespace that is being shrunk */ ATTRIBUTE_COLD void commit_shrink(fil_space_t &space); + /** Commit a mini-transaction that is deleting or renaming a file. + @param space tablespace that is being renamed or deleted + @param name new file name (nullptr=the file will be deleted) + @return whether the operation succeeded */ + ATTRIBUTE_COLD bool commit_file(fil_space_t &space, const char *name); + /** Commit a mini-transaction that did not modify any pages, but generated some redo log on a higher level, such as FILE_MODIFY records and an optional FILE_CHECKPOINT marker. diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index 4a5b5f7124a..5718daeda0b 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -626,6 +626,92 @@ void mtr_t::commit_shrink(fil_space_t &space) release_resources(); } +/** Commit a mini-transaction that is deleting or renaming a file. +@param space tablespace that is being renamed or deleted +@param name new file name (nullptr=the file will be deleted) +@return whether the operation succeeded */ +bool mtr_t::commit_file(fil_space_t &space, const char *name) +{ + ut_ad(is_active()); + ut_ad(!is_inside_ibuf()); + ut_ad(!high_level_read_only); + ut_ad(m_modifications); + ut_ad(!m_made_dirty); + ut_ad(!recv_recovery_is_on()); + ut_ad(m_log_mode == MTR_LOG_ALL); + ut_ad(UT_LIST_GET_LEN(space.chain) == 1); + + log_write_and_flush_prepare(); + + do_write(); + + mysql_mutex_assert_owner(&log_sys.mutex); + + if (!name && space.max_lsn) + { + ut_d(space.max_lsn= 0); + fil_system.named_spaces.remove(space); + } + + /* Block log_checkpoint(). */ + mysql_mutex_lock(&buf_pool.flush_list_mutex); + + /* Durably write the log for the file system operation. */ + log_write_and_flush(); + + char *old_name= space.chain.start->name; + bool success; + + if (name) + { + success= os_file_rename(innodb_data_file_key, old_name, name); + + if (success) + { + mysql_mutex_lock(&fil_system.mutex); + space.chain.start->name= mem_strdup(name); + mysql_mutex_unlock(&fil_system.mutex); + ut_free(old_name); + } + } + else + { + /* Remove any additional files. */ + if (char *cfg_name= fil_make_filepath(old_name, + fil_space_t::name_type{}, CFG, + false)) + { + os_file_delete_if_exists(innodb_data_file_key, cfg_name, nullptr); + ut_free(cfg_name); + } + + if (FSP_FLAGS_HAS_DATA_DIR(space.flags)) + RemoteDatafile::delete_link_file(space.name()); + + /* Remove the directory entry. The file will actually be deleted + when our caller closes the handle. */ + os_file_delete(innodb_data_file_key, old_name); + + mysql_mutex_lock(&fil_system.mutex); + /* Sanity checks after reacquiring fil_system.mutex */ + ut_ad(&space == fil_space_get_by_id(space.id)); + ut_ad(!space.referenced()); + ut_ad(space.is_stopping()); + + fil_system.detach(&space, true); + mysql_mutex_unlock(&fil_system.mutex); + + success= true; + } + + mysql_mutex_unlock(&buf_pool.flush_list_mutex); + ut_d(m_log.erase()); + release_resources(); + + srv_stats.log_write_requests.inc(); + return success; +} + /** Commit a mini-transaction that did not modify any pages, but generated some redo log on a higher level, such as FILE_MODIFY records and an optional FILE_CHECKPOINT marker. From 37946731110246b89607b85b391f32b0f390524e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Tue, 21 Jun 2022 16:59:49 +0300 Subject: [PATCH 5/5] MDEV-28836: Memory alignment cleanup Table_cache_instance: Define the structure aligned at the CPU cache line, and remove a pad[] data member. Krunal Bauskar reported this to improve performance on ARMv8. aligned_malloc(): Wrapper for the Microsoft _aligned_malloc() and the ISO/IEC 9899:2011 aligned_alloc(). Note: The parameters are in the Microsoft order (size, alignment), opposite of aligned_alloc(alignment, size). Note: The standard defines that size must be an integer multiple of alignment. It is enforced by AddressSanitizer but not by GNU libc on Linux. aligned_free(): Wrapper for the Microsoft _aligned_free() and the standard free(). HAVE_ALIGNED_ALLOC: A new test. Unfortunately, support for aligned_alloc() may still be missing on some platforms. We will fall back to posix_memalign() for those cases. HAVE_MEMALIGN: Remove, along with any use of the nonstandard memalign(). PFS_ALIGNEMENT (sic): Removed; we will use CPU_LEVEL1_DCACHE_LINESIZE. PFS_ALIGNED: Defined using the C++11 keyword alignas. buf_pool_t::page_hash_table::create(), lock_sys_t::hash_table::create(): lock_sys_t::hash_table::resize(): Pad the allocation size to an integer multiple of the alignment. Reviewed by: Vladislav Vaintroub --- cmake/os/WindowsCache.cmake | 2 +- config.h.cmake | 2 +- configure.cmake | 2 +- include/aligned.h | 34 +++++++++++ include/my_global.h | 2 +- mysys/my_lockmem.c | 6 +- sql/table_cache.cc | 11 +++- storage/innobase/buf/buf0buf.cc | 7 ++- storage/innobase/include/buf0buf.h | 21 ------- storage/innobase/include/univ.i | 1 + storage/innobase/include/ut0pool.h | 9 +-- storage/innobase/lock/lock0lock.cc | 14 +++-- storage/perfschema/pfs_digest.cc | 3 +- storage/perfschema/pfs_events_stages.h | 3 +- storage/perfschema/pfs_events_statements.h | 3 +- storage/perfschema/pfs_events_waits.h | 4 +- storage/perfschema/pfs_global.cc | 56 +++---------------- storage/perfschema/pfs_global.h | 23 ++------ storage/perfschema/pfs_host.cc | 3 +- storage/perfschema/pfs_instr.cc | 3 +- storage/perfschema/unittest/stub_pfs_global.h | 16 +----- tpool/tpool_generic.cc | 19 ++----- 22 files changed, 94 insertions(+), 150 deletions(-) create mode 100644 include/aligned.h diff --git a/cmake/os/WindowsCache.cmake b/cmake/os/WindowsCache.cmake index 9b855dbb42b..316b42af796 100644 --- a/cmake/os/WindowsCache.cmake +++ b/cmake/os/WindowsCache.cmake @@ -23,6 +23,7 @@ IF(MSVC) SET(BFD_H_EXISTS 0 CACHE INTERNAL "") SET(HAVE_ACCESS 1 CACHE INTERNAL "") SET(HAVE_ALARM CACHE INTERNAL "") +SET(HAVE_ALIGNED_ALLOC CACHE INTERNAL "") SET(HAVE_ALLOCA_H CACHE INTERNAL "") SET(HAVE_ARPA_INET_H CACHE INTERNAL "") SET(HAVE_BACKTRACE CACHE INTERNAL "") @@ -93,7 +94,6 @@ SET(HAVE_MALLINFO CACHE INTERNAL "") SET(HAVE_MALLINFO2 CACHE INTERNAL "") SET(HAVE_MALLOC_H 1 CACHE INTERNAL "") SET(HAVE_MALLOC_ZONE CACHE INTERNAL "") -SET(HAVE_MEMALIGN CACHE INTERNAL "") SET(HAVE_MEMCPY 1 CACHE INTERNAL "") SET(HAVE_MEMMOVE 1 CACHE INTERNAL "") SET(HAVE_MEMORY_H 1 CACHE INTERNAL "") diff --git a/config.h.cmake b/config.h.cmake index 828f1fbb0d2..4ff2f2fbf12 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -19,6 +19,7 @@ /* Headers we may want to use. */ #cmakedefine STDC_HEADERS 1 #cmakedefine _GNU_SOURCE 1 +#cmakedefine HAVE_ALIGNED_ALLOC 1 #cmakedefine HAVE_ALLOCA_H 1 #cmakedefine HAVE_ARPA_INET_H 1 #cmakedefine HAVE_ASM_TERMBITS_H 1 @@ -163,7 +164,6 @@ #cmakedefine HAVE_LRAND48 1 #cmakedefine HAVE_LOCALTIME_R 1 #cmakedefine HAVE_LSTAT 1 -#cmakedefine HAVE_MEMALIGN 1 /* #cmakedefine HAVE_MLOCK 1 see Bug#54662 */ #cmakedefine HAVE_NL_LANGINFO 1 #cmakedefine HAVE_MADVISE 1 diff --git a/configure.cmake b/configure.cmake index e940bec5db0..19ceaa06220 100644 --- a/configure.cmake +++ b/configure.cmake @@ -324,6 +324,7 @@ ENDIF() CHECK_FUNCTION_EXISTS (accept4 HAVE_ACCEPT4) CHECK_FUNCTION_EXISTS (access HAVE_ACCESS) CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM) +CHECK_FUNCTION_EXISTS (aligned_alloc HAVE_ALIGNED_ALLOC) SET(HAVE_ALLOCA 1) CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE) CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS) @@ -420,7 +421,6 @@ CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY) CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD) CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF) CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) -CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN) CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO) IF(HAVE_SYS_EVENT_H) diff --git a/include/aligned.h b/include/aligned.h new file mode 100644 index 00000000000..ad2c7532b26 --- /dev/null +++ b/include/aligned.h @@ -0,0 +1,34 @@ +/* + Copyright (c) 2022, 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 Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA */ + +inline void *aligned_malloc(size_t size, size_t alignment) +{ +#ifdef _WIN32 + return _aligned_malloc(size, alignment); +#elif defined HAVE_ALIGNED_ALLOC + return aligned_alloc(alignment, size); +#else + void *result; + if (posix_memalign(&result, alignment, size)) + result= NULL; + return result; +#endif +} + +inline void aligned_free(void *ptr) +{ + IF_WIN(_aligned_free,free)(ptr); +} diff --git a/include/my_global.h b/include/my_global.h index 224909116dd..2eed45e8407 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001, 2013, Oracle and/or its affiliates. - Copyright (c) 2009, 2021, MariaDB Corporation. + Copyright (c) 2009, 2022, 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 diff --git a/mysys/my_lockmem.c b/mysys/my_lockmem.c index e159502a278..732aef1fdac 100644 --- a/mysys/my_lockmem.c +++ b/mysys/my_lockmem.c @@ -1,4 +1,5 @@ /* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2022, 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 @@ -17,6 +18,7 @@ #include "mysys_priv.h" #include "mysys_err.h" +#include "aligned.h" #include #ifdef HAVE_MLOCK @@ -39,7 +41,7 @@ uchar *my_malloc_lock(uint size,myf MyFlags) DBUG_ENTER("my_malloc_lock"); size=((size-1) & ~(pagesize-1))+pagesize; - if (!(ptr=memalign(pagesize,size))) + if (!(ptr=aligned_malloc(size,pagesize))) { if (MyFlags & (MY_FAE+MY_WME)) my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_FATAL), size); @@ -91,7 +93,7 @@ void my_free_lock(uchar *ptr) } mysql_mutex_unlock(&THR_LOCK_malloc); my_free(element); - free(ptr); /* Free even if not locked */ + aligned_free(ptr); /* Free even if not locked */ } #endif /* HAVE_MLOCK */ diff --git a/sql/table_cache.cc b/sql/table_cache.cc index 2e9fb34c17e..8fb3a559d86 100644 --- a/sql/table_cache.cc +++ b/sql/table_cache.cc @@ -1,5 +1,5 @@ /* Copyright (c) 2000, 2012, Oracle and/or its affiliates. - Copyright (c) 2010, 2011 Monty Program Ab + Copyright (c) 2010, 2022, MariaDB Corporation. Copyright (C) 2013 Sergey Vojtovich and MariaDB Foundation This program is free software; you can redistribute it and/or modify @@ -50,6 +50,7 @@ #include "lf.h" #include "table.h" #include "sql_base.h" +#include "aligned.h" /** Configuration. */ @@ -122,6 +123,7 @@ struct Table_cache_instance records, Share_free_tables::List (TABLE::prev and TABLE::next), TABLE::in_use. */ + alignas(CPU_LEVEL1_DCACHE_LINESIZE) mysql_mutex_t LOCK_table_cache; I_P_List , @@ -130,11 +132,10 @@ struct Table_cache_instance ulong records; uint mutex_waits; uint mutex_nowaits; - /** Avoid false sharing between instances */ - char pad[CPU_LEVEL1_DCACHE_LINESIZE]; Table_cache_instance(): records(0), mutex_waits(0), mutex_nowaits(0) { + static_assert(!(sizeof(*this) % CPU_LEVEL1_DCACHE_LINESIZE), "alignment"); mysql_mutex_init(key_LOCK_table_cache, &LOCK_table_cache, MY_MUTEX_INIT_FAST); } @@ -146,6 +147,10 @@ struct Table_cache_instance DBUG_ASSERT(records == 0); } + static void *operator new[](size_t size) + { return aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); } + static void operator delete[](void *ptr) { aligned_free(ptr); } + /** Lock table cache mutex and check contention. diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 706e36dd8e6..baee1e47159 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1085,9 +1085,10 @@ inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const void buf_pool_t::page_hash_table::create(ulint n) { n_cells= ut_find_prime(n); - const size_t size= pad(n_cells) * sizeof *array; - void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); - memset(v, 0, size); + const size_t size= MY_ALIGN(pad(n_cells) * sizeof *array, + CPU_LEVEL1_DCACHE_LINESIZE); + void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); + memset_aligned(v, 0, size); array= static_cast(v); } diff --git a/storage/innobase/include/buf0buf.h b/storage/innobase/include/buf0buf.h index 6f1bfa4cfcd..87236415150 100644 --- a/storage/innobase/include/buf0buf.h +++ b/storage/innobase/include/buf0buf.h @@ -332,27 +332,6 @@ buf_page_is_corrupted( ulint fsp_flags) MY_ATTRIBUTE((warn_unused_result)); -inline void *aligned_malloc(size_t size, size_t align) -{ -#ifdef _MSC_VER - return _aligned_malloc(size, align); -#else - void *result; - if (posix_memalign(&result, align, size)) - result= NULL; - return result; -#endif -} - -inline void aligned_free(void *ptr) -{ -#ifdef _MSC_VER - _aligned_free(ptr); -#else - free(ptr); -#endif -} - /** Read the key version from the page. In full crc32 format, key version is stored at {0-3th} bytes. In other format, it is stored in 26th position. diff --git a/storage/innobase/include/univ.i b/storage/innobase/include/univ.i index c2b60a9ea41..da9273c041e 100644 --- a/storage/innobase/include/univ.i +++ b/storage/innobase/include/univ.i @@ -67,6 +67,7 @@ support cross-platform development and expose comonly used SQL names. */ #include #include "my_counter.h" +#include "aligned.h" #include #include diff --git a/storage/innobase/include/ut0pool.h b/storage/innobase/include/ut0pool.h index ccea69fe549..63628cc169f 100644 --- a/storage/innobase/include/ut0pool.h +++ b/storage/innobase/include/ut0pool.h @@ -64,15 +64,8 @@ struct Pool { ut_a(m_start == 0); -#ifdef _MSC_VER m_start = static_cast( - _aligned_malloc(m_size, CPU_LEVEL1_DCACHE_LINESIZE)); -#else - void* start; - ut_a(!posix_memalign(&start, CPU_LEVEL1_DCACHE_LINESIZE, - m_size)); - m_start = static_cast(start); -#endif + aligned_malloc(m_size, CPU_LEVEL1_DCACHE_LINESIZE)); memset_aligned( m_start, 0, m_size); diff --git a/storage/innobase/lock/lock0lock.cc b/storage/innobase/lock/lock0lock.cc index 91791fb8a3a..9323117eff5 100644 --- a/storage/innobase/lock/lock0lock.cc +++ b/storage/innobase/lock/lock0lock.cc @@ -75,9 +75,10 @@ struct TableLockGetNode void lock_sys_t::hash_table::create(ulint n) { n_cells= ut_find_prime(n); - const size_t size= pad(n_cells) * sizeof *array; - void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); - memset(v, 0, size); + const size_t size= MY_ALIGN(pad(n_cells) * sizeof *array, + CPU_LEVEL1_DCACHE_LINESIZE); + void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); + memset_aligned(v, 0, size); array= static_cast(v); } @@ -87,9 +88,10 @@ void lock_sys_t::hash_table::resize(ulint n) { ut_ad(lock_sys.is_writer()); ulint new_n_cells= ut_find_prime(n); - const size_t size= pad(new_n_cells) * sizeof *array; - void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); - memset(v, 0, size); + const size_t size= MY_ALIGN(pad(new_n_cells) * sizeof *array, + CPU_LEVEL1_DCACHE_LINESIZE); + void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); + memset_aligned(v, 0, size); hash_cell_t *new_array= static_cast(v); for (auto i= pad(n_cells); i--; ) diff --git a/storage/perfschema/pfs_digest.cc b/storage/perfschema/pfs_digest.cc index 43375c753dd..0dff583fa6d 100644 --- a/storage/perfschema/pfs_digest.cc +++ b/storage/perfschema/pfs_digest.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2008, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -56,7 +57,7 @@ bool flag_statements_digest= true; Current index in Stat array where new record is to be inserted. index 0 is reserved for "all else" case when entire array is full. */ -static PFS_ALIGNED PFS_cacheline_uint32 digest_monotonic_index; +PFS_ALIGNED static PFS_cacheline_uint32 digest_monotonic_index; bool digest_full= false; diff --git a/storage/perfschema/pfs_events_stages.h b/storage/perfschema/pfs_events_stages.h index eeae350ddf4..0fa7bc8de51 100644 --- a/storage/perfschema/pfs_events_stages.h +++ b/storage/perfschema/pfs_events_stages.h @@ -1,4 +1,5 @@ /* Copyright (c) 2010, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -49,7 +50,7 @@ extern bool flag_events_stages_history; extern bool flag_events_stages_history_long; extern bool events_stages_history_long_full; -extern PFS_ALIGNED PFS_cacheline_uint32 events_stages_history_long_index; +PFS_ALIGNED extern PFS_cacheline_uint32 events_stages_history_long_index; extern PFS_events_stages *events_stages_history_long_array; extern ulong events_stages_history_long_size; diff --git a/storage/perfschema/pfs_events_statements.h b/storage/perfschema/pfs_events_statements.h index 2b2426ef7d1..b03afb8a768 100644 --- a/storage/perfschema/pfs_events_statements.h +++ b/storage/perfschema/pfs_events_statements.h @@ -1,4 +1,5 @@ /* Copyright (c) 2010, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -132,7 +133,7 @@ extern bool flag_events_statements_history; extern bool flag_events_statements_history_long; extern bool events_statements_history_long_full; -extern PFS_ALIGNED PFS_cacheline_uint32 events_statements_history_long_index; +PFS_ALIGNED extern PFS_cacheline_uint32 events_statements_history_long_index; extern PFS_events_statements *events_statements_history_long_array; extern size_t events_statements_history_long_size; diff --git a/storage/perfschema/pfs_events_waits.h b/storage/perfschema/pfs_events_waits.h index 8a7355f2d32..ad992b4b0bd 100644 --- a/storage/perfschema/pfs_events_waits.h +++ b/storage/perfschema/pfs_events_waits.h @@ -1,5 +1,5 @@ /* Copyright (c) 2008, 2021, Oracle and/or its affiliates.. - Copyright (c) 2017, 2019, MariaDB Corporation. + Copyright (c) 2017, 2012, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -127,7 +127,7 @@ extern bool flag_global_instrumentation; extern bool flag_thread_instrumentation; extern bool events_waits_history_long_full; -extern PFS_ALIGNED PFS_cacheline_uint32 events_waits_history_long_index; +PFS_ALIGNED extern PFS_cacheline_uint32 events_waits_history_long_index; extern PFS_events_waits *events_waits_history_long_array; extern ulong events_waits_history_long_size; diff --git a/storage/perfschema/pfs_global.cc b/storage/perfschema/pfs_global.cc index 1f9d24eea4e..e87941448a6 100644 --- a/storage/perfschema/pfs_global.cc +++ b/storage/perfschema/pfs_global.cc @@ -1,5 +1,6 @@ /* Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights reserved. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -30,6 +31,8 @@ #include "pfs_global.h" #include "pfs_builtin_memory.h" #include "log.h" +#include "aligned.h" +#include "assume_aligned.h" #include #include @@ -46,9 +49,6 @@ #ifdef HAVE_NETINET_IN_H #include #endif -#ifdef HAVE_MALLOC_H -#include -#endif bool pfs_initialized= false; @@ -62,41 +62,16 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf flags) assert(klass != NULL); assert(size > 0); - void *ptr= NULL; + const size_t aligned_size= MY_ALIGN(size, CPU_LEVEL1_DCACHE_LINESIZE); -#ifdef PFS_ALIGNEMENT -#ifdef HAVE_POSIX_MEMALIGN - /* Linux */ - if (unlikely(posix_memalign(& ptr, PFS_ALIGNEMENT, size))) - return NULL; -#else -#ifdef HAVE_MEMALIGN - /* Solaris */ - ptr= memalign(PFS_ALIGNEMENT, size); + void *ptr= aligned_malloc(aligned_size, CPU_LEVEL1_DCACHE_LINESIZE); if (unlikely(ptr == NULL)) return NULL; -#else -#ifdef HAVE_ALIGNED_MALLOC - /* Windows */ - ptr= _aligned_malloc(size, PFS_ALIGNEMENT); - if (unlikely(ptr == NULL)) - return NULL; -#else -#error "Missing implementation for PFS_ALIGNENT" -#endif /* HAVE_ALIGNED_MALLOC */ -#endif /* HAVE_MEMALIGN */ -#endif /* HAVE_POSIX_MEMALIGN */ -#else /* PFS_ALIGNMENT */ - /* Everything else */ - ptr= malloc(size); - if (unlikely(ptr == NULL)) - return NULL; -#endif klass->count_alloc(size); if (flags & MY_ZEROFILL) - memset(ptr, 0, size); + memset_aligned(ptr, 0, aligned_size); return ptr; } @@ -105,24 +80,7 @@ void pfs_free(PFS_builtin_memory_class *klass, size_t size, void *ptr) if (ptr == NULL) return; -#ifdef HAVE_POSIX_MEMALIGN - /* Allocated with posix_memalign() */ - free(ptr); -#else -#ifdef HAVE_MEMALIGN - /* Allocated with memalign() */ - free(ptr); -#else -#ifdef HAVE_ALIGNED_MALLOC - /* Allocated with _aligned_malloc() */ - _aligned_free(ptr); -#else - /* Allocated with malloc() */ - free(ptr); -#endif /* HAVE_ALIGNED_MALLOC */ -#endif /* HAVE_MEMALIGN */ -#endif /* HAVE_POSIX_MEMALIGN */ - + aligned_free(ptr); klass->count_free(size); } diff --git a/storage/perfschema/pfs_global.h b/storage/perfschema/pfs_global.h index 48a5587839e..6bce7c347cf 100644 --- a/storage/perfschema/pfs_global.h +++ b/storage/perfschema/pfs_global.h @@ -1,4 +1,5 @@ /* Copyright (c) 2008, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -35,23 +36,7 @@ extern bool pfs_initialized; /** Total memory allocated by the performance schema, in bytes. */ extern size_t pfs_allocated_memory; -#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN) || defined(HAVE_ALIGNED_MALLOC) -#define PFS_ALIGNEMENT CPU_LEVEL1_DCACHE_LINESIZE -#define PFS_ALIGNED MY_ALIGNED(PFS_ALIGNEMENT) -#else -/* - Known platforms that do not provide aligned memory: - - MacOSX Darwin (osx10.5) - For these platforms, compile without the alignment optimization. -*/ -#define PFS_ALIGNED -#endif /* HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_ALIGNED_MALLOC */ - -#ifdef CPU_LEVEL1_DCACHE_LINESIZE -#define PFS_CACHE_LINE_SIZE CPU_LEVEL1_DCACHE_LINESIZE -#else -#define PFS_CACHE_LINE_SIZE 128 -#endif +#define PFS_ALIGNED alignas(CPU_LEVEL1_DCACHE_LINESIZE) /** A uint32 variable, guaranteed to be alone in a CPU cache line. @@ -60,7 +45,7 @@ extern size_t pfs_allocated_memory; struct PFS_cacheline_uint32 { uint32 m_u32; - char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint32)]; + char m_full_cache_line[CPU_LEVEL1_DCACHE_LINESIZE - sizeof(uint32)]; PFS_cacheline_uint32() : m_u32(0) @@ -74,7 +59,7 @@ struct PFS_cacheline_uint32 struct PFS_cacheline_uint64 { uint64 m_u64; - char m_full_cache_line[PFS_CACHE_LINE_SIZE - sizeof(uint64)]; + char m_full_cache_line[CPU_LEVEL1_DCACHE_LINESIZE - sizeof(uint64)]; PFS_cacheline_uint64() : m_u64(0) diff --git a/storage/perfschema/pfs_host.cc b/storage/perfschema/pfs_host.cc index 7d7af7700c2..cbd97e69041 100644 --- a/storage/perfschema/pfs_host.cc +++ b/storage/perfschema/pfs_host.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2010, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -135,7 +136,7 @@ static void set_host_key(PFS_host_key *key, PFS_host *find_or_create_host(PFS_thread *thread, const char *hostname, uint hostname_length) { - static PFS_ALIGNED PFS_cacheline_uint32 monotonic; + PFS_ALIGNED static PFS_cacheline_uint32 monotonic; LF_PINS *pins= get_host_hash_pins(thread); if (unlikely(pins == NULL)) diff --git a/storage/perfschema/pfs_instr.cc b/storage/perfschema/pfs_instr.cc index 41b1b24295a..a2fcaa9222c 100644 --- a/storage/perfschema/pfs_instr.cc +++ b/storage/perfschema/pfs_instr.cc @@ -1,4 +1,5 @@ /* Copyright (c) 2008, 2021, Oracle and/or its affiliates. + Copyright (c) 2022, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License, version 2.0, @@ -88,7 +89,7 @@ PFS_stage_stat *global_instr_class_stages_array= NULL; PFS_statement_stat *global_instr_class_statements_array= NULL; PFS_memory_stat *global_instr_class_memory_array= NULL; -static PFS_ALIGNED PFS_cacheline_uint64 thread_internal_id_counter; +PFS_ALIGNED static PFS_cacheline_uint64 thread_internal_id_counter; /** Hash table for instrumented files. */ LF_HASH pfs_filename_hash; diff --git a/storage/perfschema/unittest/stub_pfs_global.h b/storage/perfschema/unittest/stub_pfs_global.h index 6d10e29161d..3a3aedb537e 100644 --- a/storage/perfschema/unittest/stub_pfs_global.h +++ b/storage/perfschema/unittest/stub_pfs_global.h @@ -25,9 +25,7 @@ #include #include #include -#ifdef HAVE_MEMALIGN -# include -#endif +#include "aligned.h" bool pfs_initialized= false; size_t pfs_allocated_memory_size= 0; @@ -49,17 +47,7 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf) if (--stub_alloc_fails_after_count <= 0) return NULL; -#ifndef PFS_ALIGNEMENT - void *ptr= malloc(size); -#elif defined HAVE_MEMALIGN - void *ptr= memalign(PFS_ALIGNEMENT, size); -#elif defined HAVE_ALIGNED_MALLOC - void *ptr= _aligned_malloc(size, PFS_ALIGNEMENT); -#else - void *ptr; - if (posix_memalign(&ptr, PFS_ALIGNEMENT, size)) - ptr= NULL; -#endif + void *ptr= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); if (ptr != NULL) memset(ptr, 0, size); return ptr; diff --git a/tpool/tpool_generic.cc b/tpool/tpool_generic.cc index 22d29d6400b..dfd780e7ea3 100644 --- a/tpool/tpool_generic.cc +++ b/tpool/tpool_generic.cc @@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/ #include #include #include +#include "aligned.h" namespace tpool { @@ -180,23 +181,13 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) worker_data {} /*Define custom new/delete because of overaligned structure. */ - void* operator new(size_t size) + static void *operator new(size_t size) { -#ifdef _WIN32 - return _aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); -#else - void* ptr; - int ret = posix_memalign(&ptr, CPU_LEVEL1_DCACHE_LINESIZE, size); - return ret ? 0 : ptr; -#endif + return aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); } - void operator delete(void* p) + static void operator delete(void* p) { -#ifdef _WIN32 - _aligned_free(p); -#else - free(p); -#endif + aligned_free(p); } };