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 struct FMMetaPageData;
115 class File;
116 struct 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 
388  BufferId
390  return (BufferId) AllocatePageImpl(true, mode);
391  }
392 
402  void FreePage(BufferId bufid);
403 
409  void FreePage(ScopedBufferId &bufid) {
410  FreePage(bufid.Release());
411  }
412 
425 
440 
449  void Flush();
450 
451  constexpr FileId
452  GetFileId() const {
453  return m_fileid;
454  }
455 
456  constexpr bool
457  IsMainFile() const {
458  return !(m_fileid & (WAL_FILEID_MASK | TMP_FILEID_MASK));
459  }
460 
461  constexpr bool
462  IsTmpFile() const {
463  return m_fileid & TMP_FILEID_MASK;
464  }
465 
466  constexpr bool
467  IsWalFile() const {
468  return m_fileid & WAL_FILEID_MASK;
469  }
470 
471 private:
472  File():
475  m_fsfile(nullptr) {}
476 
480  uint64_t AllocatePageImpl(bool need_latch, LatchMode mode);
481 
482  // state for all files
484 
485  // state for main file
487 
488  // alternative state for tmp file
489  std::unique_ptr<FSFile> m_fsfile;
490 
491  friend class FileManager;
492 };
493 
494 } // namespace taco
495 
496 #endif // STORAGE_FILEMANAGER_H
void taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
Definition: FileManager_wrappable.cpp:13
void taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
Definition: FileManager_wrappable.cpp:34
void __wrap_taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
void __real_taco_fileman_readpage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, char *buf)
void __real_taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
void __wrap_taco_fileman_writepage_impl(::taco::FileManager *fileman, ::taco::PageNumber pid, const char *buf)
FileManager exposes a virtual file interface based on FSFile.
Definition: FileManager.h:174
void CloseAll()
Definition: FileManager.cpp:31
~FileManager()
Definition: FileManager.cpp:25
FileId FindFreeFileId()
Definition: FileManager.cpp:445
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
std::unique_ptr< File > CreateTmpFile()
Definition: FileManager.cpp:304
void AllocateL2FileDirectory(BufferId fdir1_bufid, size_t fdir1_off)
Definition: FileManager.cpp:511
std::string m_maindir
Definition: FileManager.h:293
void InitFreePageList(FreePageList *fpl, PageNumber last_pg)
Definition: FileManager.cpp:566
std::unique_ptr< File > Open(FileId fid)
Creates or opens a virtual file.
Definition: FileManager.cpp:262
std::vector< std::unique_ptr< FSFile > > m_mainfiles
Definition: FileManager.h:299
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
std::unique_ptr< File > OpenTmpFile(FileId fid)
Definition: FileManager.cpp:329
std::mutex m_fdir1_latch
Definition: FileManager.h:287
void ReadPage(PageNumber pid, char *buf)
Reading a page pid in the main data file into buf.
Definition: FileManager.h:229
std::mutex m_fsfile_extension_latch
Definition: FileManager.h:285
std::string m_tmpdir
Definition: FileManager.h:295
std::string GetMainDataFilePath(uint64_t DataFileId) const
Returns the path to the specified main data file.
Definition: FileManager.cpp:207
std::unique_ptr< File > OpenRegularFile(FileId fid)
Definition: FileManager.cpp:404
void LoadMeta()
Definition: FileManager.cpp:248
void Flush()
Flushes all buffered writes to the main data file to disk.
Definition: FileManager.cpp:709
std::string m_datadir
Definition: FileManager.h:291
std::mutex m_meta_latch
Definition: FileManager.h:289
void AddToFreePageList(FreePageList *fpl, BufferId pg_bufid, BufferId meta_bufid)
Definition: FileManager.cpp:684
FMMetaPageData * m_meta
Definition: FileManager.h:301
std::string m_waldir
Definition: FileManager.h:297
PageNumber GetNextFreePageNumber(FreePageList *fpl, BufferId meta_bufid)
Definition: FileManager.cpp:573
void FormatMeta()
Definition: FileManager.cpp:214
std::unique_ptr< File > CreateRegularFile()
Definition: FileManager.cpp:336
PageNumber AllocatePageGroup()
Definition: FileManager.cpp:532
FileManager()
Definition: FileManager.cpp:15
Represents an open virtual file managed by the FileManager.
Definition: FileManager.h:322
PageNumber AllocatePage()
Allocates a new page in the file and returns it page number.
Definition: FileManager.h:377
FileId m_fileid
Definition: FileManager.h:483
PageNumber GetLastPageNumber() const
Returns the last page's PID.
Definition: FileManager.cpp:1000
File()
Definition: FileManager.h:472
void WritePage(PageNumber pid, const char *buf)
Writes a page at the specified page number.
Definition: FileManager.cpp:773
void ReadPage(PageNumber pid, char *buf) const
Reads a page at the specified page number.
Definition: FileManager.cpp:745
void Close()
Closes the file.
Definition: FileManager.cpp:720
BufferId AllocatePage(LatchMode mode)
Allocates a new page in the file and returns a valid buffer ID where is pinned.
Definition: FileManager.h:389
void FreePage(ScopedBufferId &bufid)
Same as FreePage(BufferId) but prevents double free.
Definition: FileManager.h:409
void Flush()
Flushes bytes already written to the file.
Definition: FileManager.cpp:802
PageNumber m_meta_pid
Definition: FileManager.h:486
constexpr bool IsMainFile() const
Definition: FileManager.h:457
std::unique_ptr< FSFile > m_fsfile
Definition: FileManager.h:489
~File()
Destructor.
Definition: FileManager.cpp:715
constexpr bool IsOpen() const noexcept
Definition: FileManager.h:335
constexpr FileId GetFileId() const
Definition: FileManager.h:452
constexpr bool IsTmpFile() const
Definition: FileManager.h:462
void FreePage(BufferId bufid)
Returns a page that belongs to this file to its free page list.
Definition: FileManager.cpp:915
uint64_t AllocatePageImpl(bool need_latch, LatchMode mode)
The actual implementation of AllocatePage().
Definition: FileManager.cpp:820
constexpr bool IsWalFile() const
Definition: FileManager.h:467
PageNumber GetFirstPageNumber() const
Returns the first page's PID.
Definition: FileManager.cpp:983
PageHeaderData defines the header of every virtual file data page.
Definition: FileManager.h:23
constexpr bool IsMetaPage() const
Definition: FileManager.h:31
FileId m_fid
Definition: FileManager.h:87
static constexpr uint16_t FLAG_VFILE_PAGE
Definition: FileManager.h:92
uint16_t m_reserved
Definition: FileManager.h:86
PageNumber GetPrevPageNumber() const
Returns the previous page number.
Definition: FileManager.h:74
static constexpr uint16_t FLAG_META_PAGE
Definition: FileManager.h:91
uint16_t m_flags
Definition: FileManager.h:85
constexpr bool IsVFileDataPage() const
Definition: FileManager.h:53
constexpr bool IsVFilePage() const
Definition: FileManager.h:36
atomic< PageNumber > m_next_pid
Definition: FileManager.h:89
constexpr bool IsFMMetaPage() const
Definition: FileManager.h:41
constexpr FileId GetFileId() const
Definition: FileManager.h:79
constexpr bool IsVFileMetaPage() const
Definition: FileManager.h:47
atomic< PageNumber > m_prev_pid
Definition: FileManager.h:88
constexpr bool IsAllocated() const
Definition: FileManager.h:26
PageNumber GetNextPageNumber() const
Returns the next page number.
Definition: FileManager.h:64
T Release()
Releases the underlying resource without relinquishing it and returns it to the caller.
Definition: ResourceGuard.h:137
Definition: datum.h:28
constexpr int FileIdBits
Definition: FileManager.h:105
constexpr FileId MinRegularFileId
Definition: FileManager.h:106
LatchMode
Definition: Latch.h:11
constexpr FileId INVALID_FID
Definition: FileManager.h:108
uint64_t BufferId
Definition: tdb_base.h:214
uint32_t FileId
The file ID.
Definition: tdb_base.h:221
constexpr FileId WAL_FILEID_MASK
Definition: FileManager.h:103
uint32_t PageNumber
Definition: tdb_base.h:213
constexpr FileId NEW_REGULAR_FID
Definition: FileManager.h:111
constexpr FileId MaxRegularFileId
Definition: FileManager.h:107
constexpr FileId TMP_FILEID_MASK
Definition: FileManager.h:104
constexpr FileId NEW_TMP_FID
Definition: FileManager.h:112
constexpr PageNumber INVALID_PID
The invalid page number.
Definition: tdb_base.h:235
Definition: FileManager_private.h:99
Definition: FileManager_private.h:91