#pragma once
#include <map>
#include <ostream>
#include <string>
#include <unordered_map>
#include <vector>
#include "logging/event_logger.h"
#include "port/port.h"
#include "rocksdb/rocksdb_namespace.h"
namespace ROCKSDB_NAMESPACE {
class JSONWriter;
class Slice;
class Status;
using WalNumber = uint64_t;
class WalMetadata {
public:
WalMetadata() = default;
explicit WalMetadata(uint64_t synced_size_bytes)
: synced_size_bytes_(synced_size_bytes) {}
bool HasSyncedSize() const { return synced_size_bytes_ != kUnknownWalSize; }
void SetSyncedSizeInBytes(uint64_t bytes) { synced_size_bytes_ = bytes; }
uint64_t GetSyncedSizeInBytes() const { return synced_size_bytes_; }
private:
friend bool operator==(const WalMetadata& lhs, const WalMetadata& rhs);
friend bool operator!=(const WalMetadata& lhs, const WalMetadata& rhs);
constexpr static uint64_t kUnknownWalSize =
std::numeric_limits<uint64_t>::max();
uint64_t synced_size_bytes_ = kUnknownWalSize;
};
inline bool operator==(const WalMetadata& lhs, const WalMetadata& rhs) {
return lhs.synced_size_bytes_ == rhs.synced_size_bytes_;
}
inline bool operator!=(const WalMetadata& lhs, const WalMetadata& rhs) {
return !(lhs == rhs);
}
enum class WalAdditionTag : uint32_t {
kTerminate = 1,
kSyncedSize = 2,
};
class WalAddition {
public:
WalAddition() : number_(0), metadata_() {}
explicit WalAddition(WalNumber number) : number_(number), metadata_() {}
WalAddition(WalNumber number, WalMetadata meta)
: number_(number), metadata_(std::move(meta)) {}
WalNumber GetLogNumber() const { return number_; }
const WalMetadata& GetMetadata() const { return metadata_; }
void EncodeTo(std::string* dst) const;
Status DecodeFrom(Slice* src);
std::string DebugString() const;
private:
WalNumber number_;
WalMetadata metadata_;
};
std::ostream& operator<<(std::ostream& os, const WalAddition& wal);
JSONWriter& operator<<(JSONWriter& jw, const WalAddition& wal);
using WalAdditions = std::vector<WalAddition>;
class WalDeletion {
public:
WalDeletion() : number_(kEmpty) {}
explicit WalDeletion(WalNumber number) : number_(number) {}
WalNumber GetLogNumber() const { return number_; }
void EncodeTo(std::string* dst) const;
Status DecodeFrom(Slice* src);
std::string DebugString() const;
bool IsEmpty() const { return number_ == kEmpty; }
void Reset() { number_ = kEmpty; }
private:
static constexpr WalNumber kEmpty = 0;
WalNumber number_;
};
std::ostream& operator<<(std::ostream& os, const WalDeletion& wal);
JSONWriter& operator<<(JSONWriter& jw, const WalDeletion& wal);
class WalSet {
public:
Status AddWal(const WalAddition& wal);
Status AddWals(const WalAdditions& wals);
Status DeleteWalsBefore(WalNumber wal);
void Reset();
WalNumber GetMinWalNumberToKeep() const { return min_wal_number_to_keep_; }
const std::map<WalNumber, WalMetadata>& GetWals() const { return wals_; }
Status CheckWals(
Env* env,
const std::unordered_map<WalNumber, std::string>& logs_on_disk) const;
private:
std::map<WalNumber, WalMetadata> wals_;
WalNumber min_wal_number_to_keep_ = 0;
};
}