Commit 2ecd39c9 authored by Nayuta Yanagisawa's avatar Nayuta Yanagisawa

MDEV-27240 SIGSEGV in ha_spider::store_lock on LOCK TABLE

The commit e954d9de gave different lifetime to wide_share and
partition_handler_share. This introduced the possibility that
partition_handler_share could be accessed even after it was freed.

We stop sharing partitoiin_handler_share and make it belong to
a single wide_handler to fix the problem.
parent 8535c260
/* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp
Copyright (C) 2019-2022 MariaDB corp
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
......@@ -88,8 +88,7 @@ ha_spider::ha_spider(
#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler_share = NULL;
pt_handler_share_owner = FALSE;
partition_handler = NULL;
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL;
......@@ -192,8 +191,7 @@ ha_spider::ha_spider(
#endif
search_link_query_id = 0;
#ifdef WITH_PARTITION_STORAGE_ENGINE
partition_handler_share = NULL;
pt_handler_share_owner = FALSE;
partition_handler = NULL;
#endif
#ifdef HA_MRR_USE_DEFAULT_IMPL
multi_range_keys = NULL;
......@@ -280,12 +278,7 @@ ha_spider::~ha_spider()
DBUG_ENTER("ha_spider::~ha_spider");
DBUG_PRINT("info",("spider this=%p", this));
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_owner)
{
spider_free(spider_current_trx, partition_handler_share, MYF(0));
pt_handler_share_owner = FALSE;
}
partition_handler_share = NULL;
partition_handler = NULL;
#endif
if (wide_handler_owner)
{
......@@ -343,13 +336,8 @@ int ha_spider::open(
#ifdef WITH_PARTITION_STORAGE_ENGINE
uint part_num;
bool pt_handler_share_alloc = FALSE;
bool pt_handler_mutex = FALSE;
ha_spider **pt_handler_share_handlers = NULL;
ha_spider **wide_handler_handlers = NULL;
ha_partition *clone_source;
ha_spider *pt_handler_share_key;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type hash_value;
#endif
#endif
DBUG_ENTER("ha_spider::open");
DBUG_PRINT("info",("spider this=%p", this));
......@@ -360,18 +348,14 @@ int ha_spider::open(
table->file->get_no_parts("", &part_num);
if (part_num)
{
pt_handler_share_handlers =
wide_handler_handlers =
(ha_spider **) ((ha_partition *) table->file)->get_child_handlers();
spider = pt_handler_share_handlers[0];
owner = pt_handler_share_handlers[part_num - 1];
spider = wide_handler_handlers[0];
owner = wide_handler_handlers[part_num - 1];
clone_source = ((ha_partition *) table->file)->get_clone_source();
if (clone_source)
{
pt_handler_share_key = (ha_spider *)
clone_source->get_child_handlers()[0];
is_clone = TRUE;
} else {
pt_handler_share_key = spider;
}
} else {
#endif
......@@ -379,7 +363,6 @@ int ha_spider::open(
owner = this;
#ifdef WITH_PARTITION_STORAGE_ENGINE
clone_source = NULL;
pt_handler_share_key = this;
}
#endif
if (!spider->wide_handler)
......@@ -408,6 +391,10 @@ int ha_spider::open(
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
&rnd_write_bitmap,
(uint) sizeof(uchar) * no_bytes_in_map(table->read_set),
#ifdef WITH_PARTITION_STORAGE_ENGINE
&partition_handler,
(uint) sizeof(SPIDER_PARTITION_HANDLER),
#endif
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
......@@ -422,6 +409,9 @@ int ha_spider::open(
wide_handler->idx_write_bitmap = idx_write_bitmap;
wide_handler->rnd_read_bitmap = rnd_read_bitmap;
wide_handler->rnd_write_bitmap = rnd_write_bitmap;
#ifdef WITH_PARTITION_STORAGE_ENGINE
wide_handler->partition_handler = partition_handler;
#endif
wide_handler->owner = owner;
if (table_share->tmp_table == NO_TMP_TABLE)
wide_handler->top_share = table->s;
......@@ -431,81 +421,37 @@ int ha_spider::open(
memset(wide_handler->searched_bitmap, 0,
no_bytes_in_map(table->read_set));
wide_handler_alloc = TRUE;
} else {
wide_handler = spider->wide_handler;
}
if (!share && !spider_get_share(name, table, thd, this, &error_num))
goto error_get_share;
wide_share = share->wide_share;
if (wide_handler_alloc)
{
thr_lock_data_init(&wide_share->lock, &wide_handler->lock, NULL);
}
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (!wide_handler->partition_handler_share)
{
pt_handler_mutex = TRUE;
pthread_mutex_lock(&wide_share->pt_handler_mutex);
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
hash_value = my_calc_hash(&wide_share->pt_handler_hash,
(uchar*) pt_handler_share_key, sizeof(ha_spider *));
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*)
my_hash_search_using_hash_value(&wide_share->pt_handler_hash,
hash_value, (uchar*) pt_handler_share_key, sizeof(ha_spider *))))
#else
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE*)
my_hash_search(&wide_share->pt_handler_hash,
(uchar*) pt_handler_share_key, sizeof(ha_spider *))))
#endif
{
if (!(partition_handler_share = (SPIDER_PARTITION_HANDLER_SHARE *)
spider_bulk_malloc(spider_current_trx, 15, MYF(MY_WME | MY_ZEROFILL),
&partition_handler_share, sizeof(SPIDER_PARTITION_HANDLER_SHARE),
NullS))
) {
error_num = HA_ERR_OUT_OF_MEM;
goto error_partition_handler_share_alloc;
}
DBUG_PRINT("info",("spider create partition_handler_share"));
DBUG_PRINT("info",("spider table=%p", table));
partition_handler_share->table = table;
partition_handler_share->table_hash_value = hash_value;
partition_handler_share->no_parts = part_num;
partition_handler_share->owner = owner;
partition_handler_share->parallel_search_query_id = 0;
spider->partition_handler_share = partition_handler_share;
owner->partition_handler_share = partition_handler_share;
owner->pt_handler_share_owner = TRUE;
partition_handler_share->handlers = pt_handler_share_handlers;
uint old_elements = wide_share->pt_handler_hash.array.max_element;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&wide_share->pt_handler_hash,
hash_value, (uchar*) partition_handler_share))
#else
if (my_hash_insert(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share))
#endif
{
error_num = HA_ERR_OUT_OF_MEM;
goto error_hash_insert;
}
if (wide_share->pt_handler_hash.array.max_element > old_elements)
{
spider_alloc_calc_mem(spider_current_trx,
wide_share->pt_handler_hash,
(wide_share->pt_handler_hash.array.max_element -
old_elements) *
wide_share->pt_handler_hash.array.size_of_element);
}
}
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
pt_handler_mutex = FALSE;
DBUG_PRINT("info",("spider create partition_handler"));
DBUG_PRINT("info",("spider table=%p", table));
partition_handler->table = table;
partition_handler->no_parts = part_num;
partition_handler->owner = owner;
partition_handler->parallel_search_query_id = 0;
spider->partition_handler = partition_handler;
owner->partition_handler = partition_handler;
partition_handler->handlers = wide_handler_handlers;
pt_handler_share_alloc = TRUE;
} else {
partition_handler_share = wide_handler->partition_handler_share;
wide_handler = spider->wide_handler;
partition_handler = wide_handler->partition_handler;
if (!share && !spider_get_share(name, table, thd, this, &error_num))
goto error_get_share;
wide_share= share->wide_share;
}
if (wide_handler_alloc)
{
thr_lock_data_init(&wide_share->lock, &wide_handler->lock, NULL);
}
#endif
init_sql_alloc_size =
spider_param_init_sql_alloc_size(thd, share->init_sql_alloc_size);
......@@ -572,10 +518,10 @@ int ha_spider::open(
{
for (roop_count = 0; roop_count < (int) part_num; roop_count++)
{
if (partition_handler_share->handlers[roop_count]->share == share)
if (partition_handler->handlers[roop_count]->share == share)
{
pt_clone_source_handler =
partition_handler_share->handlers[roop_count];
partition_handler->handlers[roop_count];
break;
}
}
......@@ -589,10 +535,10 @@ int ha_spider::open(
{
wide_handler->lock_mode =
pt_clone_source_handler->wide_handler->lock_mode;
if (!partition_handler_share->clone_bitmap_init)
if (!partition_handler->clone_bitmap_init)
{
pt_clone_source_handler->set_select_column_mode();
partition_handler_share->clone_bitmap_init = TRUE;
partition_handler->clone_bitmap_init = TRUE;
}
set_clone_searched_bitmap();
wide_handler->position_bitmap_init = FALSE;
......@@ -623,31 +569,13 @@ int ha_spider::open(
error_init_blob_buff:
error_init_result_list:
#ifdef WITH_PARTITION_STORAGE_ENGINE
error_hash_insert:
if (pt_handler_share_alloc)
{
wide_share = share->wide_share;
if (!pt_handler_mutex)
pthread_mutex_lock(&wide_share->pt_handler_mutex);
#ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value(&wide_share->pt_handler_hash,
partition_handler_share->table_hash_value,
(uchar*) partition_handler_share);
#else
my_hash_delete(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share);
#endif
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
pt_handler_mutex = FALSE;
spider_free(spider_current_trx, partition_handler_share, MYF(0));
spider->partition_handler_share = NULL;
owner->partition_handler_share = NULL;
owner->pt_handler_share_owner = FALSE;
spider->partition_handler = NULL;
owner->partition_handler = NULL;
}
error_partition_handler_share_alloc:
if (pt_handler_mutex)
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
partition_handler_share = NULL;
partition_handler = NULL;
#endif
spider_free_share(share);
share = NULL;
......@@ -661,9 +589,9 @@ int ha_spider::open(
{
spider_free(spider_current_trx, wide_handler, MYF(0));
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_handlers)
if (wide_handler_handlers)
{
pt_handler_share_handlers[0]->wide_handler = NULL;
wide_handler_handlers[0]->wide_handler = NULL;
}
#endif
spider->wide_handler = NULL;
......@@ -679,7 +607,6 @@ int ha_spider::close()
{
int error_num = 0, roop_count, error_num2;
THD *thd = ha_thd();
SPIDER_WIDE_SHARE *wide_share;
backup_error_status();
DBUG_ENTER("ha_spider::close");
DBUG_PRINT("info",("spider this=%p", this));
......@@ -769,23 +696,7 @@ int ha_spider::close()
conn_keys = NULL;
}
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (pt_handler_share_owner)
{
wide_share = share->wide_share;
pthread_mutex_lock(&wide_share->pt_handler_mutex);
#ifdef HASH_UPDATE_WITH_HASH_VALUE
my_hash_delete_with_hash_value(&wide_share->pt_handler_hash,
partition_handler_share->table_hash_value,
(uchar*) partition_handler_share);
#else
my_hash_delete(&wide_share->pt_handler_hash,
(uchar*) partition_handler_share);
#endif
pthread_mutex_unlock(&wide_share->pt_handler_mutex);
spider_free(spider_current_trx, partition_handler_share, MYF(0));
pt_handler_share_owner = FALSE;
}
partition_handler_share = NULL;
partition_handler = NULL;
#endif
if (wide_handler_owner)
{
......@@ -1169,14 +1080,14 @@ THR_LOCK_DATA **ha_spider::store_lock(
) {
wide_handler->lock_table_type = 1;
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
uint roop_count;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if (unlikely((store_error_num =
partition_handler_share->handlers[roop_count]->
partition_handler->handlers[roop_count]->
append_lock_tables_list())))
{
break;
......@@ -1204,15 +1115,15 @@ THR_LOCK_DATA **ha_spider::store_lock(
) {
wide_handler->lock_table_type = 2;
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
uint roop_count;
for (roop_count = 0;
roop_count < partition_handler_share->no_parts;
roop_count < partition_handler->no_parts;
++roop_count)
{
if (unlikely((store_error_num =
partition_handler_share->handlers[roop_count]->
partition_handler->handlers[roop_count]->
append_lock_tables_list())))
{
break;
......@@ -1333,14 +1244,14 @@ int ha_spider::external_lock(
/* lock/unlock tables */
#ifdef WITH_PARTITION_STORAGE_ENGINE
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
uint roop_count;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if (unlikely((error_num =
partition_handler_share->handlers[roop_count]->lock_tables())))
partition_handler->handlers[roop_count]->lock_tables())))
{
DBUG_RETURN(error_num);
}
......@@ -1574,7 +1485,7 @@ int ha_spider::reset()
use_pre_action = FALSE;
pre_bitmap_checked = FALSE;
bulk_insert = FALSE;
partition_handler_share->clone_bitmap_init = FALSE;
partition_handler->clone_bitmap_init = FALSE;
result_list.tmp_table_join = FALSE;
result_list.use_union = FALSE;
result_list.use_both_key = FALSE;
......@@ -7489,7 +7400,7 @@ int ha_spider::rnd_next_internal(
) {
int error_num;
ha_spider *direct_limit_offset_spider =
(ha_spider *) partition_handler_share->owner;
(ha_spider *) partition_handler->owner;
backup_error_status();
DBUG_ENTER("ha_spider::rnd_next_internal");
DBUG_PRINT("info",("spider this=%p", this));
......@@ -7529,7 +7440,7 @@ int ha_spider::rnd_next_internal(
DBUG_RETURN(check_error_mode_eof(HA_ERR_END_OF_FILE));
}
if (
partition_handler_share->handlers &&
partition_handler->handlers &&
direct_limit_offset_spider->direct_current_offset > 0
) {
longlong table_count = this->records();
......@@ -12488,11 +12399,11 @@ int ha_spider::info_push(
break;
}
wide_handler->hs_pushed_strref_num++;
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->push_back_hs_upds(
......@@ -12512,11 +12423,11 @@ int ha_spider::info_push(
case INFO_KIND_HS_CLEAR_STRING_REF:
DBUG_PRINT("info",("spider INFO_KIND_HS_CLEAR_STRING_REF"));
wide_handler->hs_pushed_strref_num = 0;
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->reset_hs_upds(
......@@ -12580,11 +12491,11 @@ int ha_spider::info_push(
#ifdef HA_CAN_BULK_ACCESS
case INFO_KIND_BULK_ACCESS_BEGIN:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_BEGIN"));
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->bulk_access_begin(info)))
......@@ -12601,11 +12512,11 @@ int ha_spider::info_push(
break;
case INFO_KIND_BULK_ACCESS_CURRENT:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_CURRENT"));
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
if ((error_num = handlers[roop_count]->bulk_access_current(info)))
......@@ -12622,11 +12533,11 @@ int ha_spider::info_push(
break;
case INFO_KIND_BULK_ACCESS_END:
DBUG_PRINT("info",("spider INFO_KIND_BULK_ACCESS_END"));
if (partition_handler_share && partition_handler_share->handlers)
if (partition_handler && partition_handler->handlers)
{
size_t roop_count;
ha_spider **handlers = partition_handler_share->handlers;
for (roop_count = 0; roop_count < partition_handler_share->no_parts;
ha_spider **handlers = partition_handler->handlers;
for (roop_count = 0; roop_count < partition_handler->no_parts;
++roop_count)
{
handlers[roop_count]->bulk_access_end();
......@@ -13123,7 +13034,7 @@ void ha_spider::check_distinct_key_query()
{
DBUG_ENTER( "ha_spider::check_distinct_key_query" );
if ( result_list.direct_distinct && !partition_handler_share->handlers &&
if ( result_list.direct_distinct && !partition_handler->handlers &&
result_list.keyread && result_list.check_direct_order_limit )
{
// SELECT DISTINCT query using an index in a non-partitioned configuration
......@@ -13923,9 +13834,9 @@ void ha_spider::check_pre_call(
}
if (
use_parallel &&
thd->query_id != partition_handler_share->parallel_search_query_id
thd->query_id != partition_handler->parallel_search_query_id
) {
partition_handler_share->parallel_search_query_id = thd->query_id;
partition_handler->parallel_search_query_id = thd->query_id;
++wide_handler->trx->parallel_search_count;
}
use_pre_call = use_parallel;
......
/* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp
Copyright (C) 2019-2022 MariaDB corp
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
......@@ -92,8 +92,7 @@ class ha_spider final : public handler
SPIDER_POSITION *pushed_pos;
SPIDER_POSITION pushed_pos_buf;
#ifdef WITH_PARTITION_STORAGE_ENGINE
bool pt_handler_share_owner = FALSE;
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share;
SPIDER_PARTITION_HANDLER *partition_handler;
#endif
bool wide_handler_owner = FALSE;
SPIDER_WIDE_HANDLER *wide_handler = NULL;
......
for master_1
for child2
for child3
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT KEY) ENGINE=SPIDER;
SELECT a.z FROM tbl_a AS a,tbl_a b WHERE a.z=b.z;
ERROR 42S22: Unknown column 'a.z' in 'field list'
ALTER TABLE tbl_a CHANGE c c INT;
ERROR 42S22: Unknown column 'c' in 'tbl_a'
LOCK TABLE tbl_a READ;
ERROR HY000: Unable to connect to foreign data source: localhost
DROP DATABASE auto_test_local;
for master_1
for child2
for child3
!include include/default_mysqld.cnf
!include ../my_1_1.cnf
--disable_warnings
--disable_query_log
--disable_result_log
--source ../../t/test_init.inc
--enable_result_log
--enable_query_log
--enable_warnings
CREATE DATABASE auto_test_local;
USE auto_test_local;
CREATE TABLE tbl_a (a INT KEY) ENGINE=SPIDER;
--error ER_BAD_FIELD_ERROR
SELECT a.z FROM tbl_a AS a,tbl_a b WHERE a.z=b.z;
--error ER_BAD_FIELD_ERROR
ALTER TABLE tbl_a CHANGE c c INT;
--error ER_CONNECT_TO_FOREIGN_DATA_SOURCE
LOCK TABLE tbl_a READ;
DROP DATABASE auto_test_local;
--disable_warnings
--disable_query_log
--disable_result_log
--source ../../t/test_deinit.inc
--enable_result_log
--enable_query_log
--enable_warnings
/* Copyright (C) 2008-2020 Kentoku Shiba
Copyright (C) 2019-2020 MariaDB corp
Copyright (C) 2019-2022 MariaDB corp
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
......@@ -676,18 +676,15 @@ typedef struct st_spider_lgtm_tblhnd_share
} SPIDER_LGTM_TBLHND_SHARE;
#ifdef WITH_PARTITION_STORAGE_ENGINE
typedef struct st_spider_patition_handler_share
typedef struct st_spider_patition_handler
{
bool clone_bitmap_init;
#ifdef SPIDER_HAS_HASH_VALUE_TYPE
my_hash_value_type table_hash_value;
#endif
query_id_t parallel_search_query_id;
uint no_parts;
TABLE *table;
ha_spider *owner;
ha_spider **handlers;
} SPIDER_PARTITION_HANDLER_SHARE;
} SPIDER_PARTITION_HANDLER;
#endif
typedef struct st_spider_wide_share
......@@ -701,12 +698,6 @@ typedef struct st_spider_wide_share
THR_LOCK lock;
pthread_mutex_t sts_mutex;
pthread_mutex_t crd_mutex;
pthread_mutex_t pt_handler_mutex;
HASH pt_handler_hash;
uint pt_handler_hash_id;
const char *pt_handler_hash_func_name;
const char *pt_handler_hash_file_name;
ulong pt_handler_hash_line_no;
volatile bool sts_init;
volatile bool crd_init;
......@@ -751,7 +742,7 @@ typedef struct st_spider_wide_handler
#endif
#endif
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share;
SPIDER_PARTITION_HANDLER *partition_handler;
#endif
#ifdef HANDLER_HAS_DIRECT_UPDATE_ROWS
List<Item> *direct_update_fields;
......
/* Copyright (C) 2008-2020 Kentoku Shiba
Copyright (C) 2019-2020 MariaDB corp
Copyright (C) 2019-2022 MariaDB corp
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
......@@ -432,7 +432,7 @@ uchar *spider_wide_share_get_key(
#ifdef WITH_PARTITION_STORAGE_ENGINE
uchar *spider_pt_handler_share_get_key(
SPIDER_PARTITION_HANDLER_SHARE *share,
SPIDER_PARTITION_HANDLER *share,
size_t *length,
my_bool not_used __attribute__ ((unused))
) {
......@@ -6436,34 +6436,8 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
goto error_init_crd_mutex;
}
#if MYSQL_VERSION_ID < 50500
if (pthread_mutex_init(&wide_share->pt_handler_mutex,
MY_MUTEX_INIT_FAST))
#else
if (mysql_mutex_init(spd_key_mutex_pt_handler,
&wide_share->pt_handler_mutex, MY_MUTEX_INIT_FAST))
#endif
{
*error_num = HA_ERR_OUT_OF_MEM;
goto error_init_pt_handler_mutex;
}
if(
my_hash_init(PSI_INSTRUMENT_ME, &wide_share->pt_handler_hash, spd_charset_utf8mb3_bin,
32, 0, 0, (my_hash_get_key) spider_pt_handler_share_get_key, 0, 0)
) {
*error_num = HA_ERR_OUT_OF_MEM;
goto error_init_pt_handler_hash;
}
thr_lock_init(&wide_share->lock);
spider_alloc_calc_mem_init(wide_share->pt_handler_hash, 142);
spider_alloc_calc_mem(spider_current_trx,
wide_share->pt_handler_hash,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
uint old_elements = spider_open_wide_share.array.max_element;
#ifdef HASH_UPDATE_WITH_HASH_VALUE
if (my_hash_insert_with_hash_value(&spider_open_wide_share,
......@@ -6491,14 +6465,6 @@ SPIDER_WIDE_SHARE *spider_get_wide_share(
DBUG_RETURN(wide_share);
error_hash_insert:
spider_free_mem_calc(spider_current_trx,
wide_share->pt_handler_hash_id,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
my_hash_free(&wide_share->pt_handler_hash);
error_init_pt_handler_hash:
pthread_mutex_destroy(&wide_share->pt_handler_mutex);
error_init_pt_handler_mutex:
pthread_mutex_destroy(&wide_share->crd_mutex);
error_init_crd_mutex:
pthread_mutex_destroy(&wide_share->sts_mutex);
......@@ -6523,12 +6489,6 @@ int spider_free_wide_share(
#else
my_hash_delete(&spider_open_wide_share, (uchar*) wide_share);
#endif
spider_free_mem_calc(spider_current_trx,
wide_share->pt_handler_hash_id,
wide_share->pt_handler_hash.array.max_element *
wide_share->pt_handler_hash.array.size_of_element);
my_hash_free(&wide_share->pt_handler_hash);
pthread_mutex_destroy(&wide_share->pt_handler_mutex);
pthread_mutex_destroy(&wide_share->crd_mutex);
pthread_mutex_destroy(&wide_share->sts_mutex);
spider_free(spider_current_trx, wide_share, MYF(0));
......@@ -8036,15 +7996,15 @@ int spider_get_sts(
if (error_num)
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share =
spider->partition_handler_share;
SPIDER_PARTITION_HANDLER *partition_handler =
spider->partition_handler;
if (
!share->wide_share->sts_init &&
sts_sync >= sts_sync_level &&
get_type > 1 &&
partition_handler_share &&
partition_handler_share->handlers &&
partition_handler_share->handlers[0] == spider
partition_handler &&
partition_handler->handlers &&
partition_handler->handlers[0] == spider
) {
int roop_count;
ha_spider *tmp_spider;
......@@ -8054,11 +8014,11 @@ int spider_get_sts(
int tmp_sts_sync;
THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1;
roop_count < (int) partition_handler_share->no_parts;
roop_count < (int) partition_handler->no_parts;
roop_count++)
{
tmp_spider =
(ha_spider *) partition_handler_share->handlers[roop_count];
(ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share;
tmp_sts_interval = spider_param_sts_interval(thd, share->sts_interval);
tmp_sts_mode = spider_param_sts_mode(thd, share->sts_mode);
......@@ -8187,15 +8147,15 @@ int spider_get_crd(
if (error_num)
{
#ifdef WITH_PARTITION_STORAGE_ENGINE
SPIDER_PARTITION_HANDLER_SHARE *partition_handler_share =
spider->partition_handler_share;
SPIDER_PARTITION_HANDLER *partition_handler =
spider->partition_handler;
if (
!share->wide_share->crd_init &&
crd_sync >= crd_sync_level &&
get_type > 1 &&
partition_handler_share &&
partition_handler_share->handlers &&
partition_handler_share->handlers[0] == spider
partition_handler &&
partition_handler->handlers &&
partition_handler->handlers[0] == spider
) {
int roop_count;
ha_spider *tmp_spider;
......@@ -8205,11 +8165,11 @@ int spider_get_crd(
int tmp_crd_sync;
THD *thd = spider->wide_handler->trx->thd;
for (roop_count = 1;
roop_count < (int) partition_handler_share->no_parts;
roop_count < (int) partition_handler->no_parts;
roop_count++)
{
tmp_spider =
(ha_spider *) partition_handler_share->handlers[roop_count];
(ha_spider *) partition_handler->handlers[roop_count];
tmp_share = tmp_spider->share;
tmp_crd_interval = spider_param_crd_interval(thd, share->crd_interval);
tmp_crd_mode = spider_param_crd_mode(thd, share->crd_mode);
......@@ -9348,10 +9308,10 @@ int spider_set_direct_limit_offset(
DBUG_RETURN(TRUE);
if (
spider->partition_handler_share &&
!spider->pt_handler_share_owner
spider->partition_handler &&
!spider->wide_handler_owner
) {
if (spider->partition_handler_share->owner->
if (spider->partition_handler->owner->
result_list.direct_limit_offset == TRUE)
{
spider->result_list.direct_limit_offset = TRUE;
......
/* Copyright (C) 2008-2019 Kentoku Shiba
Copyright (C) 2019 MariaDB corp
Copyright (C) 2019-2022 MariaDB corp
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
......@@ -321,7 +321,7 @@ uchar *spider_wide_share_get_key(
#ifdef WITH_PARTITION_STORAGE_ENGINE
uchar *spider_pt_handler_share_get_key(
SPIDER_PARTITION_HANDLER_SHARE *share,
SPIDER_PARTITION_HANDLER *share,
size_t *length,
my_bool not_used __attribute__ ((unused))
);
......
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