diff --git a/src/observer/CMakeLists.txt b/src/observer/CMakeLists.txt index 173e07942b..8d06a21ea7 100644 --- a/src/observer/CMakeLists.txt +++ b/src/observer/CMakeLists.txt @@ -225,6 +225,7 @@ ob_set_subtarget(ob_server virtual_table virtual_table/ob_all_virtual_lock_wait_stat.cpp virtual_table/ob_all_virtual_long_ops_status.cpp virtual_table/ob_all_virtual_ls_info.cpp + virtual_table/ob_all_virtual_timestamp_service.cpp virtual_table/ob_all_virtual_transaction_freeze_checkpoint.cpp virtual_table/ob_all_virtual_transaction_checkpoint.cpp virtual_table/ob_all_virtual_checkpoint.cpp diff --git a/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp b/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp new file mode 100644 index 0000000000..ee52bb815f --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_timestamp_service.cpp @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#include "observer/virtual_table/ob_all_virtual_timestamp_service.h" +#include "lib/time/ob_time_utility.h" +#include "observer/ob_server.h" +#include "observer/ob_server_utils.h" +#include "storage/tx_storage/ob_ls_service.h" + +using namespace oceanbase::common; +using namespace oceanbase::share; +using namespace oceanbase::share::schema; +using namespace oceanbase::transaction; + +namespace oceanbase +{ +namespace observer +{ + +void ObAllVirtualTimestampService::reset() +{ + init_ = false; + tenant_ids_index_ = 0; + cur_tenant_id_ = 0; + ts_value_ = 0; + service_role_ = ObTimestampAccess::ServiceType::FOLLOWER; + is_primary_ = false; + role_ = common::ObRole::FOLLOWER; + service_epoch_ = 0; + all_tenants_.reset(); + ObVirtualTableScannerIterator::reset(); +} + +int ObAllVirtualTimestampService::prepare_start_to_read_() +{ + int ret = OB_SUCCESS; + const int64_t execute_timeout = 10 * 1000 * 1000; // 10s + if (OB_FAIL(fill_tenant_ids_())) { + SERVER_LOG(WARN, "fail to fill tenant ids", K(ret)); + } else { + start_to_read_ = true; + } + return ret; +} + +int ObAllVirtualTimestampService::get_next_tenant_id_info_() +{ + int ret = OB_SUCCESS; + if (tenant_ids_index_ >= all_tenants_.count()) { + ret = OB_ITER_END; + } + if (OB_SUCC(ret)) { + cur_tenant_id_ = all_tenants_.at(tenant_ids_index_); + MTL_SWITCH(cur_tenant_id_) { + bool exist = false; + if (OB_FAIL(MTL(ObLSService*)->check_ls_exist(IDS_LS, exist))) { + SERVER_LOG(WARN, "check ls exist fail", K(ret), K_(cur_tenant_id)); + } else if (!exist) { + ret = OB_LS_NOT_EXIST; + tenant_ids_index_++; + } else { + MTL(ObTimestampAccess *)->get_virtual_info(ts_value_, service_role_, role_, service_epoch_); + is_primary_ = MTL_IS_PRIMARY_TENANT(); + tenant_ids_index_++; + } + } else { + tenant_ids_index_++; + } + } + + return ret; +} + +int ObAllVirtualTimestampService::fill_tenant_ids_() +{ + int ret = OB_SUCCESS; + + if (OB_INVALID_TENANT_ID == effective_tenant_id_) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(ERROR, "invalid tenant_id", KR(ret), K_(effective_tenant_id)); + } else if (OB_ISNULL(GCTX.omt_)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "failed to get multi tenant from GCTX", K(ret)); + } else { + omt::TenantIdList tmp_all_tenants; + tmp_all_tenants.set_label(ObModIds::OB_TENANT_ID_LIST); + GCTX.omt_->get_tenant_ids(tmp_all_tenants); + for (int64_t i = 0; OB_SUCC(ret) && i < tmp_all_tenants.size(); ++i) { + uint64_t tenant_id = tmp_all_tenants[i]; + if (!is_virtual_tenant_id(tenant_id) && // skip virtual tenant + (is_sys_tenant(effective_tenant_id_) || tenant_id == effective_tenant_id_)) { + if (OB_FAIL(all_tenants_.push_back(tenant_id))) { + SERVER_LOG(WARN, "fail to push back effective_tenant_id", KR(ret), K(tenant_id)); + } + } + } + SERVER_LOG(INFO, "succeed to get tenant ids", K(all_tenants_)); + } + + return ret; +} + +int ObAllVirtualTimestampService::inner_get_next_row(ObNewRow *&row) +{ + int ret = OB_SUCCESS; + + if (!start_to_read_ && OB_FAIL(prepare_start_to_read_())) { + SERVER_LOG(WARN, "prepare start to read error", K(ret), K(start_to_read_)); + } else { + do { + if (OB_FAIL(get_next_tenant_id_info_())) { + if (OB_ITER_END != ret && OB_LS_NOT_EXIST != ret) { + SERVER_LOG(WARN, "ObAllVirtualTimestampService iter error", K(ret)); + } + } + } while (OB_TENANT_NOT_IN_SERVER == ret || OB_LS_NOT_EXIST == ret); + } + if (OB_SUCC(ret)) { + SERVER_LOG(INFO, "ObAllVirtualTimestampService iter success", K(*this)); + const ObAddr self = GCTX.self_addr(); + const int64_t col_count = output_column_ids_.count(); + for (int64_t i = 0; OB_SUCC(ret) && i < col_count; ++i) { + uint64_t col_id = output_column_ids_.at(i); + switch (col_id) { + case OB_APP_MIN_COLUMN_ID: { // tenant_id + cur_row_.cells_[i].set_int(cur_tenant_id_); + break; + } + case OB_APP_MIN_COLUMN_ID + 1: { // svr_ip + if (false == self.ip_to_string(ip_buf_, common::OB_IP_STR_BUFF)) { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "ip_to_string failed", K(ret), K(self)); + } else { + cur_row_.cells_[i].set_varchar(ObString::make_string(ip_buf_)); + cur_row_.cells_[i].set_collation_type(ObCharset::get_default_collation( + ObCharset::get_default_charset())); + } + break; + } + case OB_APP_MIN_COLUMN_ID + 2: { // svr_port + cur_row_.cells_[i].set_int(self.get_port()); + break; + } + case OB_APP_MIN_COLUMN_ID + 3: { // ts_value + cur_row_.cells_[i].set_int(ts_value_); + break; + } + case OB_APP_MIN_COLUMN_ID + 4: { // ts_type + cur_row_.cells_[i].set_varchar(ObTimestampAccess::ts_type_to_cstr(is_primary_)); + cur_row_.cells_[i].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case OB_APP_MIN_COLUMN_ID + 5: { // service_role + cur_row_.cells_[i].set_varchar((ObTimestampAccess::service_type_to_cstr(service_role_))); + cur_row_.cells_[i].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + break; + } + case OB_APP_MIN_COLUMN_ID + 6: { // role + if (OB_FAIL(role_to_string(role_, role_str_, sizeof(role_str_)))) { + SERVER_LOG(WARN, "role_to_string failed", K(ret), K_(role)); + } else { + cur_row_.cells_[i].set_varchar(ObString::make_string(role_str_)); + cur_row_.cells_[i].set_collation_type(ObCharset::get_default_collation( + ObCharset::get_default_charset())); + } + break; + } + case OB_APP_MIN_COLUMN_ID + 7: { // service_epoch + cur_row_.cells_[i].set_int(service_epoch_); + break; + } + default: { + ret = OB_ERR_UNEXPECTED; + SERVER_LOG(WARN, "invalid coloum_id", K(ret), K(col_id)); + break; + } + } // switch + } // for + + if (OB_SUCC(ret)) { + row = &cur_row_; + } + } + return ret; +} + +} // observer +} // oceanbase diff --git a/src/observer/virtual_table/ob_all_virtual_timestamp_service.h b/src/observer/virtual_table/ob_all_virtual_timestamp_service.h new file mode 100644 index 0000000000..93edc5d60c --- /dev/null +++ b/src/observer/virtual_table/ob_all_virtual_timestamp_service.h @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#ifndef OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_H_ +#define OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_H_ + +#include "share/ob_virtual_table_scanner_iterator.h" +#include "storage/tx/ob_timestamp_access.h" +#include "lib/container/ob_array.h" + +namespace oceanbase +{ +namespace share +{ +namespace schema +{ +class ObMultiVersionSchemaService; +class ObSchemaGetterGuard; +} +} + +namespace observer +{ +class ObAllVirtualTimestampService: public common::ObVirtualTableScannerIterator +{ +public: + explicit ObAllVirtualTimestampService() { reset(); } + virtual ~ObAllVirtualTimestampService() { destroy(); } +public: + virtual void reset(); + virtual void destroy() { reset(); } + virtual int inner_get_next_row(common::ObNewRow *&row); + TO_STRING_KV("tenant_id", cur_tenant_id_, K_(ts_value), + K_(service_role), K_(is_primary), + K_(role), K_(service_epoch)); +private: + int prepare_start_to_read_(); + int get_next_tenant_id_info_(); + int fill_tenant_ids_(); +private: + bool init_; + int64_t tenant_ids_index_; + int64_t expire_time_; + char ip_buf_[common::OB_IP_STR_BUFF]; + int64_t cur_tenant_id_; + int64_t ts_value_; + transaction::ObTimestampAccess::ServiceType service_role_; + bool is_primary_; + common::ObRole role_; + char role_str_[32]; + int64_t service_epoch_; + common::ObArray all_tenants_; +private: + DISALLOW_COPY_AND_ASSIGN(ObAllVirtualTimestampService); +}; +} // observer +} // oceanbase +#endif // OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_H_ diff --git a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp index fc04eadea8..329bc3f137 100644 --- a/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp +++ b/src/observer/virtual_table/ob_virtual_table_iterator_factory.cpp @@ -117,6 +117,7 @@ #include "observer/virtual_table/ob_iterate_virtual_table.h" #include "observer/virtual_table/ob_iterate_private_virtual_table.h" // ObIteratePrivateVirtualTable #include "observer/virtual_table/ob_all_virtual_id_service.h" +#include "observer/virtual_table/ob_all_virtual_timestamp_service.h" #include "rootserver/ob_root_service.h" #include "rootserver/virtual_table/ob_core_meta_table.h" #include "rootserver/virtual_table/ob_virtual_core_inner_table.h" @@ -2030,6 +2031,15 @@ int ObVTIterCreator::create_vt_iter(ObVTableScanParam ¶ms, } break; } + case OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID: { + ObAllVirtualTimestampService *timestamp_service = NULL; + if (OB_FAIL(NEW_VIRTUAL_TABLE(ObAllVirtualTimestampService, timestamp_service))) { + SERVER_LOG(ERROR, "ObAllVirtualTimestampService construct fail", K(ret)); + } else { + vt_iter = static_cast(timestamp_service); + } + break; + } case OB_ALL_VIRTUAL_OPEN_CURSOR_TID: { ObVirtualOpenCursorTable *open_cursors = NULL; if (OB_FAIL(NEW_VIRTUAL_TABLE(ObVirtualOpenCursorTable, open_cursors))) { diff --git a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp index a7d4e2046f..8c3183eb58 100644 --- a/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12351_12400.cpp @@ -3988,6 +3988,180 @@ int ObInnerTableSchema::all_virtual_virtual_long_ops_status_mysql_sys_agent_sche return ret; } +int ObInnerTableSchema::all_virtual_timestamp_service_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("tenant_id", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_ip", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("svr_port", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ts_value", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ts_type", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 100, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("service_role", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 100, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("role", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_INVALID, //column_collation_type + 100, //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("service_epoch", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObIntType, //column_type + CS_TYPE_INVALID, //column_collation_type + sizeof(int64_t), //column_length + -1, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST_COLUMNS); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("svr_ip, svr_port"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.15351_15400.cpp b/src/share/inner_table/ob_inner_table_schema.15351_15400.cpp new file mode 100644 index 0000000000..fba14d283a --- /dev/null +++ b/src/share/inner_table/ob_inner_table_schema.15351_15400.cpp @@ -0,0 +1,204 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE_SCHEMA +#include "ob_inner_table_schema.h" + +#include "share/schema/ob_schema_macro_define.h" +#include "share/schema/ob_schema_service_sql_impl.h" +#include "share/schema/ob_table_schema.h" +#include "share/scn.h" + +namespace oceanbase +{ +using namespace share::schema; +using namespace common; +namespace share +{ + +int ObInnerTableSchema::all_virtual_timestamp_service_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(VIRTUAL_TABLE); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCollationType::CS_TYPE_UTF8MB4_BIN); + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TENANT_ID", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_IP", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 1, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + MAX_IP_ADDR_LENGTH, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SVR_PORT", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 2, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TS_VALUE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("TS_TYPE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 100, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SERVICE_ROLE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 100, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("ROLE", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObVarcharType, //column_type + CS_TYPE_UTF8MB4_BIN, //column_collation_type + 100, //column_length + 2, //column_precision + -1, //column_scale + false, //is_nullable + false); //is_autoincrement + } + + if (OB_SUCC(ret)) { + ADD_COLUMN_SCHEMA("SERVICE_EPOCH", //column_name + ++column_id, //column_id + 0, //rowkey_id + 0, //index_id + 0, //part_key_pos + ObNumberType, //column_type + CS_TYPE_INVALID, //column_collation_type + 38, //column_length + 38, //column_precision + 0, //column_scale + false, //is_nullable + false); //is_autoincrement + } + if (OB_SUCC(ret)) { + table_schema.get_part_option().set_part_num(1); + table_schema.set_part_level(PARTITION_LEVEL_ONE); + table_schema.get_part_option().set_part_func_type(PARTITION_FUNC_TYPE_LIST); + if (OB_FAIL(table_schema.get_part_option().set_part_expr("SVR_IP, SVR_PORT"))) { + LOG_WARN("set_part_expr failed", K(ret)); + } else if (OB_FAIL(table_schema.mock_list_partition_array())) { + LOG_WARN("mock list partition array failed", K(ret)); + } + } + table_schema.set_index_using_type(USING_HASH); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + + +} // end namespace share +} // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp new file mode 100644 index 0000000000..8f474163bb --- /dev/null +++ b/src/share/inner_table/ob_inner_table_schema.21401_21450.cpp @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2021 OceanBase + * OceanBase CE is licensed under Mulan PubL v2. + * You can use this software according to the terms and conditions of the Mulan PubL v2. + * You may obtain a copy of Mulan PubL v2 at: + * http://license.coscl.org.cn/MulanPubL-2.0 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PubL v2 for more details. + */ + +#define USING_LOG_PREFIX SHARE_SCHEMA +#include "ob_inner_table_schema.h" + +#include "share/schema/ob_schema_macro_define.h" +#include "share/schema/ob_schema_service_sql_impl.h" +#include "share/schema/ob_table_schema.h" +#include "share/scn.h" + +namespace oceanbase +{ +using namespace share::schema; +using namespace common; +namespace share +{ + +int ObInnerTableSchema::v_ob_timestamp_service_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_TIMESTAMP_SERVICE_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_TIMESTAMP_SERVICE_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, TS_TYPE, TS_VALUE, SVR_IP, SVR_PORT FROM oceanbase.__all_virtual_timestamp_service WHERE ROLE = 'LEADER' AND SERVICE_EPOCH = (SELECT MAX(SERVICE_EPOCH) FROM oceanbase.__all_virtual_timestamp_service) )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + + +} // end namespace share +} // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp index 89f4b95989..1bbc120ead 100644 --- a/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp +++ b/src/share/inner_table/ob_inner_table_schema.28151_28200.cpp @@ -875,6 +875,56 @@ int ObInnerTableSchema::v_ob_thread_ora_schema(ObTableSchema &table_schema) return ret; } +int ObInnerTableSchema::v_ob_timestamp_service_ora_schema(ObTableSchema &table_schema) +{ + int ret = OB_SUCCESS; + uint64_t column_id = OB_APP_MIN_COLUMN_ID - 1; + + //generated fields: + table_schema.set_tenant_id(OB_SYS_TENANT_ID); + table_schema.set_tablegroup_id(OB_INVALID_ID); + table_schema.set_database_id(OB_ORA_SYS_DATABASE_ID); + table_schema.set_table_id(OB_V_OB_TIMESTAMP_SERVICE_ORA_TID); + table_schema.set_rowkey_split_pos(0); + table_schema.set_is_use_bloomfilter(false); + table_schema.set_progressive_merge_num(0); + table_schema.set_rowkey_column_num(0); + table_schema.set_load_type(TABLE_LOAD_TYPE_IN_DISK); + table_schema.set_table_type(SYSTEM_VIEW); + table_schema.set_index_type(INDEX_TYPE_IS_NOT); + table_schema.set_def_type(TABLE_DEF_TYPE_INTERNAL); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_table_name(OB_V_OB_TIMESTAMP_SERVICE_ORA_TNAME))) { + LOG_ERROR("fail to set table_name", K(ret)); + } + } + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_compress_func_name(OB_DEFAULT_COMPRESS_FUNC_NAME))) { + LOG_ERROR("fail to set compress_func_name", K(ret)); + } + } + table_schema.set_part_level(PARTITION_LEVEL_ZERO); + table_schema.set_charset_type(ObCharset::get_default_charset()); + table_schema.set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); + + if (OB_SUCC(ret)) { + if (OB_FAIL(table_schema.set_view_definition(R"__( SELECT TENANT_ID, TS_TYPE, TS_VALUE, SVR_IP, SVR_PORT FROM SYS.ALL_VIRTUAL_TIMESTAMP_SERVICE WHERE ROLE = 'LEADER' AND SERVICE_EPOCH = (SELECT MAX(SERVICE_EPOCH) FROM SYS.ALL_VIRTUAL_TIMESTAMP_SERVICE) )__"))) { + LOG_ERROR("fail to set view_definition", K(ret)); + } + } + table_schema.set_index_using_type(USING_BTREE); + table_schema.set_row_store_type(ENCODING_ROW_STORE); + table_schema.set_store_format(OB_STORE_FORMAT_DYNAMIC_MYSQL); + table_schema.set_progressive_merge_round(1); + table_schema.set_storage_format_version(3); + table_schema.set_tablet_id(0); + + table_schema.set_max_used_column_id(column_id); + return ret; +} + int ObInnerTableSchema::all_table_idx_data_table_id_schema(ObTableSchema &table_schema) { int ret = OB_SUCCESS; diff --git a/src/share/inner_table/ob_inner_table_schema.h b/src/share/inner_table/ob_inner_table_schema.h index c4df75d39c..0759f27e01 100644 --- a/src/share/inner_table/ob_inner_table_schema.h +++ b/src/share/inner_table/ob_inner_table_schema.h @@ -873,6 +873,7 @@ public: static int all_virtual_io_scheduler_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_thread_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_virtual_long_ops_status_mysql_sys_agent_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_timestamp_service_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_sql_audit_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_plan_stat_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_plan_cache_plan_explain_ora_schema(share::schema::ObTableSchema &table_schema); @@ -1083,6 +1084,7 @@ public: static int all_virtual_archive_dest_status_ora_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_long_ops_status_sys_agent_schema(share::schema::ObTableSchema &table_schema); static int all_virtual_thread_ora_schema(share::schema::ObTableSchema &table_schema); + static int all_virtual_timestamp_service_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_plan_cache_stat_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_plan_cache_plan_stat_schema(share::schema::ObTableSchema &table_schema); static int schemata_schema(share::schema::ObTableSchema &table_schema); @@ -1374,6 +1376,7 @@ public: static int dba_ob_rsrc_io_directives_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_thread_schema(share::schema::ObTableSchema &table_schema); static int v_ob_thread_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_timestamp_service_schema(share::schema::ObTableSchema &table_schema); static int dba_synonyms_schema(share::schema::ObTableSchema &table_schema); static int dba_objects_ora_schema(share::schema::ObTableSchema &table_schema); static int all_objects_schema(share::schema::ObTableSchema &table_schema); @@ -1750,6 +1753,7 @@ public: static int v_session_longops_ora_schema(share::schema::ObTableSchema &table_schema); static int gv_ob_thread_ora_schema(share::schema::ObTableSchema &table_schema); static int v_ob_thread_ora_schema(share::schema::ObTableSchema &table_schema); + static int v_ob_timestamp_service_ora_schema(share::schema::ObTableSchema &table_schema); static int all_table_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_column_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); static int all_ddl_operation_aux_lob_meta_schema(share::schema::ObTableSchema &table_schema); @@ -2932,6 +2936,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_io_scheduler_schema, ObInnerTableSchema::all_virtual_thread_schema, ObInnerTableSchema::all_virtual_virtual_long_ops_status_mysql_sys_agent_schema, + ObInnerTableSchema::all_virtual_timestamp_service_schema, ObInnerTableSchema::all_virtual_sql_plan_monitor_all_virtual_sql_plan_monitor_i1_schema, ObInnerTableSchema::all_virtual_sql_audit_all_virtual_sql_audit_i1_schema, ObInnerTableSchema::all_virtual_sysstat_all_virtual_sysstat_i1_schema, @@ -3151,6 +3156,7 @@ const schema_create_func virtual_table_schema_creators [] = { ObInnerTableSchema::all_virtual_archive_dest_status_ora_schema, ObInnerTableSchema::all_virtual_long_ops_status_sys_agent_schema, ObInnerTableSchema::all_virtual_thread_ora_schema, + ObInnerTableSchema::all_virtual_timestamp_service_ora_schema, ObInnerTableSchema::all_virtual_sql_plan_monitor_ora_all_virtual_sql_plan_monitor_i1_schema, ObInnerTableSchema::all_virtual_system_event_ora_all_virtual_system_event_i1_schema, ObInnerTableSchema::all_virtual_sysstat_ora_all_virtual_sysstat_i1_schema, @@ -3453,6 +3459,7 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::dba_ob_rsrc_io_directives_schema, ObInnerTableSchema::gv_ob_thread_schema, ObInnerTableSchema::v_ob_thread_schema, + ObInnerTableSchema::v_ob_timestamp_service_schema, ObInnerTableSchema::dba_synonyms_schema, ObInnerTableSchema::dba_objects_ora_schema, ObInnerTableSchema::all_objects_schema, @@ -3829,6 +3836,7 @@ const schema_create_func sys_view_schema_creators [] = { ObInnerTableSchema::v_session_longops_ora_schema, ObInnerTableSchema::gv_ob_thread_ora_schema, ObInnerTableSchema::v_ob_thread_ora_schema, + ObInnerTableSchema::v_ob_timestamp_service_ora_schema, NULL,}; const schema_create_func core_index_table_schema_creators [] = { @@ -4310,6 +4318,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TID, OB_ALL_VIRTUAL_THREAD_TID, OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TID, OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID, @@ -4528,6 +4537,7 @@ const uint64_t tenant_space_tables [] = { OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID, OB_ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT_TID, OB_ALL_VIRTUAL_THREAD_ORA_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID, OB_GV_OB_PLAN_CACHE_STAT_TID, OB_GV_OB_PLAN_CACHE_PLAN_STAT_TID, OB_SCHEMATA_TID, @@ -4742,6 +4752,7 @@ const uint64_t tenant_space_tables [] = { OB_DBA_OB_RSRC_IO_DIRECTIVES_TID, OB_GV_OB_THREAD_TID, OB_V_OB_THREAD_TID, + OB_V_OB_TIMESTAMP_SERVICE_TID, OB_DBA_SYNONYMS_TID, OB_DBA_OBJECTS_ORA_TID, OB_ALL_OBJECTS_TID, @@ -5118,6 +5129,7 @@ const uint64_t tenant_space_tables [] = { OB_V_SESSION_LONGOPS_ORA_TID, OB_GV_OB_THREAD_ORA_TID, OB_V_OB_THREAD_ORA_TID, + OB_V_OB_TIMESTAMP_SERVICE_ORA_TID, OB_ALL_TABLE_IDX_DATA_TABLE_ID_TID, OB_ALL_TABLE_IDX_DB_TB_NAME_TID, OB_ALL_TABLE_IDX_TB_NAME_TID, @@ -5743,7 +5755,8 @@ const uint64_t all_ora_mapping_virtual_table_org_tables [] = { OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_TID, OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_TID, OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TID, - OB_ALL_VIRTUAL_THREAD_TID, }; + OB_ALL_VIRTUAL_THREAD_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID, }; const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID , OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID @@ -5857,6 +5870,7 @@ const uint64_t all_ora_mapping_virtual_tables [] = { OB_ALL_VIRTUAL_SQL_AUDIT_O , OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TID , OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID , OB_ALL_VIRTUAL_THREAD_ORA_TID +, OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID , }; /* start/end_pos is start/end postition for column with tenant id */ @@ -6243,6 +6257,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TNAME, OB_ALL_VIRTUAL_THREAD_TNAME, OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TNAME, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TNAME, OB_ALL_VIRTUAL_PLAN_STAT_ORA_TNAME, @@ -6461,6 +6476,7 @@ const char* const tenant_space_table_names [] = { OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TNAME, OB_ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT_TNAME, OB_ALL_VIRTUAL_THREAD_ORA_TNAME, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TNAME, OB_GV_OB_PLAN_CACHE_STAT_TNAME, OB_GV_OB_PLAN_CACHE_PLAN_STAT_TNAME, OB_SCHEMATA_TNAME, @@ -6675,6 +6691,7 @@ const char* const tenant_space_table_names [] = { OB_DBA_OB_RSRC_IO_DIRECTIVES_TNAME, OB_GV_OB_THREAD_TNAME, OB_V_OB_THREAD_TNAME, + OB_V_OB_TIMESTAMP_SERVICE_TNAME, OB_DBA_SYNONYMS_TNAME, OB_DBA_OBJECTS_ORA_TNAME, OB_ALL_OBJECTS_TNAME, @@ -7051,6 +7068,7 @@ const char* const tenant_space_table_names [] = { OB_V_SESSION_LONGOPS_ORA_TNAME, OB_GV_OB_THREAD_ORA_TNAME, OB_V_OB_THREAD_ORA_TNAME, + OB_V_OB_TIMESTAMP_SERVICE_ORA_TNAME, OB_ALL_TABLE_IDX_DATA_TABLE_ID_TNAME, OB_ALL_TABLE_IDX_DB_TB_NAME_TNAME, OB_ALL_TABLE_IDX_TB_NAME_TNAME, @@ -7692,6 +7710,7 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_SQL_PLAN_TID, OB_ALL_VIRTUAL_MALLOC_SAMPLE_INFO_TID, OB_ALL_VIRTUAL_THREAD_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, OB_ALL_VIRTUAL_SQL_AUDIT_ORA_ALL_VIRTUAL_SQL_AUDIT_I1_TID, OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID, @@ -7749,7 +7768,8 @@ const uint64_t tenant_distributed_vtables [] = { OB_ALL_VIRTUAL_ARCHIVE_STAT_ORA_TID, OB_ALL_VIRTUAL_SQL_PLAN_ORA_TID, OB_ALL_VIRTUAL_TRANS_SCHEDULER_ORA_TID, - OB_ALL_VIRTUAL_THREAD_ORA_TID, }; + OB_ALL_VIRTUAL_THREAD_ORA_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID, }; const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID, @@ -7837,7 +7857,8 @@ const uint64_t restrict_access_virtual_tables[] = { OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_ORA_TID, OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TID, OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID, - OB_ALL_VIRTUAL_THREAD_ORA_TID }; + OB_ALL_VIRTUAL_THREAD_ORA_TID, + OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID }; static inline bool is_restrict_access_virtual_table(const uint64_t tid) @@ -9886,11 +9907,11 @@ static inline int get_sys_table_lob_aux_schema(const uint64_t tid, const int64_t OB_CORE_TABLE_COUNT = 4; const int64_t OB_SYS_TABLE_COUNT = 230; -const int64_t OB_VIRTUAL_TABLE_COUNT = 581; -const int64_t OB_SYS_VIEW_COUNT = 667; -const int64_t OB_SYS_TENANT_TABLE_COUNT = 1483; +const int64_t OB_VIRTUAL_TABLE_COUNT = 583; +const int64_t OB_SYS_VIEW_COUNT = 669; +const int64_t OB_SYS_TENANT_TABLE_COUNT = 1487; const int64_t OB_CORE_SCHEMA_VERSION = 1; -const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1486; +const int64_t OB_BOOTSTRAP_SCHEMA_VERSION = 1490; } // end namespace share } // end namespace oceanbase diff --git a/src/share/inner_table/ob_inner_table_schema_constants.h b/src/share/inner_table/ob_inner_table_schema_constants.h index 7dd6430a9b..4d6f37d2ec 100644 --- a/src/share/inner_table/ob_inner_table_schema_constants.h +++ b/src/share/inner_table/ob_inner_table_schema_constants.h @@ -615,6 +615,7 @@ const uint64_t OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TID = 12366; // "__all_virtual const uint64_t OB_ALL_VIRTUAL_IO_SCHEDULER_TID = 12369; // "__all_virtual_io_scheduler" const uint64_t OB_ALL_VIRTUAL_THREAD_TID = 12384; // "__all_virtual_thread" const uint64_t OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TID = 12393; // "__all_virtual_virtual_long_ops_status_mysql_sys_agent" +const uint64_t OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TID = 12395; // "__all_virtual_timestamp_service" const uint64_t OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TID = 15009; // "ALL_VIRTUAL_SQL_AUDIT_ORA" const uint64_t OB_ALL_VIRTUAL_PLAN_STAT_ORA_TID = 15010; // "ALL_VIRTUAL_PLAN_STAT_ORA" const uint64_t OB_ALL_VIRTUAL_PLAN_CACHE_PLAN_EXPLAIN_ORA_TID = 15012; // "ALL_VIRTUAL_PLAN_CACHE_PLAN_EXPLAIN_ORA" @@ -825,6 +826,7 @@ const uint64_t OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TID = 15289; // "A const uint64_t OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TID = 15290; // "ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA" const uint64_t OB_ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT_TID = 15297; // "ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT" const uint64_t OB_ALL_VIRTUAL_THREAD_ORA_TID = 15298; // "ALL_VIRTUAL_THREAD_ORA" +const uint64_t OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TID = 15385; // "ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA" const uint64_t OB_GV_OB_PLAN_CACHE_STAT_TID = 20001; // "GV$OB_PLAN_CACHE_STAT" const uint64_t OB_GV_OB_PLAN_CACHE_PLAN_STAT_TID = 20002; // "GV$OB_PLAN_CACHE_PLAN_STAT" const uint64_t OB_SCHEMATA_TID = 20003; // "SCHEMATA" @@ -1116,6 +1118,7 @@ const uint64_t OB_CDB_OB_LS_LOG_ARCHIVE_PROGRESS_TID = 21364; // "CDB_OB_LS_LOG_ const uint64_t OB_DBA_OB_RSRC_IO_DIRECTIVES_TID = 21369; // "DBA_OB_RSRC_IO_DIRECTIVES" const uint64_t OB_GV_OB_THREAD_TID = 21380; // "GV$OB_THREAD" const uint64_t OB_V_OB_THREAD_TID = 21381; // "V$OB_THREAD" +const uint64_t OB_V_OB_TIMESTAMP_SERVICE_TID = 21404; // "V$OB_TIMESTAMP_SERVICE" const uint64_t OB_DBA_SYNONYMS_TID = 25001; // "DBA_SYNONYMS" const uint64_t OB_DBA_OBJECTS_ORA_TID = 25002; // "DBA_OBJECTS_ORA" const uint64_t OB_ALL_OBJECTS_TID = 25003; // "ALL_OBJECTS" @@ -1492,6 +1495,7 @@ const uint64_t OB_GV_SESSION_LONGOPS_ORA_TID = 28185; // "GV$SESSION_LONGOPS_ORA const uint64_t OB_V_SESSION_LONGOPS_ORA_TID = 28186; // "V$SESSION_LONGOPS_ORA" const uint64_t OB_GV_OB_THREAD_ORA_TID = 28187; // "GV$OB_THREAD_ORA" const uint64_t OB_V_OB_THREAD_ORA_TID = 28188; // "V$OB_THREAD_ORA" +const uint64_t OB_V_OB_TIMESTAMP_SERVICE_ORA_TID = 28193; // "V$OB_TIMESTAMP_SERVICE_ORA" const uint64_t OB_ALL_TABLE_AUX_LOB_META_TID = 50003; // "__all_table_aux_lob_meta" const uint64_t OB_ALL_COLUMN_AUX_LOB_META_TID = 50004; // "__all_column_aux_lob_meta" const uint64_t OB_ALL_DDL_OPERATION_AUX_LOB_META_TID = 50005; // "__all_ddl_operation_aux_lob_meta" @@ -2658,6 +2662,7 @@ const char *const OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_TNAME = "__all_virtual_arch const char *const OB_ALL_VIRTUAL_IO_SCHEDULER_TNAME = "__all_virtual_io_scheduler"; const char *const OB_ALL_VIRTUAL_THREAD_TNAME = "__all_virtual_thread"; const char *const OB_ALL_VIRTUAL_VIRTUAL_LONG_OPS_STATUS_MYSQL_SYS_AGENT_TNAME = "__all_virtual_virtual_long_ops_status_mysql_sys_agent"; +const char *const OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_TNAME = "__all_virtual_timestamp_service"; const char *const OB_ALL_VIRTUAL_SQL_AUDIT_ORA_TNAME = "ALL_VIRTUAL_SQL_AUDIT"; const char *const OB_ALL_VIRTUAL_PLAN_STAT_ORA_TNAME = "ALL_VIRTUAL_PLAN_STAT"; const char *const OB_ALL_VIRTUAL_PLAN_CACHE_PLAN_EXPLAIN_ORA_TNAME = "ALL_VIRTUAL_PLAN_CACHE_PLAN_EXPLAIN"; @@ -2868,6 +2873,7 @@ const char *const OB_ALL_VIRTUAL_LS_ARB_REPLICA_TASK_HISTORY_ORA_TNAME = "ALL_VI const char *const OB_ALL_VIRTUAL_ARCHIVE_DEST_STATUS_ORA_TNAME = "ALL_VIRTUAL_ARCHIVE_DEST_STATUS"; const char *const OB_ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT_TNAME = "ALL_VIRTUAL_LONG_OPS_STATUS_SYS_AGENT"; const char *const OB_ALL_VIRTUAL_THREAD_ORA_TNAME = "ALL_VIRTUAL_THREAD"; +const char *const OB_ALL_VIRTUAL_TIMESTAMP_SERVICE_ORA_TNAME = "ALL_VIRTUAL_TIMESTAMP_SERVICE"; const char *const OB_GV_OB_PLAN_CACHE_STAT_TNAME = "GV$OB_PLAN_CACHE_STAT"; const char *const OB_GV_OB_PLAN_CACHE_PLAN_STAT_TNAME = "GV$OB_PLAN_CACHE_PLAN_STAT"; const char *const OB_SCHEMATA_TNAME = "SCHEMATA"; @@ -3159,6 +3165,7 @@ const char *const OB_CDB_OB_LS_LOG_ARCHIVE_PROGRESS_TNAME = "CDB_OB_LS_LOG_ARCHI const char *const OB_DBA_OB_RSRC_IO_DIRECTIVES_TNAME = "DBA_OB_RSRC_IO_DIRECTIVES"; const char *const OB_GV_OB_THREAD_TNAME = "GV$OB_THREAD"; const char *const OB_V_OB_THREAD_TNAME = "V$OB_THREAD"; +const char *const OB_V_OB_TIMESTAMP_SERVICE_TNAME = "V$OB_TIMESTAMP_SERVICE"; const char *const OB_DBA_SYNONYMS_TNAME = "DBA_SYNONYMS"; const char *const OB_DBA_OBJECTS_ORA_TNAME = "DBA_OBJECTS"; const char *const OB_ALL_OBJECTS_TNAME = "ALL_OBJECTS"; @@ -3535,6 +3542,7 @@ const char *const OB_GV_SESSION_LONGOPS_ORA_TNAME = "GV$SESSION_LONGOPS"; const char *const OB_V_SESSION_LONGOPS_ORA_TNAME = "V$SESSION_LONGOPS"; const char *const OB_GV_OB_THREAD_ORA_TNAME = "GV$OB_THREAD"; const char *const OB_V_OB_THREAD_ORA_TNAME = "V$OB_THREAD"; +const char *const OB_V_OB_TIMESTAMP_SERVICE_ORA_TNAME = "V$OB_TIMESTAMP_SERVICE"; const char *const OB_ALL_TABLE_AUX_LOB_META_TNAME = "__all_table_aux_lob_meta"; const char *const OB_ALL_COLUMN_AUX_LOB_META_TNAME = "__all_column_aux_lob_meta"; const char *const OB_ALL_DDL_OPERATION_AUX_LOB_META_TNAME = "__all_ddl_operation_aux_lob_meta"; diff --git a/src/share/inner_table/ob_inner_table_schema_def.py b/src/share/inner_table/ob_inner_table_schema_def.py index 806a7ce464..1e4d13492f 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -11539,9 +11539,32 @@ def_table_schema( # 12392: __all_virtual_kv_connection def_table_schema(**gen_mysql_sys_agent_virtual_table_def('12393', all_def_keywords['__all_virtual_long_ops_status'])) # 12394: __all_virtual_ls_transfer_member_list_lock_info -# 12395: __all_virtual_timestamp_service + +def_table_schema( + owner = 'lixinze.lxz', + table_name = '__all_virtual_timestamp_service', + table_id = '12395', + table_type = 'VIRTUAL_TABLE', + in_tenant_space = True, + gm_columns = [], + rowkey_columns = [], + normal_columns = [ + ('tenant_id', 'int'), + ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'), + ('svr_port', 'int'), + ('ts_value', 'int'), + ('ts_type', 'varchar:100'), + ('service_role', 'varchar:100'), + ('role', 'varchar:100'), + ('service_epoch', 'int'), + ], + partition_columns = ['svr_ip', 'svr_port'], + vtable_route_policy = 'distributed', +) + # 12396: __all_virtual_resource_pool_mysql_sys_agent # 12397: __all_virtual_px_p2p_datahub + # # 余留位置 # @@ -11849,6 +11872,7 @@ def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15298' # 15382: __all_virtual_transfer_task_history # 15383: __all_virtual_resource_pool_sys_agent # 15384: __all_virtual_px_p2p_datahub +def_table_schema(**no_direct_access(gen_oracle_mapping_virtual_table_def('15385', all_def_keywords['__all_virtual_timestamp_service']))) ################################################################################ # System View (20000,30000] @@ -25931,7 +25955,32 @@ WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() # 21401: CDB_OB_LOG_RESTORE_SOURCE # 21402: DBA_OB_LOG_RESTORE_SOURCE # 21403: DBA_OB_EXTERNAL_TABLE_FILE -# 21404: V$OB_TIMESTAMP_SERVICE + +def_table_schema( + owner = 'lixinze.lxz', + table_name = 'V$OB_TIMESTAMP_SERVICE', + table_id = '21404', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + TENANT_ID, + TS_TYPE, + TS_VALUE, + SVR_IP, + SVR_PORT + FROM + oceanbase.__all_virtual_timestamp_service + WHERE + ROLE = 'LEADER' AND SERVICE_EPOCH = + (SELECT MAX(SERVICE_EPOCH) FROM + oceanbase.__all_virtual_timestamp_service) +""".replace("\n", " ") +) + # 21405: DBA_OB_BALANCE_JOBS # 21406: CDB_OB_BALANCE_JOBS # 21407: DBA_OB_BALANCE_JOB_HISTORY @@ -49016,7 +49065,33 @@ WHERE SVR_IP=HOST_IP() AND SVR_PORT=RPC_PORT() # 28190: V$OB_ARBITRATION_MEMBER_INFO # 28191: GV$OB_ARBITRATION_SERVICE_STATUS # 28192: V$OB_ARBITRATION_SERVICE_STATUS -# 28193: V$OB_TIMESTAMP_SERVICE + +def_table_schema( + owner = 'zhenjiang.xzj', + table_name = 'V$OB_TIMESTAMP_SERVICE', + name_postfix = '_ORA', + database_id = 'OB_ORA_SYS_DATABASE_ID', + table_id = '28193', + table_type = 'SYSTEM_VIEW', + rowkey_columns = [], + normal_columns = [], + gm_columns = [], + in_tenant_space = True, + view_definition = """ + SELECT + TENANT_ID, + TS_TYPE, + TS_VALUE, + SVR_IP, + SVR_PORT + FROM + SYS.ALL_VIRTUAL_TIMESTAMP_SERVICE + WHERE + ROLE = 'LEADER' AND SERVICE_EPOCH = + (SELECT MAX(SERVICE_EPOCH) FROM + SYS.ALL_VIRTUAL_TIMESTAMP_SERVICE) +""".replace("\n", " ") +) ################################################################################ # Lob Table (50000, 70000) diff --git a/src/storage/tx/ob_standby_timestamp_service.cpp b/src/storage/tx/ob_standby_timestamp_service.cpp index 37d66752df..8491b78c58 100644 --- a/src/storage/tx/ob_standby_timestamp_service.cpp +++ b/src/storage/tx/ob_standby_timestamp_service.cpp @@ -307,7 +307,20 @@ int ObStandbyTimestampService::check_leader(bool &leader) return ret; } - +void ObStandbyTimestampService::get_virtual_info(int64_t &ts_value, common::ObRole &role, int64_t &proposal_id) +{ + int ret = OB_SUCCESS; + ts_value = last_id_; + bool is_leader = false; + if (OB_FAIL(MTL(logservice::ObLogService *)->get_palf_role(share::GTS_LS, role, proposal_id))) { + TRANS_LOG(WARN, "get ObStandbyTimestampService role fail", KR(ret)); + } else if (role == LEADER && proposal_id != epoch_) { + role = FOLLOWER; + proposal_id = epoch_; + } + TRANS_LOG(INFO, "sts get virtual info", K(ret), K_(last_id), K(ts_value), + K(role), K(proposal_id), K_(epoch), K_(switch_to_leader_ts)); +} } } diff --git a/src/storage/tx/ob_standby_timestamp_service.h b/src/storage/tx/ob_standby_timestamp_service.h index 46980ca32f..4cf4df33ca 100644 --- a/src/storage/tx/ob_standby_timestamp_service.h +++ b/src/storage/tx/ob_standby_timestamp_service.h @@ -70,6 +70,7 @@ public: int check_leader(bool &leader); int get_number(int64_t >s); int64_t get_last_id() const { return last_id_; } + void get_virtual_info(int64_t &ts_value, common::ObRole &role, int64_t &proposal_id); TO_STRING_KV(K_(inited), K_(last_id), K_(tenant_id), K_(epoch), K_(self), K_(switch_to_leader_ts)); private: int query_and_update_last_id(); diff --git a/src/storage/tx/ob_timestamp_access.cpp b/src/storage/tx/ob_timestamp_access.cpp index 93ae1265dc..364b665a67 100644 --- a/src/storage/tx/ob_timestamp_access.cpp +++ b/src/storage/tx/ob_timestamp_access.cpp @@ -52,5 +52,18 @@ int ObTimestampAccess::get_number(const int64_t base_id, int64_t >s) return ret; } +void ObTimestampAccess::get_virtual_info(int64_t &ts_value, + ServiceType &service_type, + common::ObRole &role, + int64_t &proposal_id) +{ + service_type = service_type_; + if (MTL_IS_PRIMARY_TENANT()) { + MTL(ObTimestampService *)->get_virtual_info(ts_value, role, proposal_id); + } else { + MTL(ObStandbyTimestampService *)->get_virtual_info(ts_value, role, proposal_id); + } +} + } } diff --git a/src/storage/tx/ob_timestamp_access.h b/src/storage/tx/ob_timestamp_access.h index cc5d80791a..6e65478ff0 100644 --- a/src/storage/tx/ob_timestamp_access.h +++ b/src/storage/tx/ob_timestamp_access.h @@ -14,6 +14,7 @@ #define OCEANBASE_TRANSACTION_OB_TIMESTAMP_ACCESS_ #include "share/rc/ob_tenant_base.h" +#include "common/ob_role.h" namespace oceanbase { @@ -48,6 +49,39 @@ public: ServiceType get_service_type() const { return service_type_; } int handle_request(const ObGtsRequest &request, obrpc::ObGtsRpcResult &result); int get_number(const int64_t base_id, int64_t >s); + void get_virtual_info(int64_t &ts_value, + ServiceType &service_type, + common::ObRole &role, + int64_t &proposal_id); + static const char *service_type_to_cstr(const ServiceType service_type) + { + const char *str; + switch (service_type) { + case ServiceType::FOLLOWER: + str = "FOLLOWER"; + break; + case ServiceType::GTS_LEADER: + str = "GTS_LEADER"; + break; + case ServiceType::STS_LEADER: + str = "STS_LEADER"; + break; + default: + str = "UNKNOWN"; + break; + } + return str; + } + static const char *ts_type_to_cstr(bool is_primary) + { + const char *str; + if (is_primary) { + str = "GTS"; + } else { + str = "STS"; + } + return str; + } private: ServiceType service_type_; }; diff --git a/src/storage/tx/ob_timestamp_service.cpp b/src/storage/tx/ob_timestamp_service.cpp index 05754bb69d..881d326f2b 100644 --- a/src/storage/tx/ob_timestamp_service.cpp +++ b/src/storage/tx/ob_timestamp_service.cpp @@ -200,5 +200,17 @@ int ObTimestampService::switch_to_leader() return ret; } +void ObTimestampService::get_virtual_info(int64_t &ts_value, common::ObRole &role, int64_t &proposal_id) +{ + int ret = OB_SUCCESS; + ts_value = last_id_; + if (OB_FAIL(check_and_fill_ls())) { + TRANS_LOG(WARN, "ls set fail", K(ret)); + } else if (OB_FAIL(ls_->get_log_handler()->get_role(role, proposal_id))) { + TRANS_LOG(WARN, "get ls role fail", K(ret)); + } + TRANS_LOG(INFO, "gts get virtual info", K(ret), K_(last_id), K(ts_value), K(role), K(proposal_id)); +} + } } diff --git a/src/storage/tx/ob_timestamp_service.h b/src/storage/tx/ob_timestamp_service.h index 5acf04105a..534a39c3d0 100644 --- a/src/storage/tx/ob_timestamp_service.h +++ b/src/storage/tx/ob_timestamp_service.h @@ -62,6 +62,7 @@ public: int64_t get_limited_id() const { return limited_id_; } static SCN get_sts_start_scn(const SCN &max_sys_ls_scn) { return SCN::plus(max_sys_ls_scn, 2 * TIMESTAMP_PREALLOCATED_RANGE); }; + void get_virtual_info(int64_t &ts_value, common::ObRole &role, int64_t &proposal_id); private: ObGtsResponseRpc rpc_; int handle_local_request_(const ObGtsRequest &request, obrpc::ObGtsRpcResult &result); diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result index 7a5c9c4e90..72dde9c172 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/inner_table_overall.result @@ -587,6 +587,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 12369 __all_virtual_io_scheduler 2 201001 1 12384 __all_virtual_thread 2 201001 1 12393 __all_virtual_virtual_long_ops_status_mysql_sys_agent 2 201001 1 +12395 __all_virtual_timestamp_service 2 201001 1 20001 GV$OB_PLAN_CACHE_STAT 1 201001 1 20002 GV$OB_PLAN_CACHE_PLAN_STAT 1 201001 1 20003 SCHEMATA 1 201002 1 @@ -878,6 +879,7 @@ select 0xffffffffff & table_id, table_name, table_type, database_id, part_num fr 21369 DBA_OB_RSRC_IO_DIRECTIVES 1 201001 1 21380 GV$OB_THREAD 1 201001 1 21381 V$OB_THREAD 1 201001 1 +21404 V$OB_TIMESTAMP_SERVICE 1 201001 1 check sys table count and table_id range success check count and table_id range for virtual table success select * from information_schema.CHARACTER_SETS limit 1;