BE Runtime Module — Review Guide

MemTracker Hierarchy

Two levels: MemTrackerLimiter (heavyweight, with limits) and MemTracker (lightweight, nested accounting). Thread-local state via ThreadMemTrackerMgr.

Checkpoints

  • [ ] Task-bound threads/bthreads enter with SCOPED_ATTACH_TASK?
  • [ ] Non-task background threads use SCOPED_INIT_THREAD_CONTEXT?
  • [ ] Temporary limiter switching uses SCOPED_SWITCH_THREAD_MEM_TRACKER_LIMITER, not manual save/restore?
  • [ ] Thread-pool callbacks attach at callback entry, not deeper in the call chain?
  • [ ] Large allocations use try_reserve() with DEFER_RELEASE_RESERVED() for balanced accounting on every exit?
  • [ ] For BE-owned buffers or containers whose memory should be tracked by Doris accounting, prefer allocator-aware types from be/src/core/custom_allocator.h such as DorisVector, DorisMap, and DorisUniqueBufferPtr instead of the corresponding standard library ownership types
  • [ ] Code reachable from ThreadMemTrackerMgr::consume avoids operations that may allocate recursively?

Object Lifecycle

  • [ ] ENABLE_FACTORY_CREATOR classes use create_shared() / create_unique(), not raw new?
  • [ ] Ownership cycles broken with weak_ptr or raw observer pointers?
  • [ ] Single-owner paths use unique_ptr plus observer raw pointers?

Cache Lifecycle

  • [ ] Every Cache::Handle* released after use?
  • [ ] Cache values inherit LRUCacheValueBase for tracked-byte release?
  • [ ] New caches registered with CacheManager for global GC?

Static Initialization

  • [ ] New namespace-scope static/global depends on another TU's object? That is a SIOF hazard
  • [ ] Fix: constexpr, same-header inline, or function-local static?

Workload Group Memory

  • [ ] When precise limit enforcement matters, code uses check_mem_used() not just exceed_limit()?