mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.4 into 10.5
This commit is contained in:
@@ -41,6 +41,7 @@
|
|||||||
/* That one is necessary for defines of OPTION_NO_FOREIGN_KEY_CHECKS etc */
|
/* That one is necessary for defines of OPTION_NO_FOREIGN_KEY_CHECKS etc */
|
||||||
#include "sql_priv.h"
|
#include "sql_priv.h"
|
||||||
#include "sql_basic_types.h"
|
#include "sql_basic_types.h"
|
||||||
|
#include <atomic>
|
||||||
#include "log_event.h"
|
#include "log_event.h"
|
||||||
#include "compat56.h"
|
#include "compat56.h"
|
||||||
#include "sql_common.h"
|
#include "sql_common.h"
|
||||||
|
@@ -518,6 +518,10 @@ test.t1 check status OK
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
|
CREATE TABLE t1 (a GEOMETRY, INDEX(a(8)),
|
||||||
|
FOREIGN KEY (a) REFERENCES x (xx)) ENGINE=InnoDB;
|
||||||
|
ERROR HY000: Can't create table `test`.`t1` (errno: 150 "Foreign key constraint is incorrectly formed")
|
||||||
|
# End of 10.4 tests
|
||||||
#
|
#
|
||||||
# MDEV-20729 Fix REFERENCES constraint in column definition
|
# MDEV-20729 Fix REFERENCES constraint in column definition
|
||||||
#
|
#
|
||||||
|
@@ -498,6 +498,14 @@ SET GLOBAL innodb_purge_rseg_truncate_frequency = @saved_frequency;
|
|||||||
|
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
|
# MDEV-21792 Server aborts upon attempt to create foreign key on spatial field
|
||||||
|
# Fail to create foreign key for spatial fields
|
||||||
|
--error ER_CANT_CREATE_TABLE
|
||||||
|
CREATE TABLE t1 (a GEOMETRY, INDEX(a(8)),
|
||||||
|
FOREIGN KEY (a) REFERENCES x (xx)) ENGINE=InnoDB;
|
||||||
|
|
||||||
|
-- echo # End of 10.4 tests
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-20729 Fix REFERENCES constraint in column definition
|
--echo # MDEV-20729 Fix REFERENCES constraint in column definition
|
||||||
--echo #
|
--echo #
|
||||||
|
@@ -474,9 +474,9 @@ static int ha_finish_errors(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static volatile int32 need_full_discover_for_existence= 0;
|
static Atomic_counter<int32> need_full_discover_for_existence(0);
|
||||||
static volatile int32 engines_with_discover_file_names= 0;
|
static Atomic_counter<int32> engines_with_discover_file_names(0);
|
||||||
static volatile int32 engines_with_discover= 0;
|
static Atomic_counter<int32> engines_with_discover(0);
|
||||||
|
|
||||||
static int full_discover_for_existence(handlerton *, const char *, const char *)
|
static int full_discover_for_existence(handlerton *, const char *, const char *)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
@@ -498,13 +498,13 @@ static int hton_ext_based_table_discovery(handlerton *hton, LEX_CSTRING *db,
|
|||||||
static void update_discovery_counters(handlerton *hton, int val)
|
static void update_discovery_counters(handlerton *hton, int val)
|
||||||
{
|
{
|
||||||
if (hton->discover_table_existence == full_discover_for_existence)
|
if (hton->discover_table_existence == full_discover_for_existence)
|
||||||
my_atomic_add32(&need_full_discover_for_existence, val);
|
need_full_discover_for_existence+= val;
|
||||||
|
|
||||||
if (hton->discover_table_names && hton->tablefile_extensions[0])
|
if (hton->discover_table_names && hton->tablefile_extensions[0])
|
||||||
my_atomic_add32(&engines_with_discover_file_names, val);
|
engines_with_discover_file_names+= val;
|
||||||
|
|
||||||
if (hton->discover_table)
|
if (hton->discover_table)
|
||||||
my_atomic_add32(&engines_with_discover, val);
|
engines_with_discover+= val;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ha_finalize_handlerton(st_plugin_int *plugin)
|
int ha_finalize_handlerton(st_plugin_int *plugin)
|
||||||
|
@@ -479,7 +479,7 @@ ulonglong test_flags;
|
|||||||
ulonglong query_cache_size=0;
|
ulonglong query_cache_size=0;
|
||||||
ulong query_cache_limit=0;
|
ulong query_cache_limit=0;
|
||||||
ulong executed_events=0;
|
ulong executed_events=0;
|
||||||
query_id_t global_query_id;
|
Atomic_counter<query_id_t> global_query_id;
|
||||||
ulong aborted_threads, aborted_connects, aborted_connects_preauth;
|
ulong aborted_threads, aborted_connects, aborted_connects_preauth;
|
||||||
ulong delayed_insert_timeout, delayed_insert_limit, delayed_queue_size;
|
ulong delayed_insert_timeout, delayed_insert_limit, delayed_queue_size;
|
||||||
ulong delayed_insert_threads, delayed_insert_writes, delayed_rows_in_use;
|
ulong delayed_insert_threads, delayed_insert_writes, delayed_rows_in_use;
|
||||||
@@ -7631,7 +7631,7 @@ SHOW_VAR status_vars[]= {
|
|||||||
{"Subquery_cache_miss", (char*) &subquery_cache_miss, SHOW_LONG},
|
{"Subquery_cache_miss", (char*) &subquery_cache_miss, SHOW_LONG},
|
||||||
{"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
|
{"Table_locks_immediate", (char*) &locks_immediate, SHOW_LONG},
|
||||||
{"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},
|
{"Table_locks_waited", (char*) &locks_waited, SHOW_LONG},
|
||||||
{"Table_open_cache_active_instances", (char*) &tc_active_instances, SHOW_UINT},
|
{"Table_open_cache_active_instances", (char*) &show_tc_active_instances, SHOW_SIMPLE_FUNC},
|
||||||
{"Table_open_cache_hits", (char*) offsetof(STATUS_VAR, table_open_cache_hits), SHOW_LONGLONG_STATUS},
|
{"Table_open_cache_hits", (char*) offsetof(STATUS_VAR, table_open_cache_hits), SHOW_LONGLONG_STATUS},
|
||||||
{"Table_open_cache_misses", (char*) offsetof(STATUS_VAR, table_open_cache_misses), SHOW_LONGLONG_STATUS},
|
{"Table_open_cache_misses", (char*) offsetof(STATUS_VAR, table_open_cache_misses), SHOW_LONGLONG_STATUS},
|
||||||
{"Table_open_cache_overflows", (char*) offsetof(STATUS_VAR, table_open_cache_overflows), SHOW_LONGLONG_STATUS},
|
{"Table_open_cache_overflows", (char*) offsetof(STATUS_VAR, table_open_cache_overflows), SHOW_LONGLONG_STATUS},
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
#include "sql_bitmap.h" /* Bitmap */
|
#include "sql_bitmap.h" /* Bitmap */
|
||||||
#include "my_decimal.h" /* my_decimal */
|
#include "my_decimal.h" /* my_decimal */
|
||||||
#include "mysql_com.h" /* SERVER_VERSION_LENGTH */
|
#include "mysql_com.h" /* SERVER_VERSION_LENGTH */
|
||||||
#include "my_atomic.h"
|
|
||||||
#include "my_counter.h"
|
#include "my_counter.h"
|
||||||
#include "mysql/psi/mysql_file.h" /* MYSQL_FILE */
|
#include "mysql/psi/mysql_file.h" /* MYSQL_FILE */
|
||||||
#include "mysql/psi/mysql_socket.h" /* MYSQL_SOCKET */
|
#include "mysql/psi/mysql_socket.h" /* MYSQL_SOCKET */
|
||||||
@@ -892,17 +891,17 @@ enum enum_query_type
|
|||||||
|
|
||||||
|
|
||||||
/* query_id */
|
/* query_id */
|
||||||
extern query_id_t global_query_id;
|
extern Atomic_counter<query_id_t> global_query_id;
|
||||||
|
|
||||||
/* increment query_id and return it. */
|
/* increment query_id and return it. */
|
||||||
inline __attribute__((warn_unused_result)) query_id_t next_query_id()
|
inline __attribute__((warn_unused_result)) query_id_t next_query_id()
|
||||||
{
|
{
|
||||||
return my_atomic_add64_explicit(&global_query_id, 1, MY_MEMORY_ORDER_RELAXED);
|
return global_query_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline query_id_t get_query_id()
|
inline query_id_t get_query_id()
|
||||||
{
|
{
|
||||||
return my_atomic_load64_explicit(&global_query_id, MY_MEMORY_ORDER_RELAXED);
|
return global_query_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* increment global_thread_id and return it. */
|
/* increment global_thread_id and return it. */
|
||||||
|
@@ -258,7 +258,7 @@ rpl_slave_state::rpl_slave_state()
|
|||||||
|
|
||||||
rpl_slave_state::~rpl_slave_state()
|
rpl_slave_state::~rpl_slave_state()
|
||||||
{
|
{
|
||||||
free_gtid_pos_tables((struct gtid_pos_table *)gtid_pos_tables);
|
free_gtid_pos_tables(gtid_pos_tables.load(std::memory_order_relaxed));
|
||||||
truncate_hash();
|
truncate_hash();
|
||||||
my_hash_free(&hash);
|
my_hash_free(&hash);
|
||||||
delete_dynamic(>id_sort_array);
|
delete_dynamic(>id_sort_array);
|
||||||
@@ -499,21 +499,18 @@ gtid_check_rpl_slave_state_table(TABLE *table)
|
|||||||
void
|
void
|
||||||
rpl_slave_state::select_gtid_pos_table(THD *thd, LEX_CSTRING *out_tablename)
|
rpl_slave_state::select_gtid_pos_table(THD *thd, LEX_CSTRING *out_tablename)
|
||||||
{
|
{
|
||||||
struct gtid_pos_table *list, *table_entry, *default_entry;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
See comments on rpl_slave_state::gtid_pos_tables for rules around proper
|
See comments on rpl_slave_state::gtid_pos_tables for rules around proper
|
||||||
access to the list.
|
access to the list.
|
||||||
*/
|
*/
|
||||||
list= (struct gtid_pos_table *)
|
auto list= gtid_pos_tables.load(std::memory_order_acquire);
|
||||||
my_atomic_loadptr_explicit(>id_pos_tables, MY_MEMORY_ORDER_ACQUIRE);
|
|
||||||
|
|
||||||
Ha_trx_info *ha_info;
|
Ha_trx_info *ha_info;
|
||||||
uint count = 0;
|
uint count = 0;
|
||||||
for (ha_info= thd->transaction.all.ha_list; ha_info; ha_info= ha_info->next())
|
for (ha_info= thd->transaction.all.ha_list; ha_info; ha_info= ha_info->next())
|
||||||
{
|
{
|
||||||
void *trx_hton= ha_info->ht();
|
void *trx_hton= ha_info->ht();
|
||||||
table_entry= list;
|
auto table_entry= list;
|
||||||
|
|
||||||
if (!ha_info->is_trx_read_write() || trx_hton == binlog_hton)
|
if (!ha_info->is_trx_read_write() || trx_hton == binlog_hton)
|
||||||
continue;
|
continue;
|
||||||
@@ -567,9 +564,8 @@ rpl_slave_state::select_gtid_pos_table(THD *thd, LEX_CSTRING *out_tablename)
|
|||||||
already active in the transaction, or if there is no current transaction
|
already active in the transaction, or if there is no current transaction
|
||||||
engines available, we return the default gtid_slave_pos table.
|
engines available, we return the default gtid_slave_pos table.
|
||||||
*/
|
*/
|
||||||
default_entry= (struct gtid_pos_table *)
|
*out_tablename=
|
||||||
my_atomic_loadptr_explicit(&default_gtid_pos_table, MY_MEMORY_ORDER_ACQUIRE);
|
default_gtid_pos_table.load(std::memory_order_acquire)->table_name;
|
||||||
*out_tablename= default_entry->table_name;
|
|
||||||
/* Record in status that we failed to find a suitable gtid_pos table. */
|
/* Record in status that we failed to find a suitable gtid_pos table. */
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
{
|
{
|
||||||
@@ -823,14 +819,11 @@ rpl_slave_state::gtid_grab_pending_delete_list()
|
|||||||
LEX_CSTRING *
|
LEX_CSTRING *
|
||||||
rpl_slave_state::select_gtid_pos_table(void *hton)
|
rpl_slave_state::select_gtid_pos_table(void *hton)
|
||||||
{
|
{
|
||||||
struct gtid_pos_table *table_entry;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
See comments on rpl_slave_state::gtid_pos_tables for rules around proper
|
See comments on rpl_slave_state::gtid_pos_tables for rules around proper
|
||||||
access to the list.
|
access to the list.
|
||||||
*/
|
*/
|
||||||
table_entry= (struct gtid_pos_table *)
|
auto table_entry= gtid_pos_tables.load(std::memory_order_acquire);
|
||||||
my_atomic_loadptr_explicit(>id_pos_tables, MY_MEMORY_ORDER_ACQUIRE);
|
|
||||||
|
|
||||||
while (table_entry)
|
while (table_entry)
|
||||||
{
|
{
|
||||||
@@ -842,9 +835,7 @@ rpl_slave_state::select_gtid_pos_table(void *hton)
|
|||||||
table_entry= table_entry->next;
|
table_entry= table_entry->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
table_entry= (struct gtid_pos_table *)
|
return &default_gtid_pos_table.load(std::memory_order_acquire)->table_name;
|
||||||
my_atomic_loadptr_explicit(&default_gtid_pos_table, MY_MEMORY_ORDER_ACQUIRE);
|
|
||||||
return &table_entry->table_name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1443,13 +1434,10 @@ void
|
|||||||
rpl_slave_state::set_gtid_pos_tables_list(rpl_slave_state::gtid_pos_table *new_list,
|
rpl_slave_state::set_gtid_pos_tables_list(rpl_slave_state::gtid_pos_table *new_list,
|
||||||
rpl_slave_state::gtid_pos_table *default_entry)
|
rpl_slave_state::gtid_pos_table *default_entry)
|
||||||
{
|
{
|
||||||
gtid_pos_table *old_list;
|
|
||||||
|
|
||||||
mysql_mutex_assert_owner(&LOCK_slave_state);
|
mysql_mutex_assert_owner(&LOCK_slave_state);
|
||||||
old_list= (struct gtid_pos_table *)gtid_pos_tables;
|
auto old_list= gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
my_atomic_storeptr_explicit(>id_pos_tables, new_list, MY_MEMORY_ORDER_RELEASE);
|
gtid_pos_tables.store(new_list, std::memory_order_release);
|
||||||
my_atomic_storeptr_explicit(&default_gtid_pos_table, default_entry,
|
default_gtid_pos_table.store(default_entry, std::memory_order_release);
|
||||||
MY_MEMORY_ORDER_RELEASE);
|
|
||||||
free_gtid_pos_tables(old_list);
|
free_gtid_pos_tables(old_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1458,8 +1446,8 @@ void
|
|||||||
rpl_slave_state::add_gtid_pos_table(rpl_slave_state::gtid_pos_table *entry)
|
rpl_slave_state::add_gtid_pos_table(rpl_slave_state::gtid_pos_table *entry)
|
||||||
{
|
{
|
||||||
mysql_mutex_assert_owner(&LOCK_slave_state);
|
mysql_mutex_assert_owner(&LOCK_slave_state);
|
||||||
entry->next= (struct gtid_pos_table *)gtid_pos_tables;
|
entry->next= gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
my_atomic_storeptr_explicit(>id_pos_tables, entry, MY_MEMORY_ORDER_RELEASE);
|
gtid_pos_tables.store(entry, std::memory_order_release);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "queues.h"
|
#include "queues.h"
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
/* Definitions for MariaDB global transaction ID (GTID). */
|
/* Definitions for MariaDB global transaction ID (GTID). */
|
||||||
|
|
||||||
@@ -219,13 +219,10 @@ struct rpl_slave_state
|
|||||||
The list can be read without lock by an SQL driver thread or worker thread
|
The list can be read without lock by an SQL driver thread or worker thread
|
||||||
by reading the gtid_pos_tables pointer atomically with acquire semantics,
|
by reading the gtid_pos_tables pointer atomically with acquire semantics,
|
||||||
to ensure that it will see the correct next pointer of a new head element.
|
to ensure that it will see the correct next pointer of a new head element.
|
||||||
|
|
||||||
The type is struct gtid_pos_table *, but needs to be void * to allow using
|
|
||||||
my_atomic operations without violating C strict aliasing semantics.
|
|
||||||
*/
|
*/
|
||||||
void * volatile gtid_pos_tables;
|
std::atomic<gtid_pos_table*> gtid_pos_tables;
|
||||||
/* The default entry in gtid_pos_tables, mysql.gtid_slave_pos. */
|
/* The default entry in gtid_pos_tables, mysql.gtid_slave_pos. */
|
||||||
void * volatile default_gtid_pos_table;
|
std::atomic<gtid_pos_table*> default_gtid_pos_table;
|
||||||
bool loaded;
|
bool loaded;
|
||||||
|
|
||||||
rpl_slave_state();
|
rpl_slave_state();
|
||||||
|
@@ -2023,10 +2023,9 @@ find_gtid_slave_pos_tables(THD *thd)
|
|||||||
However we can add new entries, and warn about any tables that
|
However we can add new entries, and warn about any tables that
|
||||||
disappeared, but may still be visible to running SQL threads.
|
disappeared, but may still be visible to running SQL threads.
|
||||||
*/
|
*/
|
||||||
rpl_slave_state::gtid_pos_table *old_entry, *new_entry, **next_ptr_ptr;
|
rpl_slave_state::gtid_pos_table *new_entry, **next_ptr_ptr;
|
||||||
|
auto old_entry= rpl_global_gtid_slave_state->
|
||||||
old_entry= (rpl_slave_state::gtid_pos_table *)
|
gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
rpl_global_gtid_slave_state->gtid_pos_tables;
|
|
||||||
while (old_entry)
|
while (old_entry)
|
||||||
{
|
{
|
||||||
new_entry= cb_data.table_list;
|
new_entry= cb_data.table_list;
|
||||||
@@ -2048,8 +2047,8 @@ find_gtid_slave_pos_tables(THD *thd)
|
|||||||
while (new_entry)
|
while (new_entry)
|
||||||
{
|
{
|
||||||
/* Check if we already have a table with this storage engine. */
|
/* Check if we already have a table with this storage engine. */
|
||||||
old_entry= (rpl_slave_state::gtid_pos_table *)
|
old_entry= rpl_global_gtid_slave_state->
|
||||||
rpl_global_gtid_slave_state->gtid_pos_tables;
|
gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
while (old_entry)
|
while (old_entry)
|
||||||
{
|
{
|
||||||
if (new_entry->table_hton == old_entry->table_hton)
|
if (new_entry->table_hton == old_entry->table_hton)
|
||||||
|
@@ -399,8 +399,8 @@ handle_gtid_pos_auto_create_request(THD *thd, void *hton)
|
|||||||
|
|
||||||
/* Find the entry for the table to auto-create. */
|
/* Find the entry for the table to auto-create. */
|
||||||
mysql_mutex_lock(&rpl_global_gtid_slave_state->LOCK_slave_state);
|
mysql_mutex_lock(&rpl_global_gtid_slave_state->LOCK_slave_state);
|
||||||
entry= (rpl_slave_state::gtid_pos_table *)
|
entry= rpl_global_gtid_slave_state->
|
||||||
rpl_global_gtid_slave_state->gtid_pos_tables;
|
gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
while (entry)
|
while (entry)
|
||||||
{
|
{
|
||||||
if (entry->table_hton == hton &&
|
if (entry->table_hton == hton &&
|
||||||
@@ -436,8 +436,8 @@ handle_gtid_pos_auto_create_request(THD *thd, void *hton)
|
|||||||
|
|
||||||
/* Now enable the entry for the auto-created table. */
|
/* Now enable the entry for the auto-created table. */
|
||||||
mysql_mutex_lock(&rpl_global_gtid_slave_state->LOCK_slave_state);
|
mysql_mutex_lock(&rpl_global_gtid_slave_state->LOCK_slave_state);
|
||||||
entry= (rpl_slave_state::gtid_pos_table *)
|
entry= rpl_global_gtid_slave_state->
|
||||||
rpl_global_gtid_slave_state->gtid_pos_tables;
|
gtid_pos_tables.load(std::memory_order_relaxed);
|
||||||
while (entry)
|
while (entry)
|
||||||
{
|
{
|
||||||
if (entry->table_hton == hton &&
|
if (entry->table_hton == hton &&
|
||||||
|
@@ -56,7 +56,7 @@
|
|||||||
ulong tdc_size; /**< Table definition cache threshold for LRU eviction. */
|
ulong tdc_size; /**< Table definition cache threshold for LRU eviction. */
|
||||||
ulong tc_size; /**< Table cache threshold for LRU eviction. */
|
ulong tc_size; /**< Table cache threshold for LRU eviction. */
|
||||||
uint32 tc_instances;
|
uint32 tc_instances;
|
||||||
uint32 tc_active_instances= 1;
|
static std::atomic<uint32_t> tc_active_instances(1);
|
||||||
static std::atomic<bool> tc_contention_warning_reported;
|
static std::atomic<bool> tc_contention_warning_reported;
|
||||||
|
|
||||||
/** Data collections. */
|
/** Data collections. */
|
||||||
@@ -162,7 +162,7 @@ struct Table_cache_instance
|
|||||||
overhead on TABLE object release. All other table cache mutex acquistions
|
overhead on TABLE object release. All other table cache mutex acquistions
|
||||||
are considered out of hot path and are not instrumented either.
|
are considered out of hot path and are not instrumented either.
|
||||||
*/
|
*/
|
||||||
void lock_and_check_contention(uint32 n_instances, uint32 instance)
|
void lock_and_check_contention(uint32_t n_instances, uint32_t instance)
|
||||||
{
|
{
|
||||||
if (mysql_mutex_trylock(&LOCK_table_cache))
|
if (mysql_mutex_trylock(&LOCK_table_cache))
|
||||||
{
|
{
|
||||||
@@ -171,11 +171,10 @@ struct Table_cache_instance
|
|||||||
{
|
{
|
||||||
if (n_instances < tc_instances)
|
if (n_instances < tc_instances)
|
||||||
{
|
{
|
||||||
if (my_atomic_cas32_weak_explicit((int32*) &tc_active_instances,
|
if (tc_active_instances.
|
||||||
(int32*) &n_instances,
|
compare_exchange_weak(n_instances, n_instances + 1,
|
||||||
(int32) n_instances + 1,
|
std::memory_order_relaxed,
|
||||||
MY_MEMORY_ORDER_RELAXED,
|
std::memory_order_relaxed))
|
||||||
MY_MEMORY_ORDER_RELAXED))
|
|
||||||
{
|
{
|
||||||
sql_print_information("Detected table cache mutex contention at instance %d: "
|
sql_print_information("Detected table cache mutex contention at instance %d: "
|
||||||
"%d%% waits. Additional table cache instance "
|
"%d%% waits. Additional table cache instance "
|
||||||
@@ -353,8 +352,8 @@ void tc_purge()
|
|||||||
|
|
||||||
void tc_add_table(THD *thd, TABLE *table)
|
void tc_add_table(THD *thd, TABLE *table)
|
||||||
{
|
{
|
||||||
uint32 i= thd->thread_id % my_atomic_load32_explicit((int32*) &tc_active_instances,
|
uint32_t i=
|
||||||
MY_MEMORY_ORDER_RELAXED);
|
thd->thread_id % tc_active_instances.load(std::memory_order_relaxed);
|
||||||
TABLE *LRU_table= 0;
|
TABLE *LRU_table= 0;
|
||||||
TDC_element *element= table->s->tdc;
|
TDC_element *element= table->s->tdc;
|
||||||
|
|
||||||
@@ -407,10 +406,8 @@ void tc_add_table(THD *thd, TABLE *table)
|
|||||||
|
|
||||||
TABLE *tc_acquire_table(THD *thd, TDC_element *element)
|
TABLE *tc_acquire_table(THD *thd, TDC_element *element)
|
||||||
{
|
{
|
||||||
uint32 n_instances=
|
uint32_t n_instances= tc_active_instances.load(std::memory_order_relaxed);
|
||||||
my_atomic_load32_explicit((int32*) &tc_active_instances,
|
uint32_t i= thd->thread_id % n_instances;
|
||||||
MY_MEMORY_ORDER_RELAXED);
|
|
||||||
uint32 i= thd->thread_id % n_instances;
|
|
||||||
TABLE *table;
|
TABLE *table;
|
||||||
|
|
||||||
tc[i].lock_and_check_contention(n_instances, i);
|
tc[i].lock_and_check_contention(n_instances, i);
|
||||||
@@ -1279,3 +1276,14 @@ int tdc_iterate(THD *thd, my_hash_walk_action action, void *argument,
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int show_tc_active_instances(THD *thd, SHOW_VAR *var, char *buff,
|
||||||
|
enum enum_var_type scope)
|
||||||
|
{
|
||||||
|
var->type= SHOW_UINT;
|
||||||
|
var->value= buff;
|
||||||
|
*(reinterpret_cast<uint32_t*>(buff))=
|
||||||
|
tc_active_instances.load(std::memory_order_relaxed);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@@ -68,7 +68,6 @@ enum enum_tdc_remove_table_type
|
|||||||
extern ulong tdc_size;
|
extern ulong tdc_size;
|
||||||
extern ulong tc_size;
|
extern ulong tc_size;
|
||||||
extern uint32 tc_instances;
|
extern uint32 tc_instances;
|
||||||
extern uint32 tc_active_instances;
|
|
||||||
|
|
||||||
extern bool tdc_init(void);
|
extern bool tdc_init(void);
|
||||||
extern void tdc_start_shutdown(void);
|
extern void tdc_start_shutdown(void);
|
||||||
@@ -91,6 +90,8 @@ extern int tdc_iterate(THD *thd, my_hash_walk_action action, void *argument,
|
|||||||
bool no_dups= false);
|
bool no_dups= false);
|
||||||
|
|
||||||
extern uint tc_records(void);
|
extern uint tc_records(void);
|
||||||
|
int show_tc_active_instances(THD *thd, SHOW_VAR *var, char *buff,
|
||||||
|
enum enum_var_type scope);
|
||||||
extern void tc_purge();
|
extern void tc_purge();
|
||||||
extern void tc_add_table(THD *thd, TABLE *table);
|
extern void tc_add_table(THD *thd, TABLE *table);
|
||||||
extern void tc_release_table(TABLE *table);
|
extern void tc_release_table(TABLE *table);
|
||||||
|
@@ -2032,7 +2032,8 @@ dict_index_add_to_cache(
|
|||||||
> field->col->max_prefix) {
|
> field->col->max_prefix) {
|
||||||
/* Set the max_prefix value based on the
|
/* Set the max_prefix value based on the
|
||||||
prefix_len. */
|
prefix_len. */
|
||||||
ut_ad(field->prefix_len % field->col->mbmaxlen == 0);
|
ut_ad(field->col->is_binary()
|
||||||
|
|| field->prefix_len % field->col->mbmaxlen == 0);
|
||||||
field->col->max_prefix = field->prefix_len;
|
field->col->max_prefix = field->prefix_len;
|
||||||
}
|
}
|
||||||
ut_ad(field->col->ord_part == 1);
|
ut_ad(field->col->ord_part == 1);
|
||||||
|
@@ -734,6 +734,9 @@ public:
|
|||||||
| CHAR_COLL_MASK << 16
|
| CHAR_COLL_MASK << 16
|
||||||
| DATA_LONG_TRUE_VARCHAR));
|
| DATA_LONG_TRUE_VARCHAR));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @return whether the column values are comparable by memcmp() */
|
||||||
|
inline bool is_binary() const { return prtype & DATA_BINARY_TYPE; }
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Index information put in a list of virtual column structure. Index
|
/** Index information put in a list of virtual column structure. Index
|
||||||
|
@@ -30,7 +30,6 @@ Created 12/15/2009 Jimmy Yang
|
|||||||
#define srv0mon_h
|
#define srv0mon_h
|
||||||
|
|
||||||
#include "univ.i"
|
#include "univ.i"
|
||||||
#include "my_atomic.h"
|
|
||||||
|
|
||||||
#ifndef __STDC_LIMIT_MACROS
|
#ifndef __STDC_LIMIT_MACROS
|
||||||
/* Required for FreeBSD so that INT64_MAX is defined. */
|
/* Required for FreeBSD so that INT64_MAX is defined. */
|
||||||
|
@@ -470,7 +470,6 @@ static ulonglong flush_start= 0;
|
|||||||
#define TRANSLOG_CLSN_LEN_BITS 0xC0 /* Mask to get compressed LSN length */
|
#define TRANSLOG_CLSN_LEN_BITS 0xC0 /* Mask to get compressed LSN length */
|
||||||
|
|
||||||
|
|
||||||
#include <my_atomic.h>
|
|
||||||
/* an array that maps id of a MARIA_SHARE to this MARIA_SHARE */
|
/* an array that maps id of a MARIA_SHARE to this MARIA_SHARE */
|
||||||
static MARIA_SHARE **id_to_share= NULL;
|
static MARIA_SHARE **id_to_share= NULL;
|
||||||
|
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <my_atomic.h>
|
|
||||||
#include <lf.h>
|
#include <lf.h>
|
||||||
#include "../lockman.h"
|
#include "../lockman.h"
|
||||||
|
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <my_atomic.h>
|
|
||||||
#include <lf.h>
|
#include <lf.h>
|
||||||
#include "../lockman.h"
|
#include "../lockman.h"
|
||||||
#include "../tablockman.h"
|
#include "../tablockman.h"
|
||||||
|
@@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <my_atomic.h>
|
|
||||||
#include <lf.h>
|
#include <lf.h>
|
||||||
#include "../tablockman.h"
|
#include "../tablockman.h"
|
||||||
|
|
||||||
|
@@ -17,7 +17,6 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <my_atomic.h>
|
|
||||||
#include <lf.h>
|
#include <lf.h>
|
||||||
#include <m_string.h>
|
#include <m_string.h>
|
||||||
#include "../trnman.h"
|
#include "../trnman.h"
|
||||||
|
@@ -27,7 +27,6 @@
|
|||||||
|
|
||||||
#include "sql_plugin.h"
|
#include "sql_plugin.h"
|
||||||
#include "my_pthread.h"
|
#include "my_pthread.h"
|
||||||
#include "my_atomic.h"
|
|
||||||
#include "ha_perfschema.h"
|
#include "ha_perfschema.h"
|
||||||
#include "pfs_engine_table.h"
|
#include "pfs_engine_table.h"
|
||||||
#include "pfs_column_values.h"
|
#include "pfs_column_values.h"
|
||||||
|
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
#include <my_global.h>
|
#include <my_global.h>
|
||||||
#include <my_sys.h>
|
#include <my_sys.h>
|
||||||
#include <my_atomic.h>
|
|
||||||
#include <tap.h>
|
#include <tap.h>
|
||||||
|
|
||||||
volatile uint32 bad;
|
volatile uint32 bad;
|
||||||
|
Reference in New Issue
Block a user