summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChangli Gao <xiaosuo@gmail.com>2016-11-20 18:14:33 -0800
committerIslam AbdelRahman <tec@fb.com>2016-12-09 12:59:51 -0800
commit8e68ffb872f3ead8b0fc3bb6353c04008a049d8d (patch)
tree9aa5f8df774557d6521963baf4811b62b791fb2c
parent41526f44f6babf4201687c3f6efb11f59a10ab8c (diff)
Fix deadlock when calling getMergedHistogramv4.13rocksdb-4.13
Summary: When calling StatisticsImpl::HistogramInfo::getMergedHistogram(), if there is a dying thread, which is calling ThreadLocalPtr::StaticMeta::OnThreadExit() to merge its thread values to HistogramInfo, deadlock will occur. Because the former try to hold merge_lock then ThreadMeta::mutex_, but the later try to hold ThreadMeta::mutex_ then merge_lock. In short, the locking order isn't the same. This patch addressed this issue by releasing merge_lock before folding thread values. Closes https://github.com/facebook/rocksdb/pull/1552 Differential Revision: D4211942 Pulled By: ajkr fbshipit-source-id: ef89bcb
-rw-r--r--util/statistics.cc6
1 files changed, 4 insertions, 2 deletions
diff --git a/util/statistics.cc b/util/statistics.cc
index a27001eea..051956839 100644
--- a/util/statistics.cc
+++ b/util/statistics.cc
@@ -51,9 +51,11 @@ uint64_t StatisticsImpl::getTickerCount(uint32_t tickerType) const {
std::unique_ptr<HistogramImpl>
StatisticsImpl::HistogramInfo::getMergedHistogram() const {
- MutexLock lock(&merge_lock);
std::unique_ptr<HistogramImpl> res_hist(new HistogramImpl());
- res_hist->Merge(merged_hist);
+ {
+ MutexLock lock(&merge_lock);
+ res_hist->Merge(merged_hist);
+ }
thread_value->Fold(
[](void* curr_ptr, void* res) {
auto tmp_res_hist = static_cast<HistogramImpl*>(res);