]> git-server-git.apps.pok.os.sepia.ceph.com Git - rocksdb.git/commitdiff
Fix deadlock when calling getMergedHistogram
authorChangli Gao <xiaosuo@gmail.com>
Mon, 21 Nov 2016 02:14:33 +0000 (18:14 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Mon, 21 Nov 2016 02:24:12 +0000 (18:24 -0800)
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

util/statistics.cc

index a27001eeab9a286757863e3b91ac1a4cb96feb8d..051956839b063bb914bbd560845e69248c53d8fe 100644 (file)
@@ -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);