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)
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 "")
......
......@@ -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
......
......@@ -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)
......@@ -421,7 +422,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)
......
/*
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) 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
......
......@@ -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
......@@ -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
......@@ -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
......
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]
plugin-load-add=$PROVIDER_BZIP2_SO
[lz4]
plugin-load-add=$PROVIDER_LZ4_SO
[lzma]
plugin-load-add=$PROVIDER_LZMA_SO
[lzo]
plugin-load-add=$PROVIDER_LZO_SO
[snappy]
plugin-load-add=$PROVIDER_SNAPPY_SO
[zlib]
/* 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 <my_list.h>
#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 */
......@@ -14,7 +14,8 @@ MYSQL_ADD_PLUGIN(HASHICORP_KEY_MANAGEMENT
hashicorp_key_management_plugin.cc
LINK_LIBRARIES ${CURL_LIBRARIES}
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")
......
/* 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 <TABLE, I_P_List_adapter<TABLE, &TABLE::global_free_next,
&TABLE::global_free_prev>,
......@@ -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.
......
......@@ -2730,11 +2730,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)
......
......@@ -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)
{
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<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
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,
if (UNIV_UNLIKELY(id != page_id))
{
ut_ad(id.is_corrupted());
bpage->lock.x_unlock();
goto retry;
}
mysql_mutex_lock(&buf_pool.mutex);
......
......@@ -125,16 +125,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(uint32_t id, const char *old_path,
const char *new_path_in);
/*
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,
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.
@param[in] space_id tablespace id
@param[in] name tablespace file name
......@@ -1636,40 +1592,8 @@ pfs_os_file_t fil_delete_tablespace(uint32_t id)
mtr_t mtr;
mtr.start();
mtr.log_file_op(FILE_DELETE, id, space->chain.start->name);
fil_name_commit_durable(&mtr);
/* 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();
handle= space->chain.start->handle;
mtr.commit_file(*space, nullptr);
fil_space_free_low(space);
}
......@@ -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)
{
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)
{
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;
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)
{
ib::error() << "Cannot rename '" << old_path << "' to '" << path
<< "' because the source file does not exist.";
sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
" because the source file does not exist.",
old_path, path);
return DB_TABLESPACE_NOT_FOUND;
}
......@@ -1817,97 +1757,16 @@ dberr_t fil_space_t::rename(const char *path, bool log, bool replace)
if (replace);
else if (!os_file_status(path, &exists, &ftype) || exists)
{
ib::error() << "Cannot rename '" << old_path << "' to '" << path
<< "' because the target file exists.";
sql_print_error("InnoDB: Cannot rename '%s' to '%s'"
" because the target file exists.",
old_path, path);
return DB_TABLESPACE_EXISTS;
}
fil_name_write_rename(id, old_path, path);
}
return fil_rename_tablespace(id, old_path, 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);
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.
......@@ -1953,7 +1812,11 @@ fil_ibd_create(
mtr.start();
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;
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,
uint32_t 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.
......
......@@ -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.
......
......@@ -48,6 +48,7 @@ support cross-platform development and expose comonly used SQL names. */
#include <my_global.h>
#include "my_counter.h"
#include "aligned.h"
#include <m_string.h>
#include <mysqld_error.h>
......
......@@ -64,15 +64,8 @@ struct Pool {
ut_a(m_start == 0);
#ifdef _MSC_VER
m_start = static_cast<Element*>(
_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
aligned_malloc(m_size, CPU_LEVEL1_DCACHE_LINESIZE));
memset_aligned<CPU_LEVEL1_DCACHE_LINESIZE>(
m_start, 0, m_size);
......
......@@ -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<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
array= static_cast<hash_cell_t*>(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<CPU_LEVEL1_DCACHE_LINESIZE>(v, 0, size);
hash_cell_t *new_array= static_cast<hash_cell_t*>(v);
for (auto i= pad(n_cells); i--; )
......
......@@ -888,6 +888,112 @@ 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);
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,
but generated some redo log on a higher level, such as
FILE_MODIFY records and an optional FILE_CHECKPOINT marker.
......
/* 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;
......
/* 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;
......
/* 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;
......
/* 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;
......
/* 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 <stdlib.h>
#include <string.h>
......@@ -46,9 +49,6 @@
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#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);
if (unlikely(ptr == NULL))
return NULL;
#else
#ifdef HAVE_ALIGNED_MALLOC
/* Windows */
ptr= _aligned_malloc(size, PFS_ALIGNEMENT);
void *ptr= aligned_malloc(aligned_size, CPU_LEVEL1_DCACHE_LINESIZE);
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<CPU_LEVEL1_DCACHE_LINESIZE>(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);
}
......
/* 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)
......
/* 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))
......
/* 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;
......
......@@ -25,9 +25,7 @@
#include <my_sys.h>
#include <pfs_global.h>
#include <string.h>
#ifdef HAVE_MEMALIGN
# include <malloc.h>
#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;
......
......@@ -34,7 +34,7 @@ Warnings:
Warning 1287 '@@spider_internal_limit' is deprecated and will be removed in a future release
SHOW VARIABLES LIKE "spider_internal_limit";
Variable_name Value
spider_internal_limit 9223372032559808513
spider_internal_limit 1
CREATE TABLE tbl_a (a INT) ENGINE=Spider COMMENT='ilm "1"';
Warnings:
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*/
#include <my_dbug.h>
#include <thr_timer.h>
#include <stdlib.h>
#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);
}
};
......
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