[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
This commit is contained in:
Haobo Xu 2013-05-24 12:52:45 -07:00
parent 0e879c93de
commit ef15b9d178
2 changed files with 19 additions and 15 deletions

View File

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

View File

@ -5,6 +5,7 @@
#ifndef STORAGE_LEVELDB_DB_DB_IMPL_H_
#define STORAGE_LEVELDB_DB_DB_IMPL_H_
#include <atomic>
#include <deque>
#include <set>
#include "db/dbformat.h"
@ -277,7 +278,7 @@ class DBImpl : public DB {
uint64_t purge_wal_files_last_run_;
// 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.
uint64_t stall_level0_slowdown_;