diff --git a/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.cpp b/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.cpp index d8b8638f5f..98574fcd9a 100644 --- a/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.cpp +++ b/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.cpp @@ -207,6 +207,12 @@ int ObAllVirtualTabletPtr::process_curr_tenant(ObNewRow *&row) cur_row_.cells_[i].set_collation_type(ObCharset::get_default_collation(ObCharset::get_default_charset())); } break; + case DATA_OCCUPIED: + cur_row_.cells_[i].set_int(0); + break; + case DATA_REQUIRED: + cur_row_.cells_[i].set_int(0); + break; default: ret = OB_ERR_UNEXPECTED; SERVER_LOG(WARN, "invalid col_id", K(ret), K(col_id)); diff --git a/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.h b/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.h index 854fab96b4..d39ec53763 100644 --- a/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.h +++ b/src/observer/virtual_table/ob_all_virtual_tablet_pointer_status.h @@ -51,7 +51,9 @@ private: WASH_SCORE, TABLET_PTR, INITIAL_STATE, - OLD_CHAIN + OLD_CHAIN, + DATA_OCCUPIED, + DATA_REQUIRED }; public: ObAllVirtualTabletPtr(); diff --git a/src/share/inner_table/ob_inner_table_schema.12301_12350.cpp b/src/share/inner_table/ob_inner_table_schema.12301_12350.cpp index 57a8cd431c..cff637e2d6 100644 --- a/src/share/inner_table/ob_inner_table_schema.12301_12350.cpp +++ b/src/share/inner_table/ob_inner_table_schema.12301_12350.cpp @@ -5603,6 +5603,42 @@ int ObInnerTableSchema::all_virtual_tablet_pointer_status_schema(ObTableSchema & false, //is_nullable false); //is_autoincrement } + if (OB_SUCC(ret)) { + ObObj occupy_size_default; + occupy_size_default.set_int(0); + ADD_COLUMN_SCHEMA_T("occupy_size", //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 + occupy_size_default, // orig_default_value + occupy_size_default); // cur_default_value + } + if (OB_SUCC(ret)) { + ObObj required_size_default; + required_size_default.set_int(0); + ADD_COLUMN_SCHEMA_T("required_size", //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 + required_size_default, // orig_default_value + required_size_default); // cur_default_value + } if (OB_SUCC(ret)) { table_schema.get_part_option().set_part_num(1); table_schema.set_part_level(PARTITION_LEVEL_ONE); 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 6843471bc1..19c4926216 100644 --- a/src/share/inner_table/ob_inner_table_schema_def.py +++ b/src/share/inner_table/ob_inner_table_schema_def.py @@ -12321,6 +12321,8 @@ def_table_schema( ('tablet_ptr', 'varchar:128'), ('initial_state', 'bool'), ('old_chain', 'varchar:128'), + ('occupy_size', 'bigint', 'false', '0'), + ('required_size', 'bigint', 'false', '0'), ], partition_columns = ['svr_ip', 'svr_port'], vtable_route_policy = 'distributed', diff --git a/src/storage/tablet/ob_tablet.cpp b/src/storage/tablet/ob_tablet.cpp index 10b54ee468..0744836f92 100644 --- a/src/storage/tablet/ob_tablet.cpp +++ b/src/storage/tablet/ob_tablet.cpp @@ -238,7 +238,7 @@ ObTablet::ObTablet() table_store_cache_() { #if defined(__x86_64__) && !defined(ENABLE_OBJ_LEAK_CHECK) - static_assert(sizeof(ObTablet) + sizeof(ObRowkeyReadInfo) == 1688, "The size of ObTablet will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); + static_assert(sizeof(ObTablet) + sizeof(ObRowkeyReadInfo) == 1696, "The size of ObTablet will affect the meta memory manager, and the necessity of adding new fields needs to be considered."); #endif MEMSET(memtables_, 0x0, sizeof(memtables_)); } diff --git a/src/storage/tablet/ob_tablet_meta.cpp b/src/storage/tablet/ob_tablet_meta.cpp index 8d9cf7fe55..b57b22c3c2 100644 --- a/src/storage/tablet/ob_tablet_meta.cpp +++ b/src/storage/tablet/ob_tablet_meta.cpp @@ -510,7 +510,7 @@ int ObTabletMeta::assign(const ObTabletMeta &other) max_serialized_medium_scn_ = other.max_serialized_medium_scn_; mds_checkpoint_scn_ = other.mds_checkpoint_scn_; transfer_info_ = other.transfer_info_; - + space_usage_ = other.space_usage_; if (OB_SUCC(ret)) { is_inited_ = other.is_inited_; } @@ -1021,6 +1021,8 @@ int ObMigrationTabletParam::serialize(char *buf, const int64_t len, int64_t &pos LOG_WARN("failed to serialize transfer info", K(ret), K(len), K(new_pos), K_(transfer_info)); } else if (new_pos - pos < length && OB_FAIL(serialization::encode_i64(buf, len, new_pos, create_schema_version_))) { LOG_WARN("failed to serialize create schema version", K(ret), K(len), K(new_pos), K_(create_schema_version)); + } else if (new_pos - pos < length && OB_FAIL(space_usage_.serialize(buf, len, new_pos))) { + LOG_WARN("failed to serialize tablet space usage", K(ret), K(len), K(new_pos), K_(space_usage)); } else if (OB_UNLIKELY(length != new_pos - pos)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("length doesn't match standard length", K(ret), K(new_pos), K(pos), K(length)); @@ -1037,13 +1039,15 @@ int ObMigrationTabletParam::deserialize_v2(const char *buf, const int64_t len, i int64_t new_pos = pos; int8_t compat_mode = -1; - int64_t length = 0; + int64_t total_length = 0; // total serialize size + int64_t length = 0; // total serialize size expect for the first 2 fields. - if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &length))) { + if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &total_length))) { LOG_WARN("failed to deserialize length", K(ret), K(len), K(new_pos)); - } else if (OB_UNLIKELY(length - 24 > len - pos)) { + } else if (OB_UNLIKELY(total_length - 24 > len - new_pos)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("buffer's length is not enough", K(ret), K(length), K(len - new_pos)); + LOG_WARN("buffer's length is not enough", K(ret), K(total_length), K(len - new_pos)); + } else if (FALSE_IT(length = total_length - 16)) { } else if (new_pos - pos < length && OB_FAIL(serialization::decode_bool(buf, len, new_pos, &is_empty_shell_))) { LOG_WARN("failed to serialize is empty shell", K(ret), K(len), K(new_pos), K(is_empty_shell_)); } else if (new_pos - pos < length && OB_FAIL(ls_id_.deserialize(buf, len, new_pos))) { @@ -1100,7 +1104,9 @@ int ObMigrationTabletParam::deserialize_v2(const char *buf, const int64_t len, i LOG_WARN("failed to deserialize transfer info", K(ret), K(len), K(new_pos)); } else if (new_pos - pos < length && OB_FAIL(serialization::decode_i64(buf, len, new_pos, &create_schema_version_))) { LOG_WARN("failed to deserialize create schema version", K(ret), K(len)); - } else if (OB_UNLIKELY(length - 16 != new_pos - pos)) { + } else if (new_pos - pos < length && OB_FAIL(space_usage_.deserialize(buf, len, new_pos))) { + LOG_WARN("failed to serialize tablet space usage", K(ret), K(len), K(new_pos)); + } else if (OB_UNLIKELY(length != new_pos - pos)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet's length doesn't match standard length", K(ret), K(new_pos), K(pos), K(length), KPC(this)); } else { @@ -1117,18 +1123,20 @@ int ObMigrationTabletParam::deserialize_v1(const char *buf, const int64_t len, i int64_t new_pos = pos; int8_t compat_mode = -1; - int64_t length = 0; + int64_t total_length = 0; // total serialize size + int64_t length = 0; // total serialize size expect for the first 2 fields. ObArenaAllocator allocator("MigDeser"); ObTabletAutoincSeq auto_inc_seq; ObTabletTxMultiSourceDataUnit tx_data; ObTabletBindingInfo ddl_data; ObTabletMdsData mds_data; - if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &length))) { + if (OB_FAIL(serialization::decode_i64(buf, len, new_pos, &total_length))) { LOG_WARN("failed to deserialize length", K(ret), K(len), K(new_pos)); - } else if (OB_UNLIKELY(length - 24 > len - pos)) { + } else if (OB_UNLIKELY(total_length - 24 > len - new_pos)) { ret = OB_ERR_UNEXPECTED; - LOG_WARN("buffer's length is not enough", K(ret), K(length), K(len - new_pos)); + LOG_WARN("buffer's length is not enough", K(ret), K(total_length), K(len - new_pos)); + } else if (FALSE_IT(length = total_length - 16)) { } else if (new_pos - pos < length && OB_FAIL(ls_id_.deserialize(buf, len, new_pos))) { LOG_WARN("failed to deserialize ls id", K(ret), K(len), K(new_pos)); } else if (new_pos - pos < length && OB_FAIL(tablet_id_.deserialize(buf, len, new_pos))) { @@ -1181,7 +1189,9 @@ int ObMigrationTabletParam::deserialize_v1(const char *buf, const int64_t len, i LOG_WARN("failed to deserialize max sync medium snapshot", K(ret), K(len), K(new_pos)); } else if (new_pos - pos < length && OB_FAIL(ddl_commit_scn_.fixed_deserialize(buf, len, new_pos))) { LOG_WARN("failed to deserialize ddl commit scn", K(ret), K(len), K(new_pos)); - } else if (OB_UNLIKELY(length - 16 != new_pos - pos)) { + } else if (new_pos - pos < length && OB_FAIL(space_usage_.deserialize(buf, len, new_pos))) { + LOG_WARN("failed to serialize tablet space usage", K(ret), K(len), K(new_pos)); + } else if (OB_UNLIKELY(length != new_pos - pos)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("tablet's length doesn't match standard length", K(ret), K(new_pos), K(pos), K(length), KPC(this)); } else if (OB_FAIL(ObTabletMdsData::build_mds_data(allocator, auto_inc_seq, tx_data, create_scn_, ddl_data, @@ -1342,7 +1352,7 @@ int ObMigrationTabletParam::assign(const ObMigrationTabletParam ¶m) ddl_commit_scn_ = param.ddl_commit_scn_; mds_checkpoint_scn_ = param.mds_checkpoint_scn_; transfer_info_ = param.transfer_info_; - + space_usage_ = param.space_usage_; if (OB_FAIL(mds_data_.assign(param.mds_data_, allocator_))) { LOG_WARN("failed to assign mds data", K(ret), K(param)); } else if (is_empty_shell()) { diff --git a/src/storage/tablet/ob_tablet_meta.h b/src/storage/tablet/ob_tablet_meta.h index 4828693ae4..174e91ea37 100644 --- a/src/storage/tablet/ob_tablet_meta.h +++ b/src/storage/tablet/ob_tablet_meta.h @@ -253,7 +253,8 @@ public: K_(mds_checkpoint_scn), K_(mds_data), K_(transfer_info), - K_(create_schema_version)); + K_(create_schema_version), + K_(space_usage)); private: int deserialize_v2(const char *buf, const int64_t len, int64_t &pos); int deserialize_v1(const char *buf, const int64_t len, int64_t &pos); @@ -296,6 +297,7 @@ public: ObTabletFullMemoryMdsData mds_data_; ObTabletTransferInfo transfer_info_; int64_t create_schema_version_; + ObTabletSpaceUsage space_usage_; // Add new serialization member before this line, below members won't serialize common::ObArenaAllocator allocator_; // for storage schema diff --git a/src/storage/tablet/ob_tablet_space_usage.cpp b/src/storage/tablet/ob_tablet_space_usage.cpp index a3b54702dc..76e354e573 100644 --- a/src/storage/tablet/ob_tablet_space_usage.cpp +++ b/src/storage/tablet/ob_tablet_space_usage.cpp @@ -42,6 +42,8 @@ int ObTabletSpaceUsage::serialize(char *buf, const int64_t buf_len, int64_t &pos LOG_WARN("fail to serialize shared_meta_size_", K(ret), K(buf_len), K(new_pos), K(length), K(shared_meta_size_)); } else if (OB_FAIL(serialization::encode_i64(buf, buf_len, new_pos, meta_size_))) { LOG_WARN("fail to serialize meta_size_", K(ret), K(buf_len), K(new_pos), K(length), K(meta_size_)); + } else if (OB_FAIL(serialization::encode_i64(buf, buf_len, new_pos, occupy_bytes_))) { + LOG_WARN("fail to serialize occupy_size_", K(ret), K(buf_len), K(new_pos), K(length), K(occupy_bytes_)); } else if (OB_UNLIKELY(length != new_pos - pos)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("length doesn't match", K(ret), K(length), K(new_pos), K(pos)); @@ -79,6 +81,8 @@ int ObTabletSpaceUsage::deserialize(const char *buf, const int64_t data_len, int LOG_WARN("fail to deserialize shared_meta_size_", K(ret), K(data_len), K(new_pos), K(length)); } else if (new_pos - pos < length && OB_FAIL(serialization::decode_i64(buf, data_len, new_pos, &meta_size_))) { LOG_WARN("fail to deserialize shared_meta_size_", K(ret), K(data_len), K(new_pos), K(length)); + } else if (new_pos - pos < length && OB_FAIL(serialization::decode_i64(buf, data_len, new_pos, &occupy_bytes_))) { + LOG_WARN("fail to serialize occupy_bytes_", K(ret), K(data_len), K(new_pos), K(length)); } else if (OB_UNLIKELY(length != new_pos - pos)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("length doesn't match", K(ret), K(length), K(new_pos), K(pos)); @@ -97,6 +101,7 @@ int32_t ObTabletSpaceUsage::get_serialize_size() const len += serialization::encoded_length_i64(data_size_); len += serialization::encoded_length_i64(shared_meta_size_); len += serialization::encoded_length_i64(meta_size_); + len += serialization::encoded_length_i64(occupy_bytes_); return len; } } diff --git a/src/storage/tablet/ob_tablet_space_usage.h b/src/storage/tablet/ob_tablet_space_usage.h index e28dc73e71..c88077c4c5 100644 --- a/src/storage/tablet/ob_tablet_space_usage.h +++ b/src/storage/tablet/ob_tablet_space_usage.h @@ -23,7 +23,7 @@ struct ObTabletSpaceUsage final { public: ObTabletSpaceUsage() - : shared_data_size_(0), data_size_(0), shared_meta_size_(0), meta_size_(0) + : shared_data_size_(0), data_size_(0), shared_meta_size_(0), meta_size_(0), occupy_bytes_(0) { } void reset() @@ -32,8 +32,9 @@ public: data_size_ = 0; shared_meta_size_ = 0; meta_size_ = 0; + occupy_bytes_ = 0; } - TO_STRING_KV(K_(shared_data_size), K_(data_size), K_(shared_meta_size), K_(meta_size)); + TO_STRING_KV(K_(shared_data_size), K_(data_size), K_(shared_meta_size), K_(meta_size), K_(occupy_bytes)); int serialize(char *buf, const int64_t buf_len, int64_t &pos) const; int deserialize(const char *buf, const int64_t data_len, int64_t &pos); int32_t get_serialize_size() const; @@ -44,6 +45,7 @@ public: int64_t data_size_; int64_t shared_meta_size_; // shared (meta block) size int64_t meta_size_; + int64_t occupy_bytes_; }; } } diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result index d90d3ce5c6..778c8b7723 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/desc_virtual_table_in_sys.result @@ -7027,6 +7027,8 @@ wash_score bigint(20) NO NULL tablet_ptr varchar(128) NO NULL initial_state tinyint(4) NO NULL old_chain varchar(128) NO NULL +occupy_size bigint(20) NO 0 +required_size bigint(20) NO 0 select /*+QUERY_TIMEOUT(60000000)*/ IF(count(*) >= 0, 1, 0) from oceanbase.__all_virtual_tablet_pointer_status; IF(count(*) >= 0, 1, 0) 1