blob: 177f0ab0200afb307d4c53cbbfb64839786de850 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#pragma once
#include <gen_cpp/cloud.pb.h>
#include "meta-store/clone_chain_reader.h"
#include "resource-manager/resource_manager.h"
namespace doris::cloud {
class Transaction;
class RangeGetIterator;
// Detached tablet stats
struct TabletStats {
int64_t data_size = 0;
int64_t num_rows = 0;
int64_t num_rowsets = 0;
int64_t num_segs = 0;
int64_t index_size = 0;
int64_t segment_size = 0;
};
// Get tablet stats and detached tablet stats via `txn`. If an error occurs, `code` will be set to non OK.
// NOTE: this function returns original `TabletStatsPB` and detached tablet stats val stored in kv store,
// MUST call `merge_tablet_stats(stats, detached_stats)` to get the real tablet stats.
void internal_get_tablet_stats(MetaServiceCode& code, std::string& msg, Transaction* txn,
const std::string& instance_id, const TabletIndexPB& idx,
TabletStatsPB& stats, TabletStats& detached_stats,
bool snapshot = false);
// Merge `detached_stats` `stats` to `stats`.
void merge_tablet_stats(TabletStatsPB& stats, const TabletStats& detached_stats);
// Detach tablet stats from `stats` to `detached_stats`.
void detach_tablet_stats(const TabletStatsPB& stats, TabletStats& detached_stats);
// Get merged tablet stats via `txn`. If an error occurs, `code` will be set to non OK.
void internal_get_tablet_stats(MetaServiceCode& code, std::string& msg, Transaction* txn,
const std::string& instance_id, const TabletIndexPB& idx,
TabletStatsPB& stats, bool snapshot = false);
// Get versioned load tablet stats via `txn`. If an error occurs, `code` will be set to non OK.
//
// If the versioned load stats doesn't exist, fall back to get single version detached tablet stats.
void internal_get_load_tablet_stats(MetaServiceCode& code, std::string& msg,
CloneChainReader& meta_reader, Transaction* txn,
const std::string& instance_id, const TabletIndexPB& idx,
TabletStatsPB& stats, bool snapshot = false);
// Batch version: Get versioned load tablet stats for multiple tablets via `txn`.
// If an error occurs, `code` will be set to non OK.
//
// For tablets whose versioned load stats doesn't exist, fall back to get single version detached tablet stats.
// tablet_indexes: map of tablet_id -> TabletIndexPB
// tablet_stats: output map of tablet_id -> TabletStatsPB
void internal_get_load_tablet_stats_batch(
MetaServiceCode& code, std::string& msg, CloneChainReader& meta_reader, Transaction* txn,
const std::string& instance_id,
const std::unordered_map<int64_t, TabletIndexPB>& tablet_indexes,
std::unordered_map<int64_t, TabletStatsPB>* tablet_stats, bool snapshot = false);
// Overload for std::map
void internal_get_load_tablet_stats_batch(MetaServiceCode& code, std::string& msg,
CloneChainReader& meta_reader, Transaction* txn,
const std::string& instance_id,
const std::map<int64_t, TabletIndexPB>& tablet_indexes,
std::unordered_map<int64_t, TabletStatsPB>* tablet_stats,
bool snapshot = false);
// clang-format off
/**
* Get detached tablet stats via with given stats_kvs
*
* stats_kvs stores the following KVs, see keys.h for more details
* 0x01 "stats" ${instance_id} "tablet" ${table_id} ${index_id} ${partition_id} ${tablet_id} -> TabletStatsPB
* 0x01 "stats" ${instance_id} "tablet" ${table_id} ${index_id} ${partition_id} ${tablet_id} "data_size" -> int64
* 0x01 "stats" ${instance_id} "tablet" ${table_id} ${index_id} ${partition_id} ${tablet_id} "num_rows" -> int64
* 0x01 "stats" ${instance_id} "tablet" ${table_id} ${index_id} ${partition_id} ${tablet_id} "num_rowsets" -> int64
* 0x01 "stats" ${instance_id} "tablet" ${table_id} ${index_id} ${partition_id} ${tablet_id} "num_segments" -> int64
*
* @param stats_kvs the tablet stats kvs to process, it is in size of 5 or 1
* @param detached_stats output param for the detached stats
* @return 0 for success otherwise error
*/
[[nodiscard]] int get_detached_tablet_stats(const std::vector<std::pair<std::string, std::string>>& stats_kvs,
TabletStats& detached_stats);
// clang-format on
MetaServiceResponseStatus parse_fix_tablet_stats_param(
std::shared_ptr<ResourceManager> resource_mgr, const std::string& table_id_str,
const std::string& cloud_unique_id_str, const std::string& tablet_id_str, int64_t& table_id,
std::string& instance_id, int64_t& tablet_id);
MetaServiceResponseStatus fix_tablet_stats_internal(
std::shared_ptr<TxnKv> txn_kv, std::pair<std::string, std::string>& key_pair,
std::vector<std::shared_ptr<TabletStatsPB>>& tablet_stat_shared_ptr_vec_batch,
const std::string& instance_id, size_t batch_size = 20);
std::pair<MetaServiceCode, std::string> fix_versioned_tablet_stats_internal(
TxnKv* txn_kv, const std::string& instance_id, const TabletIndexPB& tablet_idx,
bool is_versioned_read, bool is_versioned_write, ResourceManager* resource_mgr);
MetaServiceResponseStatus check_new_tablet_stats(
std::shared_ptr<TxnKv> txn_kv, const std::string& instance_id,
const std::vector<std::shared_ptr<TabletStatsPB>>& tablet_stat_shared_ptr_vec_batch);
} // namespace doris::cloud