Commit 76a262cd authored by Sergei Golubchik's avatar Sergei Golubchik

remove my_hash_const_element(), use Hash_set in C++ code

parent 63798a6e
...@@ -74,7 +74,6 @@ my_bool my_hash_init2(HASH *hash, uint growth_size, CHARSET_INFO *charset, ...@@ -74,7 +74,6 @@ my_bool my_hash_init2(HASH *hash, uint growth_size, CHARSET_INFO *charset,
void my_hash_free(HASH *tree); void my_hash_free(HASH *tree);
void my_hash_reset(HASH *hash); void my_hash_reset(HASH *hash);
uchar *my_hash_element(HASH *hash, ulong idx); uchar *my_hash_element(HASH *hash, ulong idx);
const uchar *my_hash_const_element(const HASH *hash, ulong idx);
uchar *my_hash_search(const HASH *info, const uchar *key, size_t length); uchar *my_hash_search(const HASH *info, const uchar *key, size_t length);
uchar *my_hash_search_using_hash_value(const HASH *info, uchar *my_hash_search_using_hash_value(const HASH *info,
my_hash_value_type hash_value, my_hash_value_type hash_value,
......
...@@ -756,14 +756,6 @@ uchar *my_hash_element(HASH *hash, ulong idx) ...@@ -756,14 +756,6 @@ uchar *my_hash_element(HASH *hash, ulong idx)
} }
const uchar *my_hash_const_element(const HASH *hash, ulong idx)
{
if (idx < hash->records)
return dynamic_element(&hash->array,idx,const HASH_LINK*)->data;
return 0;
}
/* /*
Replace old row with new row. This should only be used when key Replace old row with new row. This should only be used when key
isn't changed isn't changed
......
...@@ -32,10 +32,12 @@ class Hash_set ...@@ -32,10 +32,12 @@ class Hash_set
Constructs an empty hash. Does not allocate memory, it is done upon Constructs an empty hash. Does not allocate memory, it is done upon
the first insert. Thus does not cause or return errors. the first insert. Thus does not cause or return errors.
*/ */
Hash_set(uchar *(*K)(const T *, size_t *, my_bool)) Hash_set(uchar *(*K)(const T *, size_t *, my_bool),
CHARSET_INFO *cs= &my_charset_bin)
{ {
my_hash_clear(&m_hash); my_hash_clear(&m_hash);
m_hash.get_key= (my_hash_get_key)K; m_hash.get_key= (my_hash_get_key)K;
m_hash.charset= cs;
} }
/** /**
Destroy the hash by freeing the buckets table. Does Destroy the hash by freeing the buckets table. Does
...@@ -56,7 +58,7 @@ class Hash_set ...@@ -56,7 +58,7 @@ class Hash_set
*/ */
bool insert(T *value) bool insert(T *value)
{ {
my_hash_init_opt(&m_hash, &my_charset_bin, START_SIZE, 0, 0, my_hash_init_opt(&m_hash, m_hash.charset, START_SIZE, 0, 0,
m_hash.get_key, 0, MYF(0)); m_hash.get_key, 0, MYF(0));
size_t key_len; size_t key_len;
uchar *v= reinterpret_cast<uchar *>(value); uchar *v= reinterpret_cast<uchar *>(value);
...@@ -65,6 +67,10 @@ class Hash_set ...@@ -65,6 +67,10 @@ class Hash_set
return my_hash_insert(&m_hash, v); return my_hash_insert(&m_hash, v);
return FALSE; return FALSE;
} }
bool remove(T *value)
{
return my_hash_delete(&m_hash, reinterpret_cast<uchar*>(value));
}
T *find(const void *key, size_t klen) const T *find(const void *key, size_t klen) const
{ {
return (T*)my_hash_search(&m_hash, reinterpret_cast<const uchar *>(key), klen); return (T*)my_hash_search(&m_hash, reinterpret_cast<const uchar *>(key), klen);
...@@ -73,6 +79,10 @@ class Hash_set ...@@ -73,6 +79,10 @@ class Hash_set
bool is_empty() const { return m_hash.records == 0; } bool is_empty() const { return m_hash.records == 0; }
/** Returns the number of unique elements. */ /** Returns the number of unique elements. */
size_t size() const { return static_cast<size_t>(m_hash.records); } size_t size() const { return static_cast<size_t>(m_hash.records); }
const T* at(size_t i) const
{
return reinterpret_cast<T*>(my_hash_element(const_cast<HASH*>(&m_hash), i));
}
/** An iterator over hash elements. Is not insert-stable. */ /** An iterator over hash elements. Is not insert-stable. */
class Iterator class Iterator
{ {
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "./my_stacktrace.h" #include "./my_stacktrace.h"
#include "./sql_audit.h" #include "./sql_audit.h"
#include "./sql_table.h" #include "./sql_table.h"
#include "./sql_hset.h"
#include <mysql/psi/mysql_table.h> #include <mysql/psi/mysql_table.h>
#ifdef MARIAROCKS_NOT_YET #ifdef MARIAROCKS_NOT_YET
#include <mysql/thread_pool_priv.h> #include <mysql/thread_pool_priv.h>
...@@ -204,28 +205,23 @@ namespace // anonymous namespace = not visible outside this source file ...@@ -204,28 +205,23 @@ namespace // anonymous namespace = not visible outside this source file
{ {
const ulong TABLE_HASH_SIZE = 32; const ulong TABLE_HASH_SIZE = 32;
typedef Hash_set<Rdb_table_handler> Rdb_table_set;
struct Rdb_open_tables_map { struct Rdb_open_tables_map {
/* Hash table used to track the handlers of open tables */ /* Hash table used to track the handlers of open tables */
my_core::HASH m_hash; Rdb_table_set m_hash;
/* The mutex used to protect the hash table */ /* The mutex used to protect the hash table */
mutable mysql_mutex_t m_mutex; mutable mysql_mutex_t m_mutex;
void init_hash(void) { static uchar *get_hash_key(const Rdb_table_handler *const table_handler,
(void)my_hash_init(&m_hash, my_core::system_charset_info, TABLE_HASH_SIZE,
0, 0, (my_hash_get_key)Rdb_open_tables_map::get_hash_key,
0, 0);
}
void free_hash(void) { my_hash_free(&m_hash); }
static uchar *get_hash_key(Rdb_table_handler *const table_handler,
size_t *const length, size_t *const length,
my_bool not_used MY_ATTRIBUTE((__unused__))); my_bool not_used MY_ATTRIBUTE((__unused__)));
Rdb_table_handler *get_table_handler(const char *const table_name); Rdb_table_handler *get_table_handler(const char *const table_name);
void release_table_handler(Rdb_table_handler *const table_handler); void release_table_handler(Rdb_table_handler *const table_handler);
Rdb_open_tables_map() : m_hash(get_hash_key, system_charset_info) { }
std::vector<std::string> get_table_names(void) const; std::vector<std::string> get_table_names(void) const;
}; };
...@@ -1336,7 +1332,7 @@ rdb_get_rocksdb_write_options(my_core::THD *const thd) { ...@@ -1336,7 +1332,7 @@ rdb_get_rocksdb_write_options(my_core::THD *const thd) {
*/ */
uchar * uchar *
Rdb_open_tables_map::get_hash_key(Rdb_table_handler *const table_handler, Rdb_open_tables_map::get_hash_key(const Rdb_table_handler *const table_handler,
size_t *const length, size_t *const length,
my_bool not_used MY_ATTRIBUTE((__unused__))) { my_bool not_used MY_ATTRIBUTE((__unused__))) {
*length = table_handler->m_table_name_length; *length = table_handler->m_table_name_length;
...@@ -2454,12 +2450,11 @@ static bool rocksdb_flush_wal(handlerton* hton __attribute__((__unused__))) ...@@ -2454,12 +2450,11 @@ static bool rocksdb_flush_wal(handlerton* hton __attribute__((__unused__)))
replication progress. replication progress.
*/ */
static int rocksdb_prepare(handlerton* hton, THD* thd, bool prepare_tx) static int rocksdb_prepare(handlerton* hton, THD* thd, bool prepare_tx)
{
#ifdef MARIAROCKS_NOT_YET #ifdef MARIAROCKS_NOT_YET
// This is "ASYNC_COMMIT" feature which is only in webscalesql // This is "ASYNC_COMMIT" feature which is only in webscalesql
// for now, define async=false below:
#endif
{
bool async=false; bool async=false;
#endif
Rdb_transaction *&tx = get_tx_from_thd(thd); Rdb_transaction *&tx = get_tx_from_thd(thd);
if (!tx->can_prepare()) { if (!tx->can_prepare()) {
...@@ -2805,10 +2800,9 @@ class Rdb_snapshot_status : public Rdb_tx_list_walker { ...@@ -2805,10 +2800,9 @@ class Rdb_snapshot_status : public Rdb_tx_list_walker {
int64_t curr_time; int64_t curr_time;
rdb->GetEnv()->GetCurrentTime(&curr_time); rdb->GetEnv()->GetCurrentTime(&curr_time);
THD *thd = tx->get_thd();
char buffer[1024]; char buffer[1024];
#ifdef MARIAROCKS_NOT_YET #ifdef MARIAROCKS_NOT_YET
thd_security_context(thd, buffer, sizeof buffer, 0); thd_security_context(tx->get_thd(), buffer, sizeof buffer, 0);
#endif #endif
m_data += format_string("---SNAPSHOT, ACTIVE %lld sec\n" m_data += format_string("---SNAPSHOT, ACTIVE %lld sec\n"
"%s\n" "%s\n"
...@@ -2912,6 +2906,7 @@ std::vector<Rdb_trx_info> rdb_get_all_trx_info() { ...@@ -2912,6 +2906,7 @@ std::vector<Rdb_trx_info> rdb_get_all_trx_info() {
return trx_info; return trx_info;
} }
#ifdef MARIAROCKS_NOT_YET
/* Generate the snapshot status table */ /* Generate the snapshot status table */
static bool rocksdb_show_snapshot_status(handlerton *const hton, THD *const thd, static bool rocksdb_show_snapshot_status(handlerton *const hton, THD *const thd,
stat_print_fn *const stat_print) { stat_print_fn *const stat_print) {
...@@ -2923,6 +2918,7 @@ static bool rocksdb_show_snapshot_status(handlerton *const hton, THD *const thd, ...@@ -2923,6 +2918,7 @@ static bool rocksdb_show_snapshot_status(handlerton *const hton, THD *const thd,
return print_stats(thd, "SNAPSHOTS", "rocksdb", showStatus.getResult(), return print_stats(thd, "SNAPSHOTS", "rocksdb", showStatus.getResult(),
stat_print); stat_print);
} }
#endif
/* /*
This is called for SHOW ENGINE ROCKSDB STATUS|LOGS|etc. This is called for SHOW ENGINE ROCKSDB STATUS|LOGS|etc.
...@@ -3292,7 +3288,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3292,7 +3288,6 @@ static int rocksdb_init_func(void *const p) {
mysql_mutex_init(rdb_sysvars_psi_mutex_key, &rdb_sysvars_mutex, mysql_mutex_init(rdb_sysvars_psi_mutex_key, &rdb_sysvars_mutex,
MY_MUTEX_INIT_FAST); MY_MUTEX_INIT_FAST);
rdb_open_tables.init_hash();
Rdb_transaction::init_mutex(); Rdb_transaction::init_mutex();
rocksdb_hton->state = SHOW_OPTION_YES; rocksdb_hton->state = SHOW_OPTION_YES;
...@@ -3362,7 +3357,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3362,7 +3357,6 @@ static int rocksdb_init_func(void *const p) {
// mmap_reads and direct_reads are both on. (NO_LINT_DEBUG) // mmap_reads and direct_reads are both on. (NO_LINT_DEBUG)
sql_print_error("RocksDB: Can't enable both use_direct_reads " sql_print_error("RocksDB: Can't enable both use_direct_reads "
"and allow_mmap_reads\n"); "and allow_mmap_reads\n");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3371,7 +3365,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3371,7 +3365,6 @@ static int rocksdb_init_func(void *const p) {
// See above comment for allow_mmap_reads. (NO_LINT_DEBUG) // See above comment for allow_mmap_reads. (NO_LINT_DEBUG)
sql_print_error("RocksDB: Can't enable both use_direct_writes " sql_print_error("RocksDB: Can't enable both use_direct_writes "
"and allow_mmap_writes\n"); "and allow_mmap_writes\n");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3397,7 +3390,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3397,7 +3390,6 @@ static int rocksdb_init_func(void *const p) {
std::string err_text = status.ToString(); std::string err_text = status.ToString();
sql_print_error("RocksDB: Error listing column families: %s", sql_print_error("RocksDB: Error listing column families: %s",
err_text.c_str()); err_text.c_str());
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
} else } else
...@@ -3453,7 +3445,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3453,7 +3445,6 @@ static int rocksdb_init_func(void *const p) {
rocksdb_default_cf_options, rocksdb_override_cf_options)) { rocksdb_default_cf_options, rocksdb_override_cf_options)) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_error("RocksDB: Failed to initialize CF options map."); sql_print_error("RocksDB: Failed to initialize CF options map.");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3509,7 +3500,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3509,7 +3500,6 @@ static int rocksdb_init_func(void *const p) {
sql_print_error("RocksDB: compatibility check against existing database " sql_print_error("RocksDB: compatibility check against existing database "
"options failed. %s", "options failed. %s",
status.ToString().c_str()); status.ToString().c_str());
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3519,7 +3509,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3519,7 +3509,6 @@ static int rocksdb_init_func(void *const p) {
if (!status.ok()) { if (!status.ok()) {
std::string err_text = status.ToString(); std::string err_text = status.ToString();
sql_print_error("RocksDB: Error opening instance: %s", err_text.c_str()); sql_print_error("RocksDB: Error opening instance: %s", err_text.c_str());
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
cf_manager.init(&rocksdb_cf_options_map, &cf_handles); cf_manager.init(&rocksdb_cf_options_map, &cf_handles);
...@@ -3527,21 +3516,18 @@ static int rocksdb_init_func(void *const p) { ...@@ -3527,21 +3516,18 @@ static int rocksdb_init_func(void *const p) {
if (dict_manager.init(rdb->GetBaseDB(), &cf_manager)) { if (dict_manager.init(rdb->GetBaseDB(), &cf_manager)) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_error("RocksDB: Failed to initialize data dictionary."); sql_print_error("RocksDB: Failed to initialize data dictionary.");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
if (binlog_manager.init(&dict_manager)) { if (binlog_manager.init(&dict_manager)) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_error("RocksDB: Failed to initialize binlog manager."); sql_print_error("RocksDB: Failed to initialize binlog manager.");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
if (ddl_manager.init(&dict_manager, &cf_manager, rocksdb_validate_tables)) { if (ddl_manager.init(&dict_manager, &cf_manager, rocksdb_validate_tables)) {
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_error("RocksDB: Failed to initialize DDL manager."); sql_print_error("RocksDB: Failed to initialize DDL manager.");
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3563,7 +3549,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3563,7 +3549,6 @@ static int rocksdb_init_func(void *const p) {
const std::string err_text = status.ToString(); const std::string err_text = status.ToString();
// NO_LINT_DEBUG // NO_LINT_DEBUG
sql_print_error("RocksDB: Error enabling compaction: %s", err_text.c_str()); sql_print_error("RocksDB: Error enabling compaction: %s", err_text.c_str());
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3576,7 +3561,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3576,7 +3561,6 @@ static int rocksdb_init_func(void *const p) {
if (err != 0) { if (err != 0) {
sql_print_error("RocksDB: Couldn't start the background thread: (errno=%d)", sql_print_error("RocksDB: Couldn't start the background thread: (errno=%d)",
err); err);
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3589,7 +3573,6 @@ static int rocksdb_init_func(void *const p) { ...@@ -3589,7 +3573,6 @@ static int rocksdb_init_func(void *const p) {
if (err != 0) { if (err != 0) {
sql_print_error("RocksDB: Couldn't start the drop index thread: (errno=%d)", sql_print_error("RocksDB: Couldn't start the drop index thread: (errno=%d)",
err); err);
rdb_open_tables.free_hash();
DBUG_RETURN(HA_EXIT_FAILURE); DBUG_RETURN(HA_EXIT_FAILURE);
} }
...@@ -3657,13 +3640,17 @@ static int rocksdb_done_func(void *const p) { ...@@ -3657,13 +3640,17 @@ static int rocksdb_done_func(void *const p) {
sql_print_error("RocksDB: Couldn't stop the index thread: (errno=%d)", err); sql_print_error("RocksDB: Couldn't stop the index thread: (errno=%d)", err);
} }
if (rdb_open_tables.m_hash.records) { if (rdb_open_tables.m_hash.size()) {
// Looks like we are getting unloaded and yet we have some open tables // Looks like we are getting unloaded and yet we have some open tables
// left behind. // left behind.
error = 1; error = 1;
} }
rdb_open_tables.free_hash(); /*
destructors for static objects can be called at _exit(),
but we want to free the memory at dlclose()
*/
rdb_open_tables.m_hash.~Rdb_table_set();
mysql_mutex_destroy(&rdb_open_tables.m_mutex); mysql_mutex_destroy(&rdb_open_tables.m_mutex);
mysql_mutex_destroy(&rdb_sysvars_mutex); mysql_mutex_destroy(&rdb_sysvars_mutex);
...@@ -3729,8 +3716,7 @@ Rdb_open_tables_map::get_table_handler(const char *const table_name) { ...@@ -3729,8 +3716,7 @@ Rdb_open_tables_map::get_table_handler(const char *const table_name) {
// First, look up the table in the hash map. // First, look up the table in the hash map.
RDB_MUTEX_LOCK_CHECK(m_mutex); RDB_MUTEX_LOCK_CHECK(m_mutex);
if (!(table_handler = reinterpret_cast<Rdb_table_handler *>(my_hash_search( if (!m_hash.size() || !(table_handler = m_hash.find(table_name, length))) {
&m_hash, reinterpret_cast<const uchar *>(table_name), length)))) {
// Since we did not find it in the hash map, attempt to create and add it // Since we did not find it in the hash map, attempt to create and add it
// to the hash map. // to the hash map.
if (!(table_handler = reinterpret_cast<Rdb_table_handler *>(my_multi_malloc( if (!(table_handler = reinterpret_cast<Rdb_table_handler *>(my_multi_malloc(
...@@ -3746,7 +3732,7 @@ Rdb_open_tables_map::get_table_handler(const char *const table_name) { ...@@ -3746,7 +3732,7 @@ Rdb_open_tables_map::get_table_handler(const char *const table_name) {
table_handler->m_table_name = tmp_name; table_handler->m_table_name = tmp_name;
strmov(table_handler->m_table_name, table_name); strmov(table_handler->m_table_name, table_name);
if (my_hash_insert(&m_hash, reinterpret_cast<uchar *>(table_handler))) { if (m_hash.insert(table_handler)) {
// Inserting into the hash map failed. // Inserting into the hash map failed.
RDB_MUTEX_UNLOCK_CHECK(m_mutex); RDB_MUTEX_UNLOCK_CHECK(m_mutex);
my_free(table_handler); my_free(table_handler);
...@@ -3776,13 +3762,11 @@ std::vector<std::string> Rdb_open_tables_map::get_table_names(void) const { ...@@ -3776,13 +3762,11 @@ std::vector<std::string> Rdb_open_tables_map::get_table_names(void) const {
std::vector<std::string> names; std::vector<std::string> names;
RDB_MUTEX_LOCK_CHECK(m_mutex); RDB_MUTEX_LOCK_CHECK(m_mutex);
for (i = 0; (table_handler = reinterpret_cast<const Rdb_table_handler *>( for (i = 0; (table_handler = m_hash.at(i)); i++) {
my_hash_const_element(&m_hash, i)));
i++) {
DBUG_ASSERT(table_handler != nullptr); DBUG_ASSERT(table_handler != nullptr);
names.push_back(table_handler->m_table_name); names.push_back(table_handler->m_table_name);
} }
DBUG_ASSERT(i == m_hash.records); DBUG_ASSERT(i == m_hash.size());
RDB_MUTEX_UNLOCK_CHECK(m_mutex); RDB_MUTEX_UNLOCK_CHECK(m_mutex);
return names; return names;
...@@ -3937,9 +3921,8 @@ void Rdb_open_tables_map::release_table_handler( ...@@ -3937,9 +3921,8 @@ void Rdb_open_tables_map::release_table_handler(
DBUG_ASSERT(table_handler != nullptr); DBUG_ASSERT(table_handler != nullptr);
DBUG_ASSERT(table_handler->m_ref_count > 0); DBUG_ASSERT(table_handler->m_ref_count > 0);
if (!--table_handler->m_ref_count) { if (!--table_handler->m_ref_count) {
// Last rereference was released. Tear down the hash entry. // Last reference was released. Tear down the hash entry.
const auto ret MY_ATTRIBUTE((__unused__)) = const auto ret MY_ATTRIBUTE((__unused__)) = m_hash.remove(table_handler);
my_hash_delete(&m_hash, reinterpret_cast<uchar *>(table_handler));
DBUG_ASSERT(!ret); // the hash entry must actually be found and deleted DBUG_ASSERT(!ret); // the hash entry must actually be found and deleted
my_core::thr_lock_delete(&table_handler->m_thr_lock); my_core::thr_lock_delete(&table_handler->m_thr_lock);
my_free(table_handler); my_free(table_handler);
......
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