taco-db  0.1.0
FileManager.h
Go to the documentation of this file.
1 #ifndef STORAGE_FILEMANAGER_H
2 #define STORAGE_FILEMANAGER_H
3 
4 #include "tdb.h"
5 
6 #include <mutex>
7 
9 #include "storage/FSFile.h"
10 
11 #include "utils/Latch.h"
12 
13 namespace taco {
14 
24 public:
25  constexpr bool
26  IsAllocated() const {
28  }
29 
30  constexpr bool
31  IsMetaPage() const {
32  return m_flags & FLAG_META_PAGE;
33  }
34 
35  constexpr bool
36  IsVFilePage() const {
37  return m_flags & FLAG_VFILE_PAGE;
38  }
39 
40  constexpr bool
41  IsFMMetaPage() const {
42  return (m_flags & (FLAG_META_PAGE | FLAG_VFILE_PAGE)) ==
44  }
45 
46  constexpr bool
47  IsVFileMetaPage() const {
48  return (m_flags & (FLAG_META_PAGE | FLAG_VFILE_PAGE)) ==
50  }
51 
52  constexpr bool
53  IsVFileDataPage() const {
54  return (m_flags & (FLAG_META_PAGE | FLAG_VFILE_PAGE)) ==
56  }
57 
65  return m_next_pid.load(memory_order_acquire);
66  }
67 
75  return m_prev_pid.load(memory_order_relaxed);
76  }
77 
78  constexpr FileId
79  GetFileId() const {
80  return m_fid;
81  }
82 
83 
84 private:
85  uint16_t m_flags;
86  uint16_t m_reserved;
88  atomic<PageNumber> m_prev_pid;
89  atomic<PageNumber> m_next_pid;
90 
91  static constexpr uint16_t FLAG_META_PAGE = 0x1;
92  static constexpr uint16_t FLAG_VFILE_PAGE = 0x2;
93 
94  friend class FileManager;
95  friend class File;
96 };
97 
98 // We require PageHeaderData to be in standard-layout and trivial (for it's
99 // written to a disk page as binary), i.e., a POD prior to C++20.
100 static_assert(std::is_standard_layout<PageHeaderData>::value &&
101  std::is_trivial<PageHeaderData>::value);
102 
103 constexpr FileId WAL_FILEID_MASK = ((FileId) 1) << 31;
104 constexpr FileId TMP_FILEID_MASK = ((FileId) 1) << 30;
105 constexpr int FileIdBits = 19;
106 constexpr FileId MinRegularFileId = 1;
107 constexpr FileId MaxRegularFileId = (((FileId) 1) << (FileIdBits + 1)) - 1;
108 constexpr FileId INVALID_FID = 0;
109 
110 
113 
114 class FMMetaPageData;
115 class File;
116 class FreePageList;
117 class FileManager;
118 
119 } // namespace taco
120 
121 // no namepsace for unmangled names, use taco_ prefix instead.
122 // The functions may be wrapped with --wrap flag to GNU ld in tests.
123 extern "C" {
124 
126  ::taco::PageNumber pid,
127  char *buf);
128 
130  ::taco::PageNumber pid,
131  char *buf);
132 
134  ::taco::PageNumber pid,
135  char *buf);
136 
138  ::taco::PageNumber pid,
139  const char *buf);
140 
142  ::taco::PageNumber pid,
143  const char *buf);
144 
146  ::taco::PageNumber pid,
147  const char *buf);
148 }
149 namespace taco {
174 class FileManager {
175 public:
176  FileManager();
177 
178  ~FileManager();
179 
180  void CloseAll();
181 
200  void Init(std::string datadir, size_t init_size, bool create);
201 
219  std::unique_ptr<File> Open(FileId fid);
220 
228  inline void
229  ReadPage(PageNumber pid, char *buf) {
230  taco_fileman_readpage_impl(this, pid, buf);
231  }
232 
241  inline void
242  WritePage(PageNumber pid, const char *buf) {
243  taco_fileman_writepage_impl(this, pid, buf);
244  }
245 
251  void Flush();
252 
256  std::string GetMainDataFilePath(uint64_t DataFileId) const;
257 
258 private:
259  void FormatMeta();
260 
261  void LoadMeta();
262 
263  std::unique_ptr<File> CreateTmpFile();
264 
265  std::unique_ptr<File> OpenTmpFile(FileId fid);
266 
267  std::unique_ptr<File> CreateRegularFile();
268 
269  std::unique_ptr<File> OpenRegularFile(FileId fid);
270 
272 
273  void AllocateL2FileDirectory(BufferId fdir1_bufid, size_t fdir1_off);
274 
276 
277  void InitFreePageList(FreePageList *fpl, PageNumber last_pg);
278 
280 
282  BufferId pg_bufid,
283  BufferId meta_bufid);
284 
286 
287  std::mutex m_fdir1_latch;
288 
289  std::mutex m_meta_latch;
290 
291  std::string m_datadir;
292 
293  std::string m_maindir;
294 
295  std::string m_tmpdir;
296 
297  std::string m_waldir;
298 
299  std::vector<std::unique_ptr<FSFile>> m_mainfiles;
300 
302 
303  friend class File;
304 
307  char*);
310  const char*);
313  char*);
316  const char*);
317 };
318 
322 class File {
323 public:
327  ~File();
328 
332  void Close();
333 
334  constexpr bool
335  IsOpen() const noexcept {
336  return m_fileid != INVALID_FID;
337  }
338 
350  void ReadPage(PageNumber pid, char *buf) const;
351 
363  void WritePage(PageNumber pid, const char *buf);
364 
376  PageNumber
378  return (PageNumber) AllocatePageImpl(false, LatchMode::SH);
379  }
380 
387  BufferId
389  return (BufferId) AllocatePageImpl(true, mode);
390  }
391 
401  void FreePage(BufferId bufid);
402 
408  void FreePage(ScopedBufferId &bufid) {
409  FreePage(bufid.Release());
410  }
411 
424 
439 
448  void Flush();
449 
450  constexpr FileId
451  GetFileId() const {
452  return m_fileid;
453  }
454 
455  constexpr bool
456  IsMainFile() const {
457  return !(m_fileid & (WAL_FILEID_MASK | TMP_FILEID_MASK));
458  }
459 
460  constexpr bool
461  IsTmpFile() const {
462  return m_fileid & TMP_FILEID_MASK;
463  }
464 
465  constexpr bool
466  IsWalFile() const {
467  return m_fileid & WAL_FILEID_MASK;
468  }
469 
470 private:
471  File():
474  m_fsfile(nullptr) {}
475 
479  uint64_t AllocatePageImpl(bool need_latch, LatchMode mode);
480 
481  // state for all files
483 
484  // state for main file
486 
487  // alternative state for tmp file
488  std::unique_ptr<FSFile> m_fsfile;
489 
490  friend class FileManager;
491 };
492 
493 } // namespace taco
494 
495 #endif // STORAGE_FILEMANAGER_H
taco::FileManager::GetNextFreePageNumber
PageNumber GetNextFreePageNumber(FreePageList *fpl, BufferId meta_bufid)
Definition: FileManager.cpp:576
taco::MinRegularFileId
constexpr FileId MinRegularFileId
Definition: FileManager.h:106
taco::PageHeaderData::m_prev_pid
atomic< PageNumber > m_prev_pid
Definition: FileManager.h:88
taco::File::IsWalFile
constexpr bool IsWalFile() const
Definition: FileManager.h:466
taco::FileManager::m_datadir
std::string m_datadir
Definition: FileManager.h:291
taco::File::GetLastPageNumber
PageNumber GetLastPageNumber() const
Returns the last page's PID.
Definition: FileManager.cpp:1006
taco::PageHeaderData::IsAllocated
constexpr bool IsAllocated() const
Definition: FileManager.h:26
taco::LatchMode
LatchMode
Definition: Latch.h:11
taco::FileManager::CreateTmpFile
std::unique_ptr< File > CreateTmpFile()
Definition: FileManager.cpp:306
taco::FileManager::LoadMeta
void LoadMeta()
Definition: FileManager.cpp:248
__real_taco_fileman_writepage_impl
void __real_taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
__real_taco_fileman_readpage_impl
void __real_taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
taco::File::WritePage
void WritePage(PageNumber pid, const char *buf)
Writes a page at the specified page number.
Definition: FileManager.cpp:778
taco::ResourceGuard::Release
T Release()
Releases the underlying resource without relinquishing it and returns it to the caller.
Definition: ResourceGuard.h:137
taco::INVALID_PID
constexpr PageNumber INVALID_PID
The invalid page number.
Definition: tdb_base.h:236
taco::FileManager::GetMainDataFilePath
std::string GetMainDataFilePath(uint64_t DataFileId) const
Returns the path to the specified main data file.
Definition: FileManager.cpp:207
taco::PageHeaderData::GetNextPageNumber
PageNumber GetNextPageNumber() const
Returns the next page number.
Definition: FileManager.h:64
taco::File::m_fileid
FileId m_fileid
Definition: FileManager.h:482
taco::FileManager::m_mainfiles
std::vector< std::unique_ptr< FSFile > > m_mainfiles
Definition: FileManager.h:299
taco::NEW_REGULAR_FID
constexpr FileId NEW_REGULAR_FID
Definition: FileManager.h:111
taco::File::AllocatePage
PageNumber AllocatePage()
Allocates a new page in the file and returns it page number.
Definition: FileManager.h:377
taco::FileManager::m_meta
FMMetaPageData * m_meta
Definition: FileManager.h:301
taco::FileManager::ReadPage
void ReadPage(PageNumber pid, char *buf)
Reading a page pid in the main data file into buf.
Definition: FileManager.h:229
taco::FileManager::OpenRegularFile
std::unique_ptr< File > OpenRegularFile(FileId fid)
Definition: FileManager.cpp:407
Latch.h
taco::File::File
File()
Definition: FileManager.h:471
taco
Definition: datum.h:28
taco::FreePageList
Definition: FileManager_private.h:91
taco::FileManager::Open
std::unique_ptr< File > Open(FileId fid)
Creates or opens a virtual file.
Definition: FileManager.cpp:262
taco::INVALID_FID
constexpr FileId INVALID_FID
Definition: FileManager.h:108
taco::PageHeaderData::IsFMMetaPage
constexpr bool IsFMMetaPage() const
Definition: FileManager.h:41
taco::FileIdBits
constexpr int FileIdBits
Definition: FileManager.h:105
taco::FileManager::FindFreeFileId
FileId FindFreeFileId()
Definition: FileManager.cpp:448
taco::PageHeaderData::FLAG_META_PAGE
static constexpr uint16_t FLAG_META_PAGE
Definition: FileManager.h:91
taco::File::AllocatePageImpl
uint64_t AllocatePageImpl(bool need_latch, LatchMode mode)
The actual implementation of AllocatePage().
Definition: FileManager.cpp:826
taco::BufferId
uint64_t BufferId
Definition: tdb_base.h:215
taco::PageHeaderData::GetFileId
constexpr FileId GetFileId() const
Definition: FileManager.h:79
taco::PageHeaderData::m_next_pid
atomic< PageNumber > m_next_pid
Definition: FileManager.h:89
taco::FileManager::m_tmpdir
std::string m_tmpdir
Definition: FileManager.h:295
taco::MaxRegularFileId
constexpr FileId MaxRegularFileId
Definition: FileManager.h:107
taco::FileManager::AddToFreePageList
void AddToFreePageList(FreePageList *fpl, BufferId pg_bufid, BufferId meta_bufid)
Definition: FileManager.cpp:688
tdb.h
taco::FileManager::m_waldir
std::string m_waldir
Definition: FileManager.h:297
taco::File::~File
~File()
Destructor.
Definition: FileManager.cpp:719
taco::FileManager::m_maindir
std::string m_maindir
Definition: FileManager.h:293
taco::WAL_FILEID_MASK
constexpr FileId WAL_FILEID_MASK
Definition: FileManager.h:103
taco::File::FreePage
void FreePage(BufferId bufid)
Returns a page that belongs to this file to its free page list.
Definition: FileManager.cpp:921
taco::FileManager
FileManager exposes a virtual file interface based on FSFile.
Definition: FileManager.h:174
taco::PageHeaderData
PageHeaderData defines the header of every virtual file data page.
Definition: FileManager.h:23
taco::NEW_TMP_FID
constexpr FileId NEW_TMP_FID
Definition: FileManager.h:112
taco::PageHeaderData::IsVFileDataPage
constexpr bool IsVFileDataPage() const
Definition: FileManager.h:53
taco::PageHeaderData::m_fid
FileId m_fid
Definition: FileManager.h:87
taco::File::m_meta_pid
PageNumber m_meta_pid
Definition: FileManager.h:485
taco::FileManager::m_meta_latch
std::mutex m_meta_latch
Definition: FileManager.h:289
taco::FileManager::AllocateL2FileDirectory
void AllocateL2FileDirectory(BufferId fdir1_bufid, size_t fdir1_off)
Definition: FileManager.cpp:514
taco::PageHeaderData::m_reserved
uint16_t m_reserved
Definition: FileManager.h:86
taco::FileManager::InitFreePageList
void InitFreePageList(FreePageList *fpl, PageNumber last_pg)
Definition: FileManager.cpp:569
taco::FileManager::m_fsfile_extension_latch
std::mutex m_fsfile_extension_latch
Definition: FileManager.h:285
taco::FileId
uint32_t FileId
The file ID.
Definition: tdb_base.h:222
taco::PageHeaderData::m_flags
uint16_t m_flags
Definition: FileManager.h:85
taco::File::IsMainFile
constexpr bool IsMainFile() const
Definition: FileManager.h:456
taco::File::GetFileId
constexpr FileId GetFileId() const
Definition: FileManager.h:451
taco::LatchMode::SH
@ SH
taco::FileManager::m_fdir1_latch
std::mutex m_fdir1_latch
Definition: FileManager.h:287
taco::FileManager::~FileManager
~FileManager()
Definition: FileManager.cpp:25
taco::FileManager::WritePage
void WritePage(PageNumber pid, const char *buf)
Writing a buffered page in buf to the page pid in the main data file.
Definition: FileManager.h:242
taco::ResourceGuard< BufferId, BufferUnpin, BufferId, INVALID_BUFID >
taco::File::IsTmpFile
constexpr bool IsTmpFile() const
Definition: FileManager.h:461
taco::File
Represents an open virtual file managed by the FileManager.
Definition: FileManager.h:322
taco::File::AllocatePage
BufferId AllocatePage(LatchMode mode)
Allocates a new page in the file and returns a valid buffer ID where is pinned.
Definition: FileManager.h:388
taco_fileman_readpage_impl
void taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
Definition: FileManager_wrappable.cpp:13
taco::File::m_fsfile
std::unique_ptr< FSFile > m_fsfile
Definition: FileManager.h:488
taco::File::Close
void Close()
Closes the file.
Definition: FileManager.cpp:724
taco::File::FreePage
void FreePage(ScopedBufferId &bufid)
Same as FreePage(BufferId) but prevents double free.
Definition: FileManager.h:408
taco::FileManager::FormatMeta
void FormatMeta()
Definition: FileManager.cpp:214
taco::FMMetaPageData
Definition: FileManager_private.h:99
taco::FileManager::CreateRegularFile
std::unique_ptr< File > CreateRegularFile()
Definition: FileManager.cpp:338
taco::PageHeaderData::IsVFileMetaPage
constexpr bool IsVFileMetaPage() const
Definition: FileManager.h:47
taco::File::Flush
void Flush()
Flushes bytes already written to the file.
Definition: FileManager.cpp:807
taco::PageHeaderData::FLAG_VFILE_PAGE
static constexpr uint16_t FLAG_VFILE_PAGE
Definition: FileManager.h:92
__wrap_taco_fileman_readpage_impl
void __wrap_taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
taco::File::IsOpen
constexpr bool IsOpen() const noexcept
Definition: FileManager.h:335
taco::PageHeaderData::GetPrevPageNumber
PageNumber GetPrevPageNumber() const
Returns the previous page number.
Definition: FileManager.h:74
FSFile.h
taco::FileManager::OpenTmpFile
std::unique_ptr< File > OpenTmpFile(FileId fid)
Definition: FileManager.cpp:331
taco::FileManager::AllocatePageGroup
PageNumber AllocatePageGroup()
Definition: FileManager.cpp:535
taco::FileManager::CloseAll
void CloseAll()
Definition: FileManager.cpp:31
taco_fileman_writepage_impl
void taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
Definition: FileManager_wrappable.cpp:34
BufferManager.h
taco::File::ReadPage
void ReadPage(PageNumber pid, char *buf) const
Reads a page at the specified page number.
Definition: FileManager.cpp:749
__wrap_taco_fileman_writepage_impl
void __wrap_taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
taco::File::GetFirstPageNumber
PageNumber GetFirstPageNumber() const
Returns the first page's PID.
Definition: FileManager.cpp:989
taco::FileManager::Flush
void Flush()
Flushes all buffered writes to the main data file to disk.
Definition: FileManager.cpp:713
taco::PageHeaderData::IsMetaPage
constexpr bool IsMetaPage() const
Definition: FileManager.h:31
taco::TMP_FILEID_MASK
constexpr FileId TMP_FILEID_MASK
Definition: FileManager.h:104
taco::FileManager::FileManager
FileManager()
Definition: FileManager.cpp:15
taco::FileManager::Init
void Init(std::string datadir, size_t init_size, bool create)
Initializes the FileManager with a specified data directory path datadir.
Definition: FileManager.cpp:117
taco::PageHeaderData::IsVFilePage
constexpr bool IsVFilePage() const
Definition: FileManager.h:36
taco::PageNumber
uint32_t PageNumber
Definition: tdb_base.h:214