Summary: GetThreadList() feature depends on the thread creation and destruction, which is currently handled under Env. This patch moves GetThreadList() feature under Env to better manage the dependency of GetThreadList() feature on thread creation and destruction. Renamed ThreadStatusImpl to ThreadStatusUpdater. Add ThreadStatusUtil, which is a static class contains utility functions for ThreadStatusUpdater. Test Plan: run db_test, thread_list_test and db_bench and verify the life cycle of Env and ThreadStatusUpdater is properly managed. Reviewers: igor, sdong Reviewed By: sdong Subscribers: ljin, dhruba, leveldb Differential Revision: https://reviews.facebook.net/D30057main
parent
4fd26f287c
commit
45bab305f9
@ -0,0 +1,102 @@ |
||||
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
|
||||
#include "rocksdb/env.h" |
||||
#include "util/thread_status_updater.h" |
||||
#include "util/thread_status_util.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
#if ROCKSDB_USING_THREAD_STATUS |
||||
__thread ThreadStatusUpdater* |
||||
ThreadStatusUtil::thread_updater_local_cache_ = nullptr; |
||||
__thread bool ThreadStatusUtil::thread_updater_initialized_ = false; |
||||
|
||||
void ThreadStatusUtil::SetThreadType( |
||||
const Env* env, ThreadStatus::ThreadType thread_type) { |
||||
if (!MaybeInitThreadLocalUpdater(env)) { |
||||
return; |
||||
} |
||||
assert(thread_updater_local_cache_); |
||||
thread_updater_local_cache_->SetThreadType(thread_type); |
||||
} |
||||
|
||||
void ThreadStatusUtil::UnregisterThread() { |
||||
thread_updater_initialized_ = false; |
||||
if (thread_updater_local_cache_ != nullptr) { |
||||
thread_updater_local_cache_->UnregisterThread(); |
||||
thread_updater_local_cache_ = nullptr; |
||||
} |
||||
} |
||||
|
||||
void ThreadStatusUtil::SetColumnFamily(const ColumnFamilyData* cfd) { |
||||
if (!MaybeInitThreadLocalUpdater(cfd->ioptions()->env)) { |
||||
return; |
||||
} |
||||
assert(thread_updater_local_cache_); |
||||
thread_updater_local_cache_->SetColumnFamilyInfoKey(cfd); |
||||
} |
||||
|
||||
void ThreadStatusUtil::NewColumnFamilyInfo( |
||||
const DB* db, const ColumnFamilyData* cfd) { |
||||
if (!MaybeInitThreadLocalUpdater(cfd->ioptions()->env)) { |
||||
return; |
||||
} |
||||
assert(thread_updater_local_cache_); |
||||
if (thread_updater_local_cache_) { |
||||
thread_updater_local_cache_->NewColumnFamilyInfo( |
||||
db, db->GetName(), cfd, cfd->GetName()); |
||||
} |
||||
} |
||||
|
||||
void ThreadStatusUtil::EraseColumnFamilyInfo( |
||||
const ColumnFamilyData* cfd) { |
||||
if (thread_updater_local_cache_ == nullptr) { |
||||
return; |
||||
} |
||||
thread_updater_local_cache_->EraseColumnFamilyInfo(cfd); |
||||
} |
||||
|
||||
void ThreadStatusUtil::EraseDatabaseInfo(const DB* db) { |
||||
if (thread_updater_local_cache_ == nullptr) { |
||||
return; |
||||
} |
||||
thread_updater_local_cache_->EraseDatabaseInfo(db); |
||||
} |
||||
|
||||
bool ThreadStatusUtil::MaybeInitThreadLocalUpdater(const Env* env) { |
||||
if (!thread_updater_initialized_ && env != nullptr) { |
||||
thread_updater_initialized_ = true; |
||||
thread_updater_local_cache_ = env->GetThreadStatusUpdater(); |
||||
} |
||||
return (thread_updater_local_cache_ != nullptr); |
||||
} |
||||
|
||||
#else |
||||
|
||||
ThreadStatusUpdater* ThreadStatusUtil::thread_updater_local_cache_ = nullptr; |
||||
bool ThreadStatusUtil::thread_updater_initialized_ = false; |
||||
|
||||
bool ThreadStatusUtil::MaybeInitThreadLocalUpdater(const Env* env) { |
||||
return false; |
||||
} |
||||
|
||||
void ThreadStatusUtil::SetColumnFamily(const ColumnFamilyData* cfd) { |
||||
} |
||||
|
||||
void ThreadStatusUtil::NewColumnFamilyInfo( |
||||
const DB* db, const ColumnFamilyData* cfd) { |
||||
} |
||||
|
||||
void ThreadStatusUtil::EraseColumnFamilyInfo( |
||||
const ColumnFamilyData* cfd) { |
||||
} |
||||
|
||||
void ThreadStatusUtil::EraseDatabaseInfo(const DB* db) { |
||||
} |
||||
|
||||
#endif // ROCKSDB_USING_THREAD_STATUS
|
||||
|
||||
} // namespace rocksdb
|
@ -0,0 +1,93 @@ |
||||
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
||||
// This source code is licensed under the BSD-style license found in the
|
||||
// LICENSE file in the root directory of this source tree. An additional grant
|
||||
// of patent rights can be found in the PATENTS file in the same directory.
|
||||
|
||||
#pragma once |
||||
|
||||
#include "db/column_family.h" |
||||
#include "rocksdb/env.h" |
||||
#include "rocksdb/thread_status.h" |
||||
#include "util/thread_status_updater.h" |
||||
|
||||
namespace rocksdb { |
||||
|
||||
// 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: |
||||
// Set the thread type of the current thread.
|
||||
static void SetThreadType( |
||||
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); |
||||
|
||||
// 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); |
||||
|
||||
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); |
||||
|
||||
#if 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 |
||||
}; |
||||
|
||||
} // namespace rocksdb
|
Loading…
Reference in new issue