#pragma once
#include <unordered_map>
#include "common/types/types.h"
#include "storage/database_header.h"
#include "storage/page_range.h"
namespace lbug {
namespace transaction {
class Transaction;
}
namespace catalog {
class Catalog;
}
namespace common {
class VirtualFileSystem;
} namespace testing {
struct FSMLeakChecker;
}
namespace main {
class AttachedLbugDatabase;
}
namespace storage {
class StorageManager;
class Checkpointer {
friend class main::AttachedLbugDatabase;
friend struct testing::FSMLeakChecker;
public:
explicit Checkpointer(main::ClientContext& clientContext);
virtual ~Checkpointer();
void writeCheckpoint();
void beginCheckpoint(common::transaction_t snapshotTS);
void checkpointStoragePhase();
void finishCheckpoint();
void postCheckpointCleanup();
void rollback();
bool wasWalRotated() const { return walRotated; }
void readCheckpoint();
static bool canAutoCheckpoint(const main::ClientContext& clientContext,
const transaction::Transaction& transaction);
protected:
virtual bool checkpointStorage();
virtual void serializeCatalogAndMetadata(DatabaseHeader& databaseHeader,
bool hasStorageChanges);
virtual void writeDatabaseHeader(const DatabaseHeader& header);
virtual void logCheckpointAndApplyShadowPages(bool walRotated = false);
private:
static void readCheckpoint(main::ClientContext* context, catalog::Catalog* catalog,
StorageManager* storageManager);
PageRange serializeCatalog(const catalog::Catalog& catalog, StorageManager& storageManager);
PageRange serializeCatalogSnapshot(const catalog::Catalog& catalog,
StorageManager& storageManager);
PageRange serializeMetadata(const catalog::Catalog& catalog, StorageManager& storageManager);
PageRange serializeMetadataSnapshot(const catalog::Catalog& catalog,
StorageManager& storageManager);
protected:
main::ClientContext& clientContext;
bool isInMemory;
StorageManager* mainStorageManager;
bool walRotated = false;
common::transaction_t snapshotTS = 0;
DatabaseHeader checkpointHeader{};
bool hasStorageChanges = false;
uint64_t catalogVersionAtCheckpoint = 0;
uint64_t pageManagerVersionAtCheckpoint = 0;
std::unordered_map<common::table_id_t, uint64_t> tableEpochWatermarks;
};
} }