Revision 2413a06c7bf2a1f3e86680ceb041e75c729f44f1 authored by Igor Canadi on 24 April 2014, 13:22:58 UTC, committed by Igor Canadi on 24 April 2014, 13:22:58 UTC
Summary:
Currently, whenever DB Verification fails we bail out by calling `exit(1)`. This is kind of bad since it causes unclean shutdown and spew of error log messages like:

    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument
    05:03:27 pthread lock: Invalid argument

This diff adds a new parameter that is set to true when verification fails. It can then use the parameter to bail out safely.

Test Plan: Casued artificail failure. Verified that exit was clean.

Reviewers: dhruba, haobo, ljin

Reviewed By: haobo

CC: leveldb

Differential Revision: https://reviews.facebook.net/D18243
1 parent d8fe006
Raw File
stop_watch.h
//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under the BSD-style license found in the
//  LICENSE file in the root directory of this source tree. An additional grant
//  of patent rights can be found in the PATENTS file in the same directory.
//
#pragma once
#include "rocksdb/env.h"
#include "util/statistics.h"

namespace rocksdb {
// Auto-scoped.
// Records the statistic into the corresponding histogram.
class StopWatch {
 public:
  explicit StopWatch(
    Env * const env,
    Statistics* statistics = nullptr,
    const Histograms histogram_name = DB_GET,
    bool auto_start = true) :
      env_(env),
      start_time_((!auto_start && !statistics) ? 0 : env->NowMicros()),
      statistics_(statistics),
      histogram_name_(histogram_name) {}



  uint64_t ElapsedMicros() {
    return env_->NowMicros() - start_time_;
  }

  ~StopWatch() { MeasureTime(statistics_, histogram_name_, ElapsedMicros()); }

 private:
  Env* const env_;
  const uint64_t start_time_;
  Statistics* statistics_;
  const Histograms histogram_name_;

};

// a nano second precision stopwatch
class StopWatchNano {
 public:
  explicit StopWatchNano(Env* const env, bool auto_start = false)
      : env_(env), start_(0) {
    if (auto_start) {
      Start();
    }
  }

  void Start() { start_ = env_->NowNanos(); }

  uint64_t ElapsedNanos(bool reset = false) {
    auto now = env_->NowNanos();
    auto elapsed = now - start_;
    if (reset) {
      start_ = now;
    }
    return elapsed;
  }

 private:
  Env* const env_;
  uint64_t start_;
};

} // namespace rocksdb
back to top