diff options
author | Changli Gao <xiaosuo@gmail.com> | 2016-11-20 18:14:33 -0800 |
---|---|---|
committer | Islam AbdelRahman <tec@fb.com> | 2016-12-09 12:59:51 -0800 |
commit | 8e68ffb872f3ead8b0fc3bb6353c04008a049d8d (patch) | |
tree | 9aa5f8df774557d6521963baf4811b62b791fb2c | |
parent | 41526f44f6babf4201687c3f6efb11f59a10ab8c (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.cc | 6 |
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); |