[RocksDB] Fix MaybeDumpStats

Summary: MaybeDumpStats was causing lock problem

Test Plan: make check; db_stress

Reviewers: dhruba

Reviewed By: dhruba

Differential Revision: https://reviews.facebook.net/D10935
main
Haobo Xu 12 years ago
parent 0e879c93de
commit ef15b9d178
  1. 31
      db/db_impl.cc
  2. 3
      db/db_impl.h

@ -305,20 +305,21 @@ const Status DBImpl::CreateArchivalDirectory() {
} }
void DBImpl::MaybeDumpStats() { void DBImpl::MaybeDumpStats() {
mutex_.AssertHeld(); if (options_.stats_dump_period_sec == 0) return;
if (options_.stats_dump_period_sec != 0) { const uint64_t now_micros = env_->NowMicros();
const uint64_t now_micros = env_->NowMicros();
if (last_stats_dump_time_microsec_ + if (last_stats_dump_time_microsec_ +
options_.stats_dump_period_sec * 1000000 options_.stats_dump_period_sec * 1000000
<= now_micros) { <= now_micros) {
last_stats_dump_time_microsec_ = now_micros; // Multiple threads could race in here simultaneously.
mutex_.Unlock(); // However, the last one will update last_stats_dump_time_microsec_
std::string stats; // atomically. We could see more than one dump during one dump
GetProperty("leveldb.stats", &stats); // period in rare cases.
Log(options_.info_log, "%s", stats.c_str()); last_stats_dump_time_microsec_ = now_micros;
mutex_.Lock(); std::string stats;
} GetProperty("leveldb.stats", &stats);
Log(options_.info_log, "%s", stats.c_str());
} }
} }
@ -1233,6 +1234,9 @@ void DBImpl::TEST_PurgeObsoleteteWAL() {
void DBImpl::BackgroundCall() { void DBImpl::BackgroundCall() {
bool madeProgress = false; bool madeProgress = false;
DeletionState deletion_state; DeletionState deletion_state;
MaybeDumpStats();
MutexLock l(&mutex_); MutexLock l(&mutex_);
// Log(options_.info_log, "XXX BG Thread %llx process new work item", pthread_self()); // Log(options_.info_log, "XXX BG Thread %llx process new work item", pthread_self());
assert(bg_compaction_scheduled_); assert(bg_compaction_scheduled_);
@ -1273,7 +1277,6 @@ void DBImpl::BackgroundCall() {
} }
bg_cv_.SignalAll(); bg_cv_.SignalAll();
MaybeDumpStats();
} }
Status DBImpl::BackgroundCompaction(bool* madeProgress, Status DBImpl::BackgroundCompaction(bool* madeProgress,

@ -5,6 +5,7 @@
#ifndef STORAGE_LEVELDB_DB_DB_IMPL_H_ #ifndef STORAGE_LEVELDB_DB_DB_IMPL_H_
#define STORAGE_LEVELDB_DB_DB_IMPL_H_ #define STORAGE_LEVELDB_DB_DB_IMPL_H_
#include <atomic>
#include <deque> #include <deque>
#include <set> #include <set>
#include "db/dbformat.h" #include "db/dbformat.h"
@ -277,7 +278,7 @@ class DBImpl : public DB {
uint64_t purge_wal_files_last_run_; uint64_t purge_wal_files_last_run_;
// last time stats were dumped to LOG // last time stats were dumped to LOG
uint64_t last_stats_dump_time_microsec_; std::atomic<uint64_t> last_stats_dump_time_microsec_;
// These count the number of microseconds for which MakeRoomForWrite stalls. // These count the number of microseconds for which MakeRoomForWrite stalls.
uint64_t stall_level0_slowdown_; uint64_t stall_level0_slowdown_;

Loading…
Cancel
Save