diff --git a/src/executor/operator/physical_show.cpp b/src/executor/operator/physical_show.cpp index 34d41ad150..c258ab5e70 100644 --- a/src/executor/operator/physical_show.cpp +++ b/src/executor/operator/physical_show.cpp @@ -90,7 +90,7 @@ import command_statement; namespace infinity { -void PhysicalShow::Init(QueryContext* query_context) { +void PhysicalShow::Init(QueryContext *query_context) { auto varchar_type = MakeShared(LogicalType::kVarchar); auto bigint_type = MakeShared(LogicalType::kBigInt); @@ -2346,9 +2346,7 @@ void PhysicalShow::ExecuteShowBlocks(QueryContext *query_context, ShowOperatorSt void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOperatorState *show_operator_state) { auto txn = query_context->GetTxn(); - TxnTimeStamp begin_ts = txn->BeginTS(); - - auto [table_entry, status] = txn->GetTableByName(db_name_, *object_name_); + auto [block_info, status] = txn->GetBlockInfo(db_name_, *object_name_, *segment_id_, *block_id_); if (!status.ok()) { show_operator_state->status_ = status.clone(); RecoverableError(status); @@ -2360,20 +2358,6 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera Vector> column_types{varchar_type, varchar_type}; output_block_ptr->Init(column_types); - auto segment_entry = table_entry->GetSegmentByID(*segment_id_, begin_ts); - if (!segment_entry) { - Status status = Status::SegmentNotExist(*segment_id_); - RecoverableError(status); - return; - } - - auto block_entry = segment_entry->GetBlockEntryByID(*block_id_); - if (!block_entry) { - Status status = Status::BlockNotExist(*block_id_); - RecoverableError(status); - return; - } - { SizeT column_id = 0; { @@ -2384,7 +2368,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - Value value = Value::MakeVarchar(std::to_string(block_entry->block_id())); + Value value = Value::MakeVarchar(std::to_string(block_info->block_id_)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); } @@ -2400,7 +2384,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - String full_block_dir = Path(InfinityContext::instance().config()->DataDir()) / *block_entry->block_dir(); + String full_block_dir = Path(InfinityContext::instance().config()->DataDir()) / *block_info->block_dir_; Value value = Value::MakeVarchar(full_block_dir); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -2417,7 +2401,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT block_storage_size = block_entry->GetStorageSize(); + SizeT block_storage_size = block_info->storage_size_; String block_storage_size_str = Utility::FormatByteSize(block_storage_size); Value value = Value::MakeVarchar(block_storage_size_str); ValueExpression value_expr(value); @@ -2435,7 +2419,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT row_capacity = block_entry->row_capacity(); + SizeT row_capacity = block_info->row_capacity_; Value value = Value::MakeVarchar(std::to_string(row_capacity)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -2452,7 +2436,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT row_count = block_entry->row_count(); + SizeT row_count = block_info->row_count_; Value value = Value::MakeVarchar(std::to_string(row_count)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -2469,7 +2453,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT checkpoint_row_count = block_entry->checkpoint_row_count(); + SizeT checkpoint_row_count = block_info->checkpoint_row_count_; Value value = Value::MakeVarchar(std::to_string(checkpoint_row_count)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -2486,7 +2470,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT column_count = block_entry->columns().size(); + SizeT column_count = block_info->column_count_; Value value = Value::MakeVarchar(std::to_string(column_count)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -2503,7 +2487,7 @@ void PhysicalShow::ExecuteShowBlockDetail(QueryContext *query_context, ShowOpera ++column_id; { - SizeT checkpoint_ts = block_entry->checkpoint_ts(); + SizeT checkpoint_ts = block_info->checkpoint_ts_; Value value = Value::MakeVarchar(std::to_string(checkpoint_ts)); ValueExpression value_expr(value); value_expr.AppendToChunk(output_block_ptr->column_vectors[column_id]); @@ -5914,7 +5898,7 @@ void PhysicalShow::ExecuteShowTransactionHistory(QueryContext *query_context, Sh { // txn id String txn_text; - if(txn_context->text_.get() != nullptr) { + if (txn_context->text_.get() != nullptr) { txn_text = *txn_context->text_; } Value value = Value::MakeVarchar(txn_text); @@ -5946,7 +5930,7 @@ void PhysicalShow::ExecuteShowTransactionHistory(QueryContext *query_context, Sh { // txn type String transaction_type_str = "read"; - if(txn_context->is_write_transaction_) { + if (txn_context->is_write_transaction_) { transaction_type_str = "write"; } Value value = Value::MakeVarchar(transaction_type_str); diff --git a/src/storage/common/meta_info.cppm b/src/storage/common/meta_info.cppm index ca297f99ed..6cdcbc7664 100644 --- a/src/storage/common/meta_info.cppm +++ b/src/storage/common/meta_info.cppm @@ -62,6 +62,17 @@ export struct TableIndexInfo { SharedPtr index_column_names_{}; }; +export struct BlockInfo { + BlockID block_id_; + SharedPtr block_dir_{}; + i64 row_count_{}; + i64 row_capacity_{}; + i64 checkpoint_row_count_{}; + i64 column_count_{}; + TxnTimeStamp checkpoint_ts_{}; + SizeT storage_size_{}; +}; + export struct TableDetail { SharedPtr db_name_{}; SharedPtr table_name_{}; diff --git a/src/storage/meta/catalog.cpp b/src/storage/meta/catalog.cpp index 0163526ca7..c2163b2a43 100644 --- a/src/storage/meta/catalog.cpp +++ b/src/storage/meta/catalog.cpp @@ -347,6 +347,36 @@ Tuple, Status> Catalog::GetTableInfo(const String &db_name, return db_entry->GetTableInfo(table_name, txn); } +Tuple, Status> +Catalog::GetBlockInfo(const String &db_name, const String &table_name, SegmentID segment_id, BlockID block_id, Txn *txn) { + auto [table_entry, status] = txn->GetTableByName(db_name, table_name); + if (!status.ok()) { + return {nullptr, status}; + } + + auto segment_entry = table_entry->GetSegmentByID(segment_id, txn->BeginTS()); + if (!segment_entry) { + return {nullptr, Status::SegmentNotExist(segment_id)}; + } + + auto block_entry = segment_entry->GetBlockEntryByID(block_id); + if (!block_entry) { + return {nullptr, Status::BlockNotExist(block_id)}; + } + + SharedPtr block_info = MakeShared(); + block_info->block_id_ = block_entry->block_id(); + block_info->block_dir_ = block_entry->block_dir(); + block_info->row_count_ = block_entry->row_count(); + block_info->row_capacity_ = block_entry->row_capacity(); + block_info->checkpoint_row_count_ = block_entry->checkpoint_row_count(); + block_info->column_count_ = block_entry->columns().size(); + block_info->checkpoint_ts_ = block_entry->checkpoint_ts(); + block_info->storage_size_ = block_entry->GetStorageSize(); + + return {nullptr, Status::OK()}; +} + Status Catalog::RemoveTableEntry(TableEntry *table_entry, TransactionID txn_id) { TableMeta *table_meta = table_entry->GetTableMeta(); LOG_TRACE(fmt::format("Remove a table/collection entry: {}", *table_entry->GetTableName())); diff --git a/src/storage/meta/catalog.cppm b/src/storage/meta/catalog.cppm index 6649a49f7d..a526bd23f6 100644 --- a/src/storage/meta/catalog.cppm +++ b/src/storage/meta/catalog.cppm @@ -152,12 +152,15 @@ public: Tuple GetTableByName(const String &db_name, const String &table_name, TransactionID txn_id, TxnTimeStamp begin_ts); - Tuple, Status> GetTableSnapshot(const String &db_name, const String &table_name, Txn* txn_ptr); + Tuple, Status> GetTableSnapshot(const String &db_name, const String &table_name, Txn *txn_ptr); - Status ApplyTableSnapshot(const SharedPtr &table_snapshot_info, Txn* txn_ptr); + Status ApplyTableSnapshot(const SharedPtr &table_snapshot_info, Txn *txn_ptr); Tuple, Status> GetTableInfo(const String &db_name, const String &table_name, Txn *txn); + Tuple, Status> + GetBlockInfo(const String &db_name, const String &table_name, SegmentID segment_id, BlockID block_id, Txn *txn); + static Status RemoveTableEntry(TableEntry *table_entry, TransactionID txn_id); // Index Related methods diff --git a/src/storage/txn/txn.cpp b/src/storage/txn/txn.cpp index 428a35745b..a0091f4cd5 100644 --- a/src/storage/txn/txn.cpp +++ b/src/storage/txn/txn.cpp @@ -556,6 +556,10 @@ Tuple, Status> Txn::GetTableInfo(const String &db_name, con return catalog_->GetTableInfo(db_name, table_name, this); } +Tuple, Status> Txn::GetBlockInfo(const String &db_name, const String &table_name, SegmentID segment_id, BlockID block_id) { + return catalog_->GetBlockInfo(db_name, table_name, segment_id, block_id, this); +} + Tuple, Status> Txn::GetTableSnapshot(const String &db_name, const String &table_name) { this->CheckTxn(db_name); return catalog_->GetTableSnapshot(db_name, table_name, this); diff --git a/src/storage/txn/txn.cppm b/src/storage/txn/txn.cppm index d72c9111c6..a0cc3c9c2c 100644 --- a/src/storage/txn/txn.cppm +++ b/src/storage/txn/txn.cppm @@ -146,6 +146,8 @@ public: Tuple, Status> GetTableInfo(const String &db_name, const String &table_name); + Tuple, Status> GetBlockInfo(const String &db_name, const String &table_name, SegmentID segment_id, BlockID block_id); + Status GetCollectionByName(const String &db_name, const String &table_name, BaseEntry *&collection_entry); // Lock table related