// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #include #include "monitoring/thread_status_updater.h" #include "rocksdb/db.h" #include "rocksdb/env.h" #include "rocksdb/thread_status.h" namespace rocksdb { class ColumnFamilyData; // The static utility class for updating thread-local status. // // The thread-local status is updated via the thread-local cached // pointer thread_updater_local_cache_. During each function call, // when ThreadStatusUtil finds thread_updater_local_cache_ is // left uninitialized (determined by thread_updater_initialized_), // it will tries to initialize it using the return value of // Env::GetThreadStatusUpdater(). When thread_updater_local_cache_ // is initialized by a non-null pointer, each function call will // then update the status of the current thread. Otherwise, // all function calls to ThreadStatusUtil will be no-op. class ThreadStatusUtil { public: // Register the current thread for tracking. static void RegisterThread( const Env* env, ThreadStatus::ThreadType thread_type); // Unregister the current thread. static void UnregisterThread(); // Create an entry in the global ColumnFamilyInfo table for the // specified column family. This function should be called only // when the current thread does not hold db_mutex. static void NewColumnFamilyInfo(const DB* db, const ColumnFamilyData* cfd, const std::string& cf_name, const Env* env); // Erase the ConstantColumnFamilyInfo that is associated with the // specified ColumnFamilyData. This function should be called only // when the current thread does not hold db_mutex. static void EraseColumnFamilyInfo(const ColumnFamilyData* cfd); // Erase all ConstantColumnFamilyInfo that is associated with the // specified db instance. This function should be called only when // the current thread does not hold db_mutex. static void EraseDatabaseInfo(const DB* db); // Update the thread status to indicate the current thread is doing // something related to the specified column family. static void SetColumnFamily(const ColumnFamilyData* cfd, const Env* env, bool enable_thread_tracking); static void SetThreadOperation(ThreadStatus::OperationType type); static ThreadStatus::OperationStage SetThreadOperationStage( ThreadStatus::OperationStage stage); static void SetThreadOperationProperty( int code, uint64_t value); static void IncreaseThreadOperationProperty( int code, uint64_t delta); static void SetThreadState(ThreadStatus::StateType type); static void ResetThreadStatus(); #ifndef NDEBUG static void TEST_SetStateDelay( const ThreadStatus::StateType state, int micro); static void TEST_StateDelay(const ThreadStatus::StateType state); #endif protected: // Initialize the thread-local ThreadStatusUpdater when it finds // the cached value is nullptr. Returns true if it has cached // a non-null pointer. static bool MaybeInitThreadLocalUpdater(const Env* env); #ifdef ROCKSDB_USING_THREAD_STATUS // A boolean flag indicating whether thread_updater_local_cache_ // is initialized. It is set to true when an Env uses any // ThreadStatusUtil functions using the current thread other // than UnregisterThread(). It will be set to false when // UnregisterThread() is called. // // When this variable is set to true, thread_updater_local_cache_ // will not be updated until this variable is again set to false // in UnregisterThread(). static __thread bool thread_updater_initialized_; // The thread-local cached ThreadStatusUpdater that caches the // thread_status_updater_ of the first Env that uses any ThreadStatusUtil // function other than UnregisterThread(). This variable will // be cleared when UnregisterThread() is called. // // When this variable is set to a non-null pointer, then the status // of the current thread will be updated when a function of // ThreadStatusUtil is called. Otherwise, all functions of // ThreadStatusUtil will be no-op. // // When thread_updater_initialized_ is set to true, this variable // will not be updated until this thread_updater_initialized_ is // again set to false in UnregisterThread(). static __thread ThreadStatusUpdater* thread_updater_local_cache_; #else static bool thread_updater_initialized_; static ThreadStatusUpdater* thread_updater_local_cache_; #endif }; // A helper class for updating thread state. It will set the // thread state according to the input parameter in its constructor // and set the thread state to the previous state in its destructor. class AutoThreadOperationStageUpdater { public: explicit AutoThreadOperationStageUpdater( ThreadStatus::OperationStage stage); ~AutoThreadOperationStageUpdater(); #ifdef ROCKSDB_USING_THREAD_STATUS private: ThreadStatus::OperationStage prev_stage_; #endif }; } // namespace rocksdb