Commit 9810a4ec authored by Marko Mäkelä's avatar Marko Mäkelä

Merge 10.9 into 10.10

parents 891bf1d8 707f2aa2
...@@ -23,6 +23,7 @@ IF(MSVC) ...@@ -23,6 +23,7 @@ IF(MSVC)
SET(BFD_H_EXISTS 0 CACHE INTERNAL "") SET(BFD_H_EXISTS 0 CACHE INTERNAL "")
SET(HAVE_ACCESS 1 CACHE INTERNAL "") SET(HAVE_ACCESS 1 CACHE INTERNAL "")
SET(HAVE_ALARM CACHE INTERNAL "") SET(HAVE_ALARM CACHE INTERNAL "")
SET(HAVE_ALIGNED_ALLOC CACHE INTERNAL "")
SET(HAVE_ALLOCA_H CACHE INTERNAL "") SET(HAVE_ALLOCA_H CACHE INTERNAL "")
SET(HAVE_ARPA_INET_H CACHE INTERNAL "") SET(HAVE_ARPA_INET_H CACHE INTERNAL "")
SET(HAVE_BACKTRACE CACHE INTERNAL "") SET(HAVE_BACKTRACE CACHE INTERNAL "")
...@@ -93,7 +94,6 @@ SET(HAVE_MALLINFO CACHE INTERNAL "") ...@@ -93,7 +94,6 @@ SET(HAVE_MALLINFO CACHE INTERNAL "")
SET(HAVE_MALLINFO2 CACHE INTERNAL "") SET(HAVE_MALLINFO2 CACHE INTERNAL "")
SET(HAVE_MALLOC_H 1 CACHE INTERNAL "") SET(HAVE_MALLOC_H 1 CACHE INTERNAL "")
SET(HAVE_MALLOC_ZONE CACHE INTERNAL "") SET(HAVE_MALLOC_ZONE CACHE INTERNAL "")
SET(HAVE_MEMALIGN CACHE INTERNAL "")
SET(HAVE_MEMCPY 1 CACHE INTERNAL "") SET(HAVE_MEMCPY 1 CACHE INTERNAL "")
SET(HAVE_MEMMOVE 1 CACHE INTERNAL "") SET(HAVE_MEMMOVE 1 CACHE INTERNAL "")
SET(HAVE_MEMORY_H 1 CACHE INTERNAL "") SET(HAVE_MEMORY_H 1 CACHE INTERNAL "")
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
/* Headers we may want to use. */ /* Headers we may want to use. */
#cmakedefine STDC_HEADERS 1 #cmakedefine STDC_HEADERS 1
#cmakedefine _GNU_SOURCE 1 #cmakedefine _GNU_SOURCE 1
#cmakedefine HAVE_ALIGNED_ALLOC 1
#cmakedefine HAVE_ALLOCA_H 1 #cmakedefine HAVE_ALLOCA_H 1
#cmakedefine HAVE_ARPA_INET_H 1 #cmakedefine HAVE_ARPA_INET_H 1
#cmakedefine HAVE_ASM_TERMBITS_H 1 #cmakedefine HAVE_ASM_TERMBITS_H 1
...@@ -163,7 +164,6 @@ ...@@ -163,7 +164,6 @@
#cmakedefine HAVE_LRAND48 1 #cmakedefine HAVE_LRAND48 1
#cmakedefine HAVE_LOCALTIME_R 1 #cmakedefine HAVE_LOCALTIME_R 1
#cmakedefine HAVE_LSTAT 1 #cmakedefine HAVE_LSTAT 1
#cmakedefine HAVE_MEMALIGN 1
/* #cmakedefine HAVE_MLOCK 1 see Bug#54662 */ /* #cmakedefine HAVE_MLOCK 1 see Bug#54662 */
#cmakedefine HAVE_NL_LANGINFO 1 #cmakedefine HAVE_NL_LANGINFO 1
#cmakedefine HAVE_MADVISE 1 #cmakedefine HAVE_MADVISE 1
......
...@@ -324,6 +324,7 @@ ENDIF() ...@@ -324,6 +324,7 @@ ENDIF()
CHECK_FUNCTION_EXISTS (accept4 HAVE_ACCEPT4) CHECK_FUNCTION_EXISTS (accept4 HAVE_ACCEPT4)
CHECK_FUNCTION_EXISTS (access HAVE_ACCESS) CHECK_FUNCTION_EXISTS (access HAVE_ACCESS)
CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM) CHECK_FUNCTION_EXISTS (alarm HAVE_ALARM)
CHECK_FUNCTION_EXISTS (aligned_alloc HAVE_ALIGNED_ALLOC)
SET(HAVE_ALLOCA 1) SET(HAVE_ALLOCA 1)
CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE) CHECK_FUNCTION_EXISTS (backtrace HAVE_BACKTRACE)
CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS) CHECK_FUNCTION_EXISTS (backtrace_symbols HAVE_BACKTRACE_SYMBOLS)
...@@ -421,7 +422,6 @@ CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY) ...@@ -421,7 +422,6 @@ CHECK_FUNCTION_EXISTS (thr_setconcurrency HAVE_THR_SETCONCURRENCY)
CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD) CHECK_FUNCTION_EXISTS (thr_yield HAVE_THR_YIELD)
CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF) CHECK_FUNCTION_EXISTS (vasprintf HAVE_VASPRINTF)
CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF) CHECK_FUNCTION_EXISTS (vsnprintf HAVE_VSNPRINTF)
CHECK_FUNCTION_EXISTS (memalign HAVE_MEMALIGN)
CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO) CHECK_FUNCTION_EXISTS (nl_langinfo HAVE_NL_LANGINFO)
IF(HAVE_SYS_EVENT_H) IF(HAVE_SYS_EVENT_H)
......
/*
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);
}
/* /*
Copyright (c) 2001, 2013, Oracle and/or its affiliates. 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 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 it under the terms of the GNU General Public License as published by
......
...@@ -34,4 +34,10 @@ name dl ...@@ -34,4 +34,10 @@ name dl
EXAMPLE ha_example.so EXAMPLE ha_example.so
truncate table mysql.plugin; truncate table mysql.plugin;
# Kill the server # Kill the server
#
# MDEV-28782 mariadb-tzinfo-to-sql to work in bootstrap mode
#
#
# End of 10.6 tests
#
# restart # restart
...@@ -133,4 +133,30 @@ EOF ...@@ -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 --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 --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 --source include/start_mysqld.inc
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
--source include/not_windows.inc --source include/not_windows.inc
--source include/no_protocol.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 LIKE mysql.time_zone;
CREATE TABLE time_zone_name LIKE mysql.time_zone_name; 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 LIKE mysql.time_zone_transition;
...@@ -61,6 +63,9 @@ SELECT COUNT(*) FROM 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_transition_type;
SELECT COUNT(*) FROM time_zone_leap_second; 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 @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 SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff
FROM information_schema.global_status g FROM information_schema.global_status g
...@@ -95,6 +100,9 @@ SELECT COUNT(*) FROM time_zone_transition; ...@@ -95,6 +100,9 @@ SELECT COUNT(*) FROM time_zone_transition;
SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_transition_type;
SELECT COUNT(*) FROM time_zone_leap_second; 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 @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 SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff
FROM information_schema.global_status g FROM information_schema.global_status g
...@@ -127,6 +135,9 @@ SELECT COUNT(*) FROM time_zone_transition; ...@@ -127,6 +135,9 @@ SELECT COUNT(*) FROM time_zone_transition;
SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_transition_type;
SELECT COUNT(*) FROM time_zone_leap_second; 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 @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 SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff
FROM information_schema.global_status g FROM information_schema.global_status g
...@@ -159,6 +170,9 @@ SELECT COUNT(*) FROM time_zone_transition; ...@@ -159,6 +170,9 @@ SELECT COUNT(*) FROM time_zone_transition;
SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_transition_type;
SELECT COUNT(*) FROM time_zone_leap_second; 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 @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 SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff
FROM information_schema.global_status g FROM information_schema.global_status g
...@@ -191,6 +205,9 @@ SELECT COUNT(*) FROM time_zone_transition; ...@@ -191,6 +205,9 @@ SELECT COUNT(*) FROM time_zone_transition;
SELECT COUNT(*) FROM time_zone_transition_type; SELECT COUNT(*) FROM time_zone_transition_type;
SELECT COUNT(*) FROM time_zone_leap_second; 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 @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 SELECT g.VARIABLE_NAME, g.VARIABLE_VALUE - b.VARIABLE_VALUE AS diff
FROM information_schema.global_status g FROM information_schema.global_status g
......
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;
#
# 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
[bzip2] [bzip2]
plugin-load-add=$PROVIDER_BZIP2_SO
[lz4] [lz4]
plugin-load-add=$PROVIDER_LZ4_SO
[lzma] [lzma]
plugin-load-add=$PROVIDER_LZMA_SO
[lzo] [lzo]
plugin-load-add=$PROVIDER_LZO_SO
[snappy] [snappy]
plugin-load-add=$PROVIDER_SNAPPY_SO
[zlib] [zlib]
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. /* 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 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 it under the terms of the GNU General Public License as published by
...@@ -17,6 +18,7 @@ ...@@ -17,6 +18,7 @@
#include "mysys_priv.h" #include "mysys_priv.h"
#include "mysys_err.h" #include "mysys_err.h"
#include "aligned.h"
#include <my_list.h> #include <my_list.h>
#ifdef HAVE_MLOCK #ifdef HAVE_MLOCK
...@@ -39,7 +41,7 @@ uchar *my_malloc_lock(uint size,myf MyFlags) ...@@ -39,7 +41,7 @@ uchar *my_malloc_lock(uint size,myf MyFlags)
DBUG_ENTER("my_malloc_lock"); DBUG_ENTER("my_malloc_lock");
size=((size-1) & ~(pagesize-1))+pagesize; size=((size-1) & ~(pagesize-1))+pagesize;
if (!(ptr=memalign(pagesize,size))) if (!(ptr=aligned_malloc(size,pagesize)))
{ {
if (MyFlags & (MY_FAE+MY_WME)) if (MyFlags & (MY_FAE+MY_WME))
my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_FATAL), size); my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_FATAL), size);
...@@ -91,7 +93,7 @@ void my_free_lock(uchar *ptr) ...@@ -91,7 +93,7 @@ void my_free_lock(uchar *ptr)
} }
mysql_mutex_unlock(&THR_LOCK_malloc); mysql_mutex_unlock(&THR_LOCK_malloc);
my_free(element); my_free(element);
free(ptr); /* Free even if not locked */ aligned_free(ptr); /* Free even if not locked */
} }
#endif /* HAVE_MLOCK */ #endif /* HAVE_MLOCK */
...@@ -14,7 +14,8 @@ MYSQL_ADD_PLUGIN(HASHICORP_KEY_MANAGEMENT ...@@ -14,7 +14,8 @@ MYSQL_ADD_PLUGIN(HASHICORP_KEY_MANAGEMENT
hashicorp_key_management_plugin.cc hashicorp_key_management_plugin.cc
LINK_LIBRARIES ${CURL_LIBRARIES} LINK_LIBRARIES ${CURL_LIBRARIES}
CONFIG hashicorp_key_management.cnf CONFIG hashicorp_key_management.cnf
COMPONENT hashicorp-key-management) COMPONENT hashicorp-key-management
MODULE_ONLY)
ADD_FEATURE_INFO(HASHICORP_KEY_MANAGEMENT "ON" "Hashicorp Key Management Plugin") ADD_FEATURE_INFO(HASHICORP_KEY_MANAGEMENT "ON" "Hashicorp Key Management Plugin")
......
/* Copyright (c) 2000, 2012, Oracle and/or its affiliates. /* 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 Copyright (C) 2013 Sergey Vojtovich and MariaDB Foundation
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include "lf.h" #include "lf.h"
#include "table.h" #include "table.h"
#include "sql_base.h" #include "sql_base.h"
#include "aligned.h"
/** Configuration. */ /** Configuration. */
...@@ -122,6 +123,7 @@ struct Table_cache_instance ...@@ -122,6 +123,7 @@ struct Table_cache_instance
records, Share_free_tables::List (TABLE::prev and TABLE::next), records, Share_free_tables::List (TABLE::prev and TABLE::next),
TABLE::in_use. TABLE::in_use.
*/ */
alignas(CPU_LEVEL1_DCACHE_LINESIZE)
mysql_mutex_t LOCK_table_cache; mysql_mutex_t LOCK_table_cache;
I_P_List <TABLE, I_P_List_adapter<TABLE, &TABLE::global_free_next, I_P_List <TABLE, I_P_List_adapter<TABLE, &TABLE::global_free_next,
&TABLE::global_free_prev>, &TABLE::global_free_prev>,
...@@ -130,11 +132,10 @@ struct Table_cache_instance ...@@ -130,11 +132,10 @@ struct Table_cache_instance
ulong records; ulong records;
uint mutex_waits; uint mutex_waits;
uint mutex_nowaits; 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) 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, mysql_mutex_init(key_LOCK_table_cache, &LOCK_table_cache,
MY_MUTEX_INIT_FAST); MY_MUTEX_INIT_FAST);
} }
...@@ -146,6 +147,10 @@ struct Table_cache_instance ...@@ -146,6 +147,10 @@ struct Table_cache_instance
DBUG_ASSERT(records == 0); 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. Lock table cache mutex and check contention.
......
...@@ -2730,11 +2730,11 @@ static const char *trunc_tables_const= ...@@ -2730,11 +2730,11 @@ static const char *trunc_tables_const=
"TRUNCATE TABLE time_zone_transition;\n" "TRUNCATE TABLE time_zone_transition;\n"
"TRUNCATE TABLE time_zone_transition_type;\n"; "TRUNCATE TABLE time_zone_transition_type;\n";
static const char *wsrep_is_on= static const char *wsrep_is_on=
"select sum(VARIABLE_NAME='wsrep_on' AND SESSION_VALUE='ON')" "select sum(SESSION_VALUE='ON')"
" from information_schema.SYSTEM_VARIABLES"; " from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_on'";
static const char *wsrep_cannot_replicate_tz= static const char *wsrep_cannot_replicate_tz=
"select sum(VARIABLE_NAME='wsrep_mode' and GLOBAL_VALUE NOT LIKE @replicate_opt)" "select sum(GLOBAL_VALUE NOT LIKE @replicate_opt)"
" from information_schema.SYSTEM_VARIABLES"; " from information_schema.SYSTEM_VARIABLES WHERE VARIABLE_NAME='wsrep_mode'";
int int
main(int argc, char **argv) main(int argc, char **argv)
......
...@@ -1075,9 +1075,10 @@ inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const ...@@ -1075,9 +1075,10 @@ inline const buf_block_t *buf_pool_t::chunk_t::not_freed() const
void buf_pool_t::page_hash_table::create(ulint n) void buf_pool_t::page_hash_table::create(ulint n)
{ {
n_cells= ut_find_prime(n); n_cells= ut_find_prime(n);
const size_t size= pad(n_cells) * sizeof *array; const size_t size= MY_ALIGN(pad(n_cells) * sizeof *array,
void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); CPU_LEVEL1_DCACHE_LINESIZE);
memset(v, 0, size); void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE);
memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
array= static_cast<hash_chain*>(v); array= static_cast<hash_chain*>(v);
} }
...@@ -3224,6 +3225,7 @@ static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size, ...@@ -3224,6 +3225,7 @@ static buf_block_t *buf_page_create_low(page_id_t page_id, ulint zip_size,
if (UNIV_UNLIKELY(id != page_id)) if (UNIV_UNLIKELY(id != page_id))
{ {
ut_ad(id.is_corrupted()); ut_ad(id.is_corrupted());
bpage->lock.x_unlock();
goto retry; goto retry;
} }
mysql_mutex_lock(&buf_pool.mutex); mysql_mutex_lock(&buf_pool.mutex);
......
...@@ -125,16 +125,6 @@ bool fil_space_t::try_to_close(bool print_info) ...@@ -125,16 +125,6 @@ bool fil_space_t::try_to_close(bool print_info)
return false; 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(uint32_t id, const char *old_path,
const char *new_path_in);
/* /*
IMPLEMENTATION OF THE TABLESPACE MEMORY CACHE IMPLEMENTATION OF THE TABLESPACE MEMORY CACHE
============================================= =============================================
...@@ -1475,40 +1465,6 @@ inline void mtr_t::log_file_op(mfile_type_t type, uint32_t space_id, ...@@ -1475,40 +1465,6 @@ inline void mtr_t::log_file_op(mfile_type_t type, uint32_t space_id,
m_log.push(reinterpret_cast<const byte*>(path), uint32_t(len)); m_log.push(reinterpret_cast<const byte*>(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(uint32_t 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);
}
static void fil_name_commit_durable(mtr_t *mtr)
{
log_sys.latch.wr_lock(SRW_LOCK_CALL);
auto lsn= mtr->commit_files();
log_sys.latch.wr_unlock();
mtr->flag_wr_unlock();
log_write_up_to(lsn, true);
}
/** 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(uint32_t 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);
fil_name_commit_durable(&mtr);
}
/** Write FILE_MODIFY for a file. /** Write FILE_MODIFY for a file.
@param[in] space_id tablespace id @param[in] space_id tablespace id
@param[in] name tablespace file name @param[in] name tablespace file name
...@@ -1636,40 +1592,8 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id) ...@@ -1636,40 +1592,8 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id)
mtr_t mtr; mtr_t mtr;
mtr.start(); mtr.start();
mtr.log_file_op(FILE_DELETE, id, space->chain.start->name); mtr.log_file_op(FILE_DELETE, id, space->chain.start->name);
fil_name_commit_durable(&mtr); handle= space->chain.start->handle;
mtr.commit_file(*space, nullptr);
/* 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);
log_sys.latch.wr_lock(SRW_LOCK_CALL);
if (space->max_lsn)
{
ut_d(space->max_lsn = 0);
fil_system.named_spaces.remove(*space);
}
log_sys.latch.wr_unlock();
fil_space_free_low(space); fil_space_free_low(space);
} }
...@@ -1794,22 +1718,38 @@ char *fil_make_filepath(const char* path, const table_name_t name, ...@@ -1794,22 +1718,38 @@ 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) dberr_t fil_space_t::rename(const char *path, bool log, bool replace)
{ {
ut_ad(UT_LIST_GET_LEN(chain) == 1); 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; const char *old_path= chain.start->name;
ut_ad(strchr(old_path, '/'));
ut_ad(strchr(path, '/'));
if (!strcmp(path, old_path)) if (!strcmp(path, old_path))
return DB_SUCCESS; return DB_SUCCESS;
if (log) if (!log)
{ {
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;
}
bool exists= false; bool exists= false;
os_file_type_t ftype; os_file_type_t ftype;
/* 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) if (os_file_status(old_path, &exists, &ftype) && !exists)
{ {
ib::error() << "Cannot rename '" << old_path << "' to '" << path sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
<< "' because the source file does not exist."; " because the source file does not exist.",
old_path, path);
return DB_TABLESPACE_NOT_FOUND; return DB_TABLESPACE_NOT_FOUND;
} }
...@@ -1817,97 +1757,16 @@ dberr_t fil_space_t::rename(const char *path, bool log, bool replace) ...@@ -1817,97 +1757,16 @@ dberr_t fil_space_t::rename(const char *path, bool log, bool replace)
if (replace); if (replace);
else if (!os_file_status(path, &exists, &ftype) || exists) else if (!os_file_status(path, &exists, &ftype) || exists)
{ {
ib::error() << "Cannot rename '" << old_path << "' to '" << path sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
<< "' because the target file exists."; " because the target file exists.",
old_path, path);
return DB_TABLESPACE_EXISTS; return DB_TABLESPACE_EXISTS;
} }
fil_name_write_rename(id, old_path, path); mtr_t mtr;
} mtr.start();
mtr.log_file_op(FILE_RENAME, id, old_path, path);
return fil_rename_tablespace(id, old_path, path) ? DB_SUCCESS : DB_ERROR; return mtr.commit_file(*this, path) ? DB_SUCCESS : DB_ERROR;
}
/** 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(uint32_t id, const char *old_path,
const char *new_path_in)
{
fil_space_t* space;
fil_node_t* node;
ut_a(id != 0);
mysql_mutex_lock(&fil_system.mutex);
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()) {
log_sys.latch.wr_lock(SRW_LOCK_CALL);
}
/* log_sys.latch is above fil_system.mutex in the latching order */
#ifndef SUX_LOCK_GENERIC
ut_ad(log_sys.latch.is_write_locked() ||
srv_operation == SRV_OPERATION_RESTORE_DELTA);
#endif
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()) {
log_sys.latch.wr_unlock();
}
mysql_mutex_unlock(&fil_system.mutex);
ut_free(old_file_name);
return(success);
} }
/** Create a tablespace file. /** Create a tablespace file.
...@@ -1953,7 +1812,11 @@ fil_ibd_create( ...@@ -1953,7 +1812,11 @@ fil_ibd_create(
mtr.start(); mtr.start();
mtr.log_file_op(FILE_CREATE, space_id, path); mtr.log_file_op(FILE_CREATE, space_id, path);
fil_name_commit_durable(&mtr); log_sys.latch.wr_lock(SRW_LOCK_CALL);
auto lsn= mtr.commit_files();
log_sys.latch.wr_unlock();
mtr.flag_wr_unlock();
log_write_up_to(lsn, true);
ulint type; ulint type;
static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096, static_assert(((UNIV_ZIP_SIZE_MIN >> 1) << 3) == 4096,
......
...@@ -329,27 +329,6 @@ bool buf_page_is_corrupted(bool check_lsn, const byte *read_buf, ...@@ -329,27 +329,6 @@ bool buf_page_is_corrupted(bool check_lsn, const byte *read_buf,
uint32_t fsp_flags) uint32_t fsp_flags)
MY_ATTRIBUTE((warn_unused_result)); 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, /** Read the key version from the page. In full crc32 format,
key version is stored at {0-3th} bytes. In other format, it is key version is stored at {0-3th} bytes. In other format, it is
stored in 26th position. stored in 26th position.
......
...@@ -102,6 +102,12 @@ struct mtr_t { ...@@ -102,6 +102,12 @@ struct mtr_t {
@param space tablespace that is being shrunk */ @param space tablespace that is being shrunk */
ATTRIBUTE_COLD void commit_shrink(fil_space_t &space); 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, /** Commit a mini-transaction that did not modify any pages,
but generated some redo log on a higher level, such as but generated some redo log on a higher level, such as
FILE_MODIFY records and an optional FILE_CHECKPOINT marker. FILE_MODIFY records and an optional FILE_CHECKPOINT marker.
......
...@@ -48,6 +48,7 @@ support cross-platform development and expose comonly used SQL names. */ ...@@ -48,6 +48,7 @@ support cross-platform development and expose comonly used SQL names. */
#include <my_global.h> #include <my_global.h>
#include "my_counter.h" #include "my_counter.h"
#include "aligned.h"
#include <m_string.h> #include <m_string.h>
#include <mysqld_error.h> #include <mysqld_error.h>
......
...@@ -64,15 +64,8 @@ struct Pool { ...@@ -64,15 +64,8 @@ struct Pool {
ut_a(m_start == 0); ut_a(m_start == 0);
#ifdef _MSC_VER
m_start = static_cast<Element*>( m_start = static_cast<Element*>(
_aligned_malloc(m_size, CPU_LEVEL1_DCACHE_LINESIZE)); 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<Element*>(start);
#endif
memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>( memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(
m_start, 0, m_size); m_start, 0, m_size);
......
...@@ -75,9 +75,10 @@ struct TableLockGetNode ...@@ -75,9 +75,10 @@ struct TableLockGetNode
void lock_sys_t::hash_table::create(ulint n) void lock_sys_t::hash_table::create(ulint n)
{ {
n_cells= ut_find_prime(n); n_cells= ut_find_prime(n);
const size_t size= pad(n_cells) * sizeof *array; const size_t size= MY_ALIGN(pad(n_cells) * sizeof *array,
void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); CPU_LEVEL1_DCACHE_LINESIZE);
memset(v, 0, size); void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE);
memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
array= static_cast<hash_cell_t*>(v); array= static_cast<hash_cell_t*>(v);
} }
...@@ -87,9 +88,10 @@ void lock_sys_t::hash_table::resize(ulint n) ...@@ -87,9 +88,10 @@ void lock_sys_t::hash_table::resize(ulint n)
{ {
ut_ad(lock_sys.is_writer()); ut_ad(lock_sys.is_writer());
ulint new_n_cells= ut_find_prime(n); ulint new_n_cells= ut_find_prime(n);
const size_t size= pad(new_n_cells) * sizeof *array; const size_t size= MY_ALIGN(pad(new_n_cells) * sizeof *array,
void* v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE); CPU_LEVEL1_DCACHE_LINESIZE);
memset(v, 0, size); void *v= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE);
memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
hash_cell_t *new_array= static_cast<hash_cell_t*>(v); hash_cell_t *new_array= static_cast<hash_cell_t*>(v);
for (auto i= pad(n_cells); i--; ) for (auto i= pad(n_cells); i--; )
......
...@@ -888,6 +888,112 @@ void mtr_t::commit_shrink(fil_space_t &space) ...@@ -888,6 +888,112 @@ void mtr_t::commit_shrink(fil_space_t &space)
release_resources(); 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);
ut_ad(!m_latch_ex);
m_latch_ex= true;
log_write_and_flush_prepare();
log_sys.latch.wr_lock(SRW_LOCK_CALL);
size_t size= m_log.size() + 5;
if (log_sys.is_encrypted())
{
/* We will not encrypt any FILE_ records, but we will reserve
a nonce at the end. */
size+= 8;
m_commit_lsn= log_sys.get_lsn();
}
else
m_commit_lsn= 0;
m_crc= 0;
m_log.for_each_block([this](const mtr_buf_t::block_t *b)
{ m_crc= my_crc32c(m_crc, b->begin(), b->used()); return true; });
finish_write(size);
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();
log_sys.latch.wr_unlock();
m_latch_ex= false;
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();
return success;
}
/** Commit a mini-transaction that did not modify any pages, /** Commit a mini-transaction that did not modify any pages,
but generated some redo log on a higher level, such as but generated some redo log on a higher level, such as
FILE_MODIFY records and an optional FILE_CHECKPOINT marker. FILE_MODIFY records and an optional FILE_CHECKPOINT marker.
......
/* Copyright (c) 2008, 2021, Oracle and/or its affiliates. /* 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 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -56,7 +57,7 @@ bool flag_statements_digest= true; ...@@ -56,7 +57,7 @@ bool flag_statements_digest= true;
Current index in Stat array where new record is to be inserted. 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. 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; bool digest_full= false;
......
/* Copyright (c) 2010, 2021, Oracle and/or its affiliates. /* 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 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -49,7 +50,7 @@ extern bool flag_events_stages_history; ...@@ -49,7 +50,7 @@ extern bool flag_events_stages_history;
extern bool flag_events_stages_history_long; extern bool flag_events_stages_history_long;
extern bool events_stages_history_long_full; 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 PFS_events_stages *events_stages_history_long_array;
extern ulong events_stages_history_long_size; extern ulong events_stages_history_long_size;
......
/* Copyright (c) 2010, 2021, Oracle and/or its affiliates. /* 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 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -132,7 +133,7 @@ extern bool flag_events_statements_history; ...@@ -132,7 +133,7 @@ extern bool flag_events_statements_history;
extern bool flag_events_statements_history_long; extern bool flag_events_statements_history_long;
extern bool events_statements_history_long_full; 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 PFS_events_statements *events_statements_history_long_array;
extern size_t events_statements_history_long_size; extern size_t events_statements_history_long_size;
......
/* Copyright (c) 2008, 2021, Oracle and/or its affiliates.. /* 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 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -127,7 +127,7 @@ extern bool flag_global_instrumentation; ...@@ -127,7 +127,7 @@ extern bool flag_global_instrumentation;
extern bool flag_thread_instrumentation; extern bool flag_thread_instrumentation;
extern bool events_waits_history_long_full; 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 PFS_events_waits *events_waits_history_long_array;
extern ulong events_waits_history_long_size; extern ulong events_waits_history_long_size;
......
/* Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights /* Copyright (c) 2008, 2021, Oracle and/or its affiliates. All rights
reserved. reserved.
Copyright (c) 2022, MariaDB Corporation.
This program is free software; you can redistribute it and/or modify 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -30,6 +31,8 @@ ...@@ -30,6 +31,8 @@
#include "pfs_global.h" #include "pfs_global.h"
#include "pfs_builtin_memory.h" #include "pfs_builtin_memory.h"
#include "log.h" #include "log.h"
#include "aligned.h"
#include "assume_aligned.h"
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
...@@ -46,9 +49,6 @@ ...@@ -46,9 +49,6 @@
#ifdef HAVE_NETINET_IN_H #ifdef HAVE_NETINET_IN_H
#include <netinet/in.h> #include <netinet/in.h>
#endif #endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
bool pfs_initialized= false; bool pfs_initialized= false;
...@@ -62,41 +62,16 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf flags) ...@@ -62,41 +62,16 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf flags)
assert(klass != NULL); assert(klass != NULL);
assert(size > 0); assert(size > 0);
void *ptr= NULL; const size_t aligned_size= MY_ALIGN(size, CPU_LEVEL1_DCACHE_LINESIZE);
#ifdef PFS_ALIGNEMENT void *ptr= aligned_malloc(aligned_size, CPU_LEVEL1_DCACHE_LINESIZE);
#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);
if (unlikely(ptr == NULL))
return NULL;
#else
#ifdef HAVE_ALIGNED_MALLOC
/* Windows */
ptr= _aligned_malloc(size, PFS_ALIGNEMENT);
if (unlikely(ptr == NULL)) if (unlikely(ptr == NULL))
return 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); klass->count_alloc(size);
if (flags & MY_ZEROFILL) if (flags & MY_ZEROFILL)
memset(ptr, 0, size); memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(ptr, 0, aligned_size);
return ptr; return ptr;
} }
...@@ -105,24 +80,7 @@ void pfs_free(PFS_builtin_memory_class *klass, size_t size, void *ptr) ...@@ -105,24 +80,7 @@ void pfs_free(PFS_builtin_memory_class *klass, size_t size, void *ptr)
if (ptr == NULL) if (ptr == NULL)
return; return;
#ifdef HAVE_POSIX_MEMALIGN aligned_free(ptr);
/* 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 */
klass->count_free(size); klass->count_free(size);
} }
......
/* Copyright (c) 2008, 2021, Oracle and/or its affiliates. /* 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 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, it under the terms of the GNU General Public License, version 2.0,
...@@ -35,23 +36,7 @@ extern bool pfs_initialized; ...@@ -35,23 +36,7 @@ extern bool pfs_initialized;
/** Total memory allocated by the performance schema, in bytes. */ /** Total memory allocated by the performance schema, in bytes. */
extern size_t pfs_allocated_memory; extern size_t pfs_allocated_memory;
#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE_MEMALIGN) || defined(HAVE_ALIGNED_MALLOC) #define PFS_ALIGNED alignas(CPU_LEVEL1_DCACHE_LINESIZE)
#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
/** /**
A uint32 variable, guaranteed to be alone in a CPU cache line. A uint32 variable, guaranteed to be alone in a CPU cache line.
...@@ -60,7 +45,7 @@ extern size_t pfs_allocated_memory; ...@@ -60,7 +45,7 @@ extern size_t pfs_allocated_memory;
struct PFS_cacheline_uint32 struct PFS_cacheline_uint32
{ {
uint32 m_u32; 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() PFS_cacheline_uint32()
: m_u32(0) : m_u32(0)
...@@ -74,7 +59,7 @@ struct PFS_cacheline_uint32 ...@@ -74,7 +59,7 @@ struct PFS_cacheline_uint32
struct PFS_cacheline_uint64 struct PFS_cacheline_uint64
{ {
uint64 m_u64; 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() PFS_cacheline_uint64()
: m_u64(0) : m_u64(0)
......
/* Copyright (c) 2010, 2021, Oracle and/or its affiliates. /* 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 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, 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, ...@@ -135,7 +136,7 @@ static void set_host_key(PFS_host_key *key,
PFS_host *find_or_create_host(PFS_thread *thread, PFS_host *find_or_create_host(PFS_thread *thread,
const char *hostname, uint hostname_length) 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); LF_PINS *pins= get_host_hash_pins(thread);
if (unlikely(pins == NULL)) if (unlikely(pins == NULL))
......
/* Copyright (c) 2008, 2021, Oracle and/or its affiliates. /* 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 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, 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; ...@@ -88,7 +89,7 @@ PFS_stage_stat *global_instr_class_stages_array= NULL;
PFS_statement_stat *global_instr_class_statements_array= NULL; PFS_statement_stat *global_instr_class_statements_array= NULL;
PFS_memory_stat *global_instr_class_memory_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. */ /** Hash table for instrumented files. */
LF_HASH pfs_filename_hash; LF_HASH pfs_filename_hash;
......
...@@ -25,9 +25,7 @@ ...@@ -25,9 +25,7 @@
#include <my_sys.h> #include <my_sys.h>
#include <pfs_global.h> #include <pfs_global.h>
#include <string.h> #include <string.h>
#ifdef HAVE_MEMALIGN #include "aligned.h"
# include <malloc.h>
#endif
bool pfs_initialized= false; bool pfs_initialized= false;
size_t pfs_allocated_memory_size= 0; size_t pfs_allocated_memory_size= 0;
...@@ -49,17 +47,7 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf) ...@@ -49,17 +47,7 @@ void *pfs_malloc(PFS_builtin_memory_class *klass, size_t size, myf)
if (--stub_alloc_fails_after_count <= 0) if (--stub_alloc_fails_after_count <= 0)
return NULL; return NULL;
#ifndef PFS_ALIGNEMENT void *ptr= aligned_malloc(size, CPU_LEVEL1_DCACHE_LINESIZE);
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
if (ptr != NULL) if (ptr != NULL)
memset(ptr, 0, size); memset(ptr, 0, size);
return ptr; return ptr;
......
...@@ -34,7 +34,7 @@ Warnings: ...@@ -34,7 +34,7 @@ Warnings:
Warning 1287 '@@spider_internal_limit' is deprecated and will be removed in a future release Warning 1287 '@@spider_internal_limit' is deprecated and will be removed in a future release
SHOW VARIABLES LIKE "spider_internal_limit"; SHOW VARIABLES LIKE "spider_internal_limit";
Variable_name Value Variable_name Value
spider_internal_limit 9223372032559808513 spider_internal_limit 1
CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ilm "1"'; CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ilm "1"';
Warnings: Warnings:
Warning 1287 The table parameter 'ilm' is deprecated and will be removed in a future release Warning 1287 The table parameter 'ilm' is deprecated and will be removed in a future release
......
This diff is collapsed.
...@@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/ ...@@ -33,6 +33,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111 - 1301 USA*/
#include <my_dbug.h> #include <my_dbug.h>
#include <thr_timer.h> #include <thr_timer.h>
#include <stdlib.h> #include <stdlib.h>
#include "aligned.h"
namespace tpool namespace tpool
{ {
...@@ -180,23 +181,13 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) worker_data ...@@ -180,23 +181,13 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) worker_data
{} {}
/*Define custom new/delete because of overaligned structure. */ /*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);
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
} }
void operator delete(void* p) static void operator delete(void* p)
{ {
#ifdef _WIN32 aligned_free(p);
_aligned_free(p);
#else
free(p);
#endif
} }
}; };
......
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