diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc index be1eef9db1c6..fd60ff03a03d 100644 --- a/storage/rocksdb/ha_rocksdb.cc +++ b/storage/rocksdb/ha_rocksdb.cc @@ -122,7 +122,7 @@ rocksdb::ColumnFamilyOptions default_cf_opts; Dict_manager dict_manager; -Column_family_manager cf_manager; +Rdb_cf_manager cf_manager; Table_ddl_manager ddl_manager; Binlog_info_manager binlog_manager; @@ -158,7 +158,7 @@ static const char* const ERRSTR_ROLLBACK_ONLY static void rocksdb_flush_all_memtables() { - Column_family_manager& cf_manager = rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager = rocksdb_get_cf_manager(); for (auto cf_handle : cf_manager.get_all_cf()) { rdb->Flush(rocksdb::FlushOptions(), cf_handle); } @@ -2452,7 +2452,7 @@ void get_cf_options(const std::string &cf_name, rocksdb::ColumnFamilyOptions *op rocksdb_cf_options_map.Get(cf_name, opts); // Set the comparator according to 'rev:' - if (is_cf_name_reverse(cf_name.c_str())) + if (Rdb_cf_manager::is_cf_name_reverse(cf_name.c_str())) opts->comparator= &rocksdb_rev_pk_comparator; else opts->comparator= &rocksdb_pk_comparator; @@ -4003,7 +4003,7 @@ int ha_rocksdb::create_key_defs(TABLE *table_arg, const char *db_table, goto error; cf_handles[i]= cf_handle; - is_cf_reverse[i]= is_cf_name_reverse(comment); + is_cf_reverse[i]= Rdb_cf_manager::is_cf_name_reverse(comment); is_auto_cf[i]= is_auto_cf_flag; } @@ -7541,7 +7541,7 @@ int ha_rocksdb::analyze(THD* thd, HA_CHECK_OPT* check_opt) } // for analyze statements, force flush on memtable to get accurate cardinality - Column_family_manager& cf_manager = rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager = rocksdb_get_cf_manager(); if (thd != nullptr && THDVAR(thd, flush_memtable_on_analyze) && !rocksdb_pause_background_work) { @@ -8150,7 +8150,7 @@ rocksdb::DB *rocksdb_get_rdb() return rdb; } -Column_family_manager& rocksdb_get_cf_manager() +Rdb_cf_manager& rocksdb_get_cf_manager() { return cf_manager; } diff --git a/storage/rocksdb/ha_rocksdb.h b/storage/rocksdb/ha_rocksdb.h index 00cc24ed500a..55678c7196eb 100644 --- a/storage/rocksdb/ha_rocksdb.h +++ b/storage/rocksdb/ha_rocksdb.h @@ -54,7 +54,7 @@ const char * const DEFAULT_SYSTEM_CF_NAME= "__system__"; /* Column family name which means "put this index into its own column family". - See get_per_index_cf_name. + See Rdb_cf_manager::get_per_index_cf_name(). */ const char * const PER_INDEX_CF_NAME = "$per_index_cf"; diff --git a/storage/rocksdb/ha_rocksdb_proto.h b/storage/rocksdb/ha_rocksdb_proto.h index efd127832a3a..c58d6504aa89 100644 --- a/storage/rocksdb/ha_rocksdb_proto.h +++ b/storage/rocksdb/ha_rocksdb_proto.h @@ -21,12 +21,6 @@ namespace myrocks { -class Column_family_manager; - -rocksdb::DB *rocksdb_get_rdb(); -Column_family_manager& rocksdb_get_cf_manager(); -rocksdb::BlockBasedTableOptions& rocksdb_get_table_options(); - void get_cf_options(const std::string &cf_name, rocksdb::ColumnFamilyOptions *opts) MY_ATTRIBUTE((__nonnull__)); int rocksdb_normalize_tablename(const char *tablename, @@ -44,6 +38,17 @@ int rocksdb_get_share_perf_counters(const char *tablename, void request_save_stats(); +/* + Access to singleton objects. +*/ + +rocksdb::DB *rocksdb_get_rdb(); + +class Rdb_cf_manager; +Rdb_cf_manager& rocksdb_get_cf_manager(); + +rocksdb::BlockBasedTableOptions& rocksdb_get_table_options(); + class Dict_manager; Dict_manager *get_dict_manager(void) MY_ATTRIBUTE((__warn_unused_result__)); diff --git a/storage/rocksdb/rdb_cf_manager.cc b/storage/rocksdb/rdb_cf_manager.cc index 27c11f2ababf..f18ac86ad782 100644 --- a/storage/rocksdb/rdb_cf_manager.cc +++ b/storage/rocksdb/rdb_cf_manager.cc @@ -21,11 +21,12 @@ #include "./rdb_cf_manager.h" #include "./ha_rocksdb.h" +#include "./ha_rocksdb_proto.h" namespace myrocks { /* Check if ColumnFamily name says it's a reverse-ordered CF */ -bool is_cf_name_reverse(const char *name) +bool Rdb_cf_manager::is_cf_name_reverse(const char *name) { /* nullptr means the default CF is used.. (TODO: can the default CF be * reverse?) */ @@ -39,38 +40,39 @@ bool is_cf_name_reverse(const char *name) static PSI_mutex_key ex_key_cfm; #endif -void Column_family_manager::init(std::vector *handles) +void Rdb_cf_manager::init(std::vector *handles) { - mysql_mutex_init(ex_key_cfm, &cfm_mutex, MY_MUTEX_INIT_FAST); + mysql_mutex_init(ex_key_cfm, &m_mutex, MY_MUTEX_INIT_FAST); DBUG_ASSERT(handles != nullptr); DBUG_ASSERT(handles->size() > 0); for (auto cfh : *handles) { DBUG_ASSERT(cfh != nullptr); - cf_name_map[cfh->GetName()] = cfh; - cf_id_map[cfh->GetID()] = cfh; + m_cf_name_map[cfh->GetName()] = cfh; + m_cf_id_map[cfh->GetID()] = cfh; } } -void Column_family_manager::cleanup() +void Rdb_cf_manager::cleanup() { - for (auto it : cf_name_map) { + for (auto it : m_cf_name_map) { delete it.second; } - mysql_mutex_destroy(&cfm_mutex); + mysql_mutex_destroy(&m_mutex); } -/* +/** Generate Column Family name for per-index column families @param res OUT Column Family name */ -void get_per_index_cf_name(const char *db_table_name, const char *index_name, - std::string *res) +void Rdb_cf_manager::get_per_index_cf_name(const char *db_table_name, + const char *index_name, + std::string *res) { DBUG_ASSERT(db_table_name != nullptr); DBUG_ASSERT(index_name != nullptr); @@ -87,20 +89,21 @@ void get_per_index_cf_name(const char *db_table_name, const char *index_name, Find column family by name. If it doesn't exist, create it @detail - See Column_family_manager::get_cf + See Rdb_cf_manager::get_cf */ rocksdb::ColumnFamilyHandle* -Column_family_manager::get_or_create_cf(rocksdb::DB *rdb, const char *cf_name, - const char *db_table_name, - const char *index_name, - bool *is_automatic) +Rdb_cf_manager::get_or_create_cf(rocksdb::DB *rdb, + const char *cf_name, + const char *db_table_name, + const char *index_name, + bool *is_automatic) { DBUG_ASSERT(rdb != nullptr); DBUG_ASSERT(is_automatic != nullptr); rocksdb::ColumnFamilyHandle* cf_handle; - mysql_mutex_lock(&cfm_mutex); + mysql_mutex_lock(&m_mutex); *is_automatic= false; if (cf_name == nullptr) cf_name= DEFAULT_CF_NAME; @@ -113,8 +116,8 @@ Column_family_manager::get_or_create_cf(rocksdb::DB *rdb, const char *cf_name, *is_automatic= true; } - auto it = cf_name_map.find(cf_name); - if (it != cf_name_map.end()) + auto it = m_cf_name_map.find(cf_name); + if (it != m_cf_name_map.end()) cf_handle= it->second; else { @@ -130,13 +133,13 @@ Column_family_manager::get_or_create_cf(rocksdb::DB *rdb, const char *cf_name, rocksdb::Status s= rdb->CreateColumnFamily(opts, cf_name_str, &cf_handle); if (s.ok()) { - cf_name_map[cf_handle->GetName()] = cf_handle; - cf_id_map[cf_handle->GetID()] = cf_handle; + m_cf_name_map[cf_handle->GetName()] = cf_handle; + m_cf_id_map[cf_handle->GetID()] = cf_handle; } else { cf_handle= nullptr; } } - mysql_mutex_unlock(&cfm_mutex); + mysql_mutex_unlock(&m_mutex); return cf_handle; } @@ -155,10 +158,10 @@ Column_family_manager::get_or_create_cf(rocksdb::DB *rdb, const char *cf_name, */ rocksdb::ColumnFamilyHandle* -Column_family_manager::get_cf(const char *cf_name, - const char *db_table_name, - const char *index_name, - bool *is_automatic) +Rdb_cf_manager::get_cf(const char *cf_name, + const char *db_table_name, + const char *index_name, + bool *is_automatic) const { DBUG_ASSERT(cf_name != nullptr); DBUG_ASSERT(is_automatic != nullptr); @@ -166,7 +169,7 @@ Column_family_manager::get_cf(const char *cf_name, rocksdb::ColumnFamilyHandle* cf_handle; *is_automatic= false; - mysql_mutex_lock(&cfm_mutex); + mysql_mutex_lock(&m_mutex); if (cf_name == nullptr) cf_name= DEFAULT_CF_NAME; @@ -178,50 +181,50 @@ Column_family_manager::get_cf(const char *cf_name, *is_automatic= true; } - auto it = cf_name_map.find(cf_name); - cf_handle = (it != cf_name_map.end()) ? it->second : nullptr; + auto it = m_cf_name_map.find(cf_name); + cf_handle = (it != m_cf_name_map.end()) ? it->second : nullptr; - mysql_mutex_unlock(&cfm_mutex); + mysql_mutex_unlock(&m_mutex); return cf_handle; } -rocksdb::ColumnFamilyHandle* Column_family_manager::get_cf(const uint32_t id) +rocksdb::ColumnFamilyHandle* Rdb_cf_manager::get_cf(const uint32_t id) const { rocksdb::ColumnFamilyHandle* cf_handle = nullptr; - mysql_mutex_lock(&cfm_mutex); - auto it = cf_id_map.find(id); - if (it != cf_id_map.end()) + mysql_mutex_lock(&m_mutex); + auto it = m_cf_id_map.find(id); + if (it != m_cf_id_map.end()) cf_handle = it->second; - mysql_mutex_unlock(&cfm_mutex); + mysql_mutex_unlock(&m_mutex); return cf_handle; } std::vector -Column_family_manager::get_cf_names(void) +Rdb_cf_manager::get_cf_names(void) const { std::vector names; - mysql_mutex_lock(&cfm_mutex); - for (auto it : cf_name_map) { + mysql_mutex_lock(&m_mutex); + for (auto it : m_cf_name_map) { names.push_back(it.first); } - mysql_mutex_unlock(&cfm_mutex); + mysql_mutex_unlock(&m_mutex); return names; } std::vector -Column_family_manager::get_all_cf(void) +Rdb_cf_manager::get_all_cf(void) const { std::vector list; - mysql_mutex_lock(&cfm_mutex); - for (auto it : cf_id_map) { + mysql_mutex_lock(&m_mutex); + for (auto it : m_cf_id_map) { list.push_back(it.second); } - mysql_mutex_unlock(&cfm_mutex); + mysql_mutex_unlock(&m_mutex); return list; } diff --git a/storage/rocksdb/rdb_cf_manager.h b/storage/rocksdb/rdb_cf_manager.h index 337bc6074d27..116cbf03fe92 100644 --- a/storage/rocksdb/rdb_cf_manager.h +++ b/storage/rocksdb/rdb_cf_manager.h @@ -18,6 +18,8 @@ /* C++ system header files */ #include +#include +#include /* MySQL header files */ #include "./sql_class.h" @@ -28,15 +30,7 @@ namespace myrocks { /* - Expected from outside: a function that fills CF options for a given name. -*/ -void get_cf_options(const std::string &cf_name, rocksdb::ColumnFamilyOptions *opts); - -void get_per_index_cf_name(const char *db_table_name, const char *index_name, - std::string *res); - -/* - We need a column family manager. Its functions: + We need a Column Family (CF) manager. Its functions: - create column families (synchronized, don't create the same twice) - keep count in each column family. = the count is kept on-disk. @@ -49,13 +43,20 @@ void get_per_index_cf_name(const char *db_table_name, const char *index_name, - CFs are created in a synchronized way. We can't remove them, yet. */ -class Column_family_manager +class Rdb_cf_manager { - std::map cf_name_map; - std::map cf_id_map; + std::map m_cf_name_map; + std::map m_cf_id_map; + + mutable mysql_mutex_t m_mutex; + + static + void get_per_index_cf_name(const char *db_table_name, const char *index_name, + std::string *res); - mysql_mutex_t cfm_mutex; public: + static bool is_cf_name_reverse(const char *name); + /* This is called right after the DB::Open() call. The parameters describe column families that are present in the database. The first CF is the default CF. @@ -78,16 +79,16 @@ class Column_family_manager rocksdb::ColumnFamilyHandle* get_cf(const char *cf_name, const char *db_table_name, const char *index_name, - bool *is_automatic); + bool *is_automatic) const; /* Look up cf by id; used by datadic */ - rocksdb::ColumnFamilyHandle* get_cf(const uint32_t id); + rocksdb::ColumnFamilyHandle* get_cf(const uint32_t id) const; /* Used to iterate over column families for show status */ - std::vector get_cf_names(void); + std::vector get_cf_names(void) const; /* Used to iterate over column families */ - std::vector get_all_cf(void); + std::vector get_all_cf(void) const; // void drop_cf(); -- not implemented so far. }; diff --git a/storage/rocksdb/rdb_cf_options.h b/storage/rocksdb/rdb_cf_options.h index dbb49c17bdbc..39e82191190e 100644 --- a/storage/rocksdb/rdb_cf_options.h +++ b/storage/rocksdb/rdb_cf_options.h @@ -26,8 +26,6 @@ class ColumnFamilyOptions; namespace myrocks { -bool is_cf_name_reverse(const char *name); - /* Per-column family options configs. diff --git a/storage/rocksdb/rdb_datadic.cc b/storage/rocksdb/rdb_datadic.cc index cce5f648e391..734d683f0661 100644 --- a/storage/rocksdb/rdb_datadic.cc +++ b/storage/rocksdb/rdb_datadic.cc @@ -2022,7 +2022,7 @@ bool Table_ddl_manager::validate_schemas(void) } bool Table_ddl_manager::init(Dict_manager *dict_arg, - Column_family_manager *cf_manager, + Rdb_cf_manager *cf_manager, uint32_t validate_tables) { dict= dict_arg; @@ -2673,7 +2673,7 @@ void Binlog_info_manager::update_slave_gtid_info(uint id, const char* db, } } -bool Dict_manager::init(rocksdb::DB *rdb_dict, Column_family_manager *cf_manager) +bool Dict_manager::init(rocksdb::DB *rdb_dict, Rdb_cf_manager *cf_manager) { mysql_mutex_init(0, &mutex, MY_MUTEX_INIT_FAST); rdb= rdb_dict; diff --git a/storage/rocksdb/rdb_datadic.h b/storage/rocksdb/rdb_datadic.h index ecbbfa930c31..68b2a5c6c35b 100644 --- a/storage/rocksdb/rdb_datadic.h +++ b/storage/rocksdb/rdb_datadic.h @@ -36,7 +36,7 @@ namespace myrocks { class Dict_manager; class RDBSE_KEYDEF; class Field_pack_info; -class Column_family_manager; +class Rdb_cf_manager; class Table_ddl_manager; bool is_myrocks_collation_supported(Field *field); @@ -694,7 +694,7 @@ class Table_ddl_manager std::map stats2store; public: /* Load the data dictionary from on-disk storage */ - bool init(Dict_manager *dict_arg, Column_family_manager *cf_manager, + bool init(Dict_manager *dict_arg, Rdb_cf_manager *cf_manager, uint32_t validate_tables); void cleanup(); @@ -846,7 +846,7 @@ class Dict_manager void log_start_drop_index(GL_INDEX_ID gl_index_id, const char* log_action); public: - bool init(rocksdb::DB *rdb_dict, Column_family_manager *cf_manager); + bool init(rocksdb::DB *rdb_dict, Rdb_cf_manager *cf_manager); void cleanup(); void lock(); void unlock(); diff --git a/storage/rocksdb/rdb_i_s.cc b/storage/rocksdb/rdb_i_s.cc index 6c928dd6df9d..a4aa98c2109f 100644 --- a/storage/rocksdb/rdb_i_s.cc +++ b/storage/rocksdb/rdb_i_s.cc @@ -75,7 +75,7 @@ static int i_s_rocksdb_cfstats_fill_table(THD *thd, }; rocksdb::DB *rdb= rocksdb_get_rdb(); - Column_family_manager& cf_manager= rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager= rocksdb_get_cf_manager(); DBUG_ASSERT(rdb != nullptr); for (auto cf_name : cf_manager.get_cf_names()) @@ -376,7 +376,7 @@ static int i_s_rocksdb_cfoptions_fill_table(THD *thd, DBUG_ENTER("i_s_rocksdb_cfoptions_fill_table"); - Column_family_manager& cf_manager = rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager = rocksdb_get_cf_manager(); for (auto cf_name : cf_manager.get_cf_names()) { @@ -724,7 +724,7 @@ static int i_s_rocksdb_global_info_fill_table(THD *thd, /* cf_id -> cf_flags */ char cf_id_buf[INT_BUF_LEN]= {0}; char cf_value_buf[FN_REFLEN+1] = {0}; - Column_family_manager& cf_manager = rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager = rocksdb_get_cf_manager(); for (auto cf_handle : cf_manager.get_all_cf()) { uint flags; dict_manager->get_cf_flags(cf_handle->GetID(), &flags); @@ -943,7 +943,7 @@ static int i_s_rocksdb_index_file_map_fill_table( rocksdb::DB *rdb= rocksdb_get_rdb(); DBUG_ASSERT(rdb != nullptr); - Column_family_manager& cf_manager = rocksdb_get_cf_manager(); + Rdb_cf_manager& cf_manager = rocksdb_get_cf_manager(); for (auto cf_handle : cf_manager.get_all_cf()) { /* Grab the the properties of all the tables in the column family */ rocksdb::TablePropertiesCollection table_props_collection;