diff --git a/be/src/cloud/cloud_storage_engine.cpp b/be/src/cloud/cloud_storage_engine.cpp index cf50eabd03f691..50931a18ba2971 100644 --- a/be/src/cloud/cloud_storage_engine.cpp +++ b/be/src/cloud/cloud_storage_engine.cpp @@ -249,10 +249,10 @@ bool CloudStorageEngine::stopped() { } Result CloudStorageEngine::get_tablet(int64_t tablet_id, - SyncRowsetStats* sync_stats) { - return _tablet_mgr->get_tablet(tablet_id, false, true, sync_stats).transform([](auto&& t) { - return static_pointer_cast(std::move(t)); - }); + SyncRowsetStats* sync_stats, + bool force_use_cache) { + return _tablet_mgr->get_tablet(tablet_id, false, true, sync_stats, force_use_cache) + .transform([](auto&& t) { return static_pointer_cast(std::move(t)); }); } Status CloudStorageEngine::start_bg_threads(std::shared_ptr wg_sptr) { diff --git a/be/src/cloud/cloud_storage_engine.h b/be/src/cloud/cloud_storage_engine.h index 83793da99449e3..a3e977778eece1 100644 --- a/be/src/cloud/cloud_storage_engine.h +++ b/be/src/cloud/cloud_storage_engine.h @@ -58,8 +58,8 @@ class CloudStorageEngine final : public BaseStorageEngine { void stop() override; bool stopped() override; - Result get_tablet(int64_t tablet_id, - SyncRowsetStats* sync_stats = nullptr) override; + Result get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats = nullptr, + bool force_use_cache = false) override; Status start_bg_threads(std::shared_ptr wg_sptr = nullptr) override; diff --git a/be/src/cloud/cloud_tablet_mgr.cpp b/be/src/cloud/cloud_tablet_mgr.cpp index c9d3696420b89a..bab4e6f625d572 100644 --- a/be/src/cloud/cloud_tablet_mgr.cpp +++ b/be/src/cloud/cloud_tablet_mgr.cpp @@ -153,7 +153,8 @@ void set_tablet_access_time_ms(CloudTablet* tablet) { Result> CloudTabletMgr::get_tablet(int64_t tablet_id, bool warmup_data, bool sync_delete_bitmap, - SyncRowsetStats* sync_stats) { + SyncRowsetStats* sync_stats, + bool force_use_cache) { // LRU value type. `Value`'s lifetime MUST NOT be longer than `CloudTabletMgr` class Value : public LRUCacheValueBase { public: @@ -170,6 +171,12 @@ Result> CloudTabletMgr::get_tablet(int64_t tablet_i auto tablet_id_str = std::to_string(tablet_id); CacheKey key(tablet_id_str); auto* handle = _cache->lookup(key); + + if (handle == nullptr && force_use_cache) { + return ResultError( + Status::InternalError("failed to get cloud tablet from cache {}", tablet_id)); + } + if (handle == nullptr) { if (sync_stats) { ++sync_stats->tablet_meta_cache_miss; diff --git a/be/src/cloud/cloud_tablet_mgr.h b/be/src/cloud/cloud_tablet_mgr.h index 1a6ec72c1f7625..2f41b8beb1dbb2 100644 --- a/be/src/cloud/cloud_tablet_mgr.h +++ b/be/src/cloud/cloud_tablet_mgr.h @@ -46,7 +46,8 @@ class CloudTabletMgr { // sync rowsets after, and download segment data in background if `warmup_data` is true. Result> get_tablet(int64_t tablet_id, bool warmup_data = false, bool sync_delete_bitmap = true, - SyncRowsetStats* sync_stats = nullptr); + SyncRowsetStats* sync_stats = nullptr, + bool force_use_cache = false); void erase_tablet(int64_t tablet_id); diff --git a/be/src/exec/rowid_fetcher.cpp b/be/src/exec/rowid_fetcher.cpp index 3d28185a79468b..15355b34f4b5f6 100644 --- a/be/src/exec/rowid_fetcher.cpp +++ b/be/src/exec/rowid_fetcher.cpp @@ -369,7 +369,7 @@ Status RowIdStorageReader::read_by_rowids(const PMultiGetRequest& request, watch.start(); BaseTabletSPtr tablet = scope_timer_run( [&]() { - auto res = ExecEnv::get_tablet(row_loc.tablet_id()); + auto res = ExecEnv::get_tablet(row_loc.tablet_id(), nullptr, true); return !res.has_value() ? nullptr : std::dynamic_pointer_cast(res.value()); }, diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp index 2909f054e9a579..75131fb4a8781d 100644 --- a/be/src/olap/storage_engine.cpp +++ b/be/src/olap/storage_engine.cpp @@ -1267,7 +1267,8 @@ Status StorageEngine::create_tablet(const TCreateTabletReq& request, RuntimeProf return _tablet_manager->create_tablet(request, stores, profile); } -Result StorageEngine::get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats) { +Result StorageEngine::get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats, + bool force_use_cache) { BaseTabletSPtr tablet; std::string err; tablet = _tablet_manager->get_tablet(tablet_id, true, &err); diff --git a/be/src/olap/storage_engine.h b/be/src/olap/storage_engine.h index 20ec3289c4834e..f941bbfc01d569 100644 --- a/be/src/olap/storage_engine.h +++ b/be/src/olap/storage_engine.h @@ -109,7 +109,8 @@ class BaseStorageEngine { virtual Status start_bg_threads(std::shared_ptr wg_sptr = nullptr) = 0; virtual Result get_tablet(int64_t tablet_id, - SyncRowsetStats* sync_stats = nullptr) = 0; + SyncRowsetStats* sync_stats = nullptr, + bool force_use_cache = false) = 0; void register_report_listener(ReportWorker* listener); void deregister_report_listener(ReportWorker* listener); @@ -227,8 +228,8 @@ class StorageEngine final : public BaseStorageEngine { Status create_tablet(const TCreateTabletReq& request, RuntimeProfile* profile); - Result get_tablet(int64_t tablet_id, - SyncRowsetStats* sync_stats = nullptr) override; + Result get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats = nullptr, + bool force_use_cache = false) override; void clear_transaction_task(const TTransactionId transaction_id); void clear_transaction_task(const TTransactionId transaction_id, diff --git a/be/src/runtime/exec_env.cpp b/be/src/runtime/exec_env.cpp index a6e41debfca78d..a31a5b00d0b426 100644 --- a/be/src/runtime/exec_env.cpp +++ b/be/src/runtime/exec_env.cpp @@ -52,7 +52,8 @@ void ExecEnv::set_write_cooldown_meta_executors() { } #endif // BE_TEST -Result ExecEnv::get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats) { +Result ExecEnv::get_tablet(int64_t tablet_id, SyncRowsetStats* sync_stats, + bool force_use_cache) { auto storage_engine = GetInstance()->_storage_engine.get(); return storage_engine != nullptr ? storage_engine->get_tablet(tablet_id, sync_stats) diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h index b2371bb6045c76..70b9c0a4a9e49f 100644 --- a/be/src/runtime/exec_env.h +++ b/be/src/runtime/exec_env.h @@ -154,7 +154,8 @@ class ExecEnv { // Requires ExenEnv ready static Result get_tablet(int64_t tablet_id, - SyncRowsetStats* sync_stats = nullptr); + SyncRowsetStats* sync_stats = nullptr, + bool force_use_cache = false); static bool ready() { return _s_ready.load(std::memory_order_acquire); } static bool tracking_memory() { return _s_tracking_memory.load(std::memory_order_acquire); }