thread_status_util.h 5.1 KB
Newer Older
1
// Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
S
Siying Dong 已提交
2 3 4
//  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).
5 6 7

#pragma once

8 9
#include <string>

10
#include "monitoring/thread_status_updater.h"
11
#include "rocksdb/db.h"
12 13 14
#include "rocksdb/env.h"
#include "rocksdb/thread_status.h"

15
namespace ROCKSDB_NAMESPACE {
16

17
class ColumnFamilyData;
18

19 20 21 22 23 24 25 26 27 28 29 30 31
// 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:
32 33
  // Register the current thread for tracking.
  static void RegisterThread(
34 35 36 37 38 39 40 41
      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.
42 43
  static void NewColumnFamilyInfo(const DB* db, const ColumnFamilyData* cfd,
                                  const std::string& cf_name, const Env* env);
44 45 46 47 48 49 50 51 52 53 54 55 56

  // 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.
57 58
  static void SetColumnFamily(const ColumnFamilyData* cfd, const Env* env,
                              bool enable_thread_tracking);
59

60 61
  static void SetThreadOperation(ThreadStatus::OperationType type);

62 63 64
  static ThreadStatus::OperationStage SetThreadOperationStage(
      ThreadStatus::OperationStage stage);

65 66 67 68 69 70
  static void SetThreadOperationProperty(
      int code, uint64_t value);

  static void IncreaseThreadOperationProperty(
      int code, uint64_t delta);

71 72 73 74
  static void SetThreadState(ThreadStatus::StateType type);

  static void ResetThreadStatus();

75 76 77 78 79 80
#ifndef NDEBUG
  static void TEST_SetStateDelay(
      const ThreadStatus::StateType state, int micro);
  static void TEST_StateDelay(const ThreadStatus::StateType state);
#endif

81 82 83 84 85 86
 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);

D
Daniel Black 已提交
87
#ifdef ROCKSDB_USING_THREAD_STATUS
88 89 90 91 92 93 94 95 96
  // 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().
97
  static thread_local bool thread_updater_initialized_;
98 99 100 101 102 103 104 105 106 107 108 109 110 111

  // 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().
112
  static thread_local ThreadStatusUpdater* thread_updater_local_cache_;
113 114 115 116 117 118
#else
  static bool thread_updater_initialized_;
  static ThreadStatusUpdater* thread_updater_local_cache_;
#endif
};

119 120 121 122 123 124 125 126 127
// 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();

D
Daniel Black 已提交
128
#ifdef ROCKSDB_USING_THREAD_STATUS
129 130
 private:
  ThreadStatus::OperationStage prev_stage_;
131
#endif
132 133
};

134
}  // namespace ROCKSDB_NAMESPACE