Fix deadlock when calling getMergedHistogram

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
main
Changli Gao 8 years ago committed by Facebook Github Bot
parent fe349db57b
commit a0deec960f
  1. 6
      util/statistics.cc

@ -51,9 +51,11 @@ uint64_t StatisticsImpl::getTickerCount(uint32_t tickerType) const {
std::unique_ptr<HistogramImpl> std::unique_ptr<HistogramImpl>
StatisticsImpl::HistogramInfo::getMergedHistogram() const { StatisticsImpl::HistogramInfo::getMergedHistogram() const {
MutexLock lock(&merge_lock);
std::unique_ptr<HistogramImpl> res_hist(new HistogramImpl()); 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( thread_value->Fold(
[](void* curr_ptr, void* res) { [](void* curr_ptr, void* res) {
auto tmp_res_hist = static_cast<HistogramImpl*>(res); auto tmp_res_hist = static_cast<HistogramImpl*>(res);

Loading…
Cancel
Save