//  Copyright (c) 2018-present, Facebook, Inc.  All rights reserved.
//  This source code is licensed under both the GPLv2 (found in the
//  COPYING file in the root directory) and Apache 2.0 License
//  (found in the LICENSE.Apache file in the root directory).
#pragma once

#include "monitoring/instrumented_mutex.h"
#include "options/db_options.h"
#include "rocksdb/listener.h"
#include "rocksdb/status.h"

namespace rocksdb {

class ErrorHandler {
  public:
    ErrorHandler(const ImmutableDBOptions& db_options,
        InstrumentedMutex* db_mutex)
      : db_options_(db_options),
        bg_error_(Status::OK()),
        db_mutex_(db_mutex)
      {}
    ~ErrorHandler() {}

    Status::Severity GetErrorSeverity(BackgroundErrorReason reason,
        Status::Code code, Status::SubCode subcode);

    Status SetBGError(const Status& bg_err, BackgroundErrorReason reason);

    Status GetBGError()
    {
      return bg_error_;
    }

    void ClearBGError() {
      bg_error_ = Status::OK();
    }

    bool IsDBStopped() {
      return !bg_error_.ok();
    }

    bool IsBGWorkStopped() {
      return !bg_error_.ok();
    }

  private:
    const ImmutableDBOptions& db_options_;
    Status bg_error_;
    InstrumentedMutex* db_mutex_;
};

}