#pragma once
#include <condition_variable>
#include <mutex>
#include <string>
#include "storage/wal/wal_record.h"
namespace lbug {
namespace common {
class BufferedFileWriter;
class VirtualFileSystem;
}
namespace storage {
class LocalWAL;
class WAL {
public:
WAL(const std::string& dbPath, bool readOnly, bool enableChecksums,
common::VirtualFileSystem* vfs);
~WAL();
void logCommittedWAL(LocalWAL& localWAL, main::ClientContext* context,
uint64_t& commitSequence);
void logAndFlushCheckpoint(main::ClientContext* context);
bool rotateForCheckpoint(main::ClientContext* context);
void logAndFlushCheckpointToFrozen(main::ClientContext* context);
void clearFrozenWAL();
void clear();
void reset();
uint64_t getFileSize();
void throwIfPoisoned();
static WAL* Get(const main::ClientContext& context);
private:
void initWriter(main::ClientContext* context);
void addNewWALRecordNoLock(const WALRecord& walRecord);
void throwIfPoisonedNoLock() const;
void poisonNoLock(const std::string& reason);
void waitForDurabilityNoLock(uint64_t commitSequence, std::unique_lock<std::mutex>& lck);
void flushAndSyncNoLock();
void writeHeader(main::ClientContext& context);
private:
std::mutex mtx;
std::string walPath;
std::string checkpointWalPath;
bool inMemory;
[[maybe_unused]] bool readOnly;
common::VirtualFileSystem* vfs;
std::unique_ptr<common::FileInfo> fileInfo;
std::condition_variable groupCommitCV;
uint64_t appendedCommitSequence = 0;
uint64_t durableCommitSequence = 0;
bool syncInProgress = false;
bool poisoned = false;
std::string poisonReason;
std::unique_ptr<common::Serializer> serializer;
bool enableChecksums;
};
} }