diff --git a/storage/test_sql_discovery/mysql-test/archive/discover.rdiff b/storage/test_sql_discovery/mysql-test/archive/discover.rdiff index 3148999079f..c8be9fde63e 100644 --- a/storage/test_sql_discovery/mysql-test/archive/discover.rdiff +++ b/storage/test_sql_discovery/mysql-test/archive/discover.rdiff @@ -28,8 +28,8 @@ drop table t0; show status like 'Handler_discover'; Variable_name Value --Handler_discover 7 -+Handler_discover 8 +-Handler_discover 6 ++Handler_discover 7 # # Bug#45377: ARCHIVE tables aren't discoverable after OPTIMIZE # diff --git a/storage/test_sql_discovery/test_sql_discovery.cc b/storage/test_sql_discovery/test_sql_discovery.cc index 33438035b8d..5c4294dc49b 100644 --- a/storage/test_sql_discovery/test_sql_discovery.cc +++ b/storage/test_sql_discovery/test_sql_discovery.cc @@ -40,18 +40,25 @@ static struct st_mysql_sys_var *sysvars[] = { NULL }; -typedef struct st_share { - const char *name; +class SHARE : public Handler_share { +public: THR_LOCK lock; - uint use_count; - struct st_share *next; -} SHARE; + SHARE() + { + thr_lock_init(&lock); + } + ~SHARE() + { + thr_lock_delete(&lock); + } +}; class ha_tsd: public handler { private: THR_LOCK_DATA lock; SHARE *share; + SHARE *get_share(); public: ha_tsd(handlerton *hton, TABLE_SHARE *table_arg) @@ -87,39 +94,34 @@ public: int close(void); }; -static SHARE *find_or_create_share(const char *table_name, TABLE *table) +SHARE *ha_tsd::get_share() { - SHARE *share; - for (share = (SHARE*)table->s->ha_data; share; share = share->next) - if (my_strcasecmp(table_alias_charset, table_name, share->name) == 0) - return share; + SHARE *tmp_share; + lock_shared_ha_data(); + if (!(tmp_share= static_cast(get_ha_share_ptr()))) + { + tmp_share= new SHARE; + if (!tmp_share) + goto err; - share = (SHARE*)alloc_root(&table->s->mem_root, sizeof(*share)); - bzero(share, sizeof(*share)); - share->name = strdup_root(&table->s->mem_root, table_name); - share->next = (SHARE*)table->s->ha_data; - table->s->ha_data = share; - return share; + set_ha_share_ptr(static_cast(tmp_share)); + } +err: + unlock_shared_ha_data(); + return tmp_share; } int ha_tsd::open(const char *name, int mode, uint test_if_locked) { - mysql_mutex_lock(&table->s->LOCK_ha_data); - share = find_or_create_share(name, table); - if (share->use_count++ == 0) - thr_lock_init(&share->lock); - mysql_mutex_unlock(&table->s->LOCK_ha_data); - thr_lock_data_init(&share->lock,&lock,NULL); + if (!(share= get_share())) + return HA_ERR_OUT_OF_MEM; + thr_lock_data_init(&share->lock,&lock,NULL); return 0; } int ha_tsd::close(void) { - mysql_mutex_lock(&table->s->LOCK_ha_data); - if (--share->use_count == 0) - thr_lock_delete(&share->lock); - mysql_mutex_unlock(&table->s->LOCK_ha_data); return 0; }