#pragma once
#include <atomic>
#include "storage/buffer_manager/memory_manager.h"
#include "storage/file_handle.h"
namespace lbug {
namespace common {
class VirtualFileSystem;
};
namespace storage {
class InMemChunkedNodeGroup;
class BufferManager;
class ColumnChunkData;
class Spiller {
public:
Spiller(std::string tmpFilePath, BufferManager& bufferManager, common::VirtualFileSystem* vfs);
void addUnusedChunk(InMemChunkedNodeGroup* nodeGroup);
void clearUnusedChunk(InMemChunkedNodeGroup* nodeGroup);
SpillResult spillToDisk(ColumnChunkData& chunk) const;
void loadFromDisk(ColumnChunkData& chunk) const;
SpillResult claimNextGroup();
void clearFile();
~Spiller();
private:
FileHandle* getOrCreateDataFH() const;
FileHandle* getDataFH() const;
private:
std::string tmpFilePath;
BufferManager& bufferManager;
common::VirtualFileSystem* vfs;
std::unordered_set<InMemChunkedNodeGroup*> fullPartitionerGroups;
std::atomic<FileHandle*> dataFH;
std::mutex partitionerGroupsMtx;
mutable std::mutex fileCreationMutex;
};
} }