taco-db  0.1.0
FileManager_private.h
Go to the documentation of this file.
1 #ifndef STORAGE_FILEMANAGER_PRIVATE_H
2 #define STORAGE_FILEMANAGER_PRIVATE_H
3 
4 #include "FileManager.h"
5 
6 namespace taco {
7 
8 constexpr uint64_t DBFILE_MAGIC = 0xdefabc1221cbafedul;
10 
17 
19 constexpr PageNumber PageGroupSize = 64;
20 
21 // FormatMeta() assumes there are at least 3 pages in the first page group.
22 static_assert(PageGroupSize >= 3);
23 
25 constexpr size_t MaxFileSize = (size_t) 64 * 1024 * 1024 * 1024;
26 
29 
31 constexpr uint64_t MaxNumDataFiles =
32  ((((uint64_t) MaxPageNumber) + 1) + MaxNumPagesPerFile - 1) /
34 
35 // There're many reasons why we don't want too many physical files:
36 // 1. We don't want an excessive amount of files in a single directory.
37 // 2. We preallocate the main data file vector, and we don't want that to be
38 // huge.
39 static_assert(MaxNumDataFiles <= 4096);
40 
50  uint16_t m_flags;
51  uint16_t m_reserved;
52 };
53 static_assert(sizeof(MetaPageHeaderData) == 4);
54 
55 static_assert(FileIdBits <= 19, "we support at most 2^19 files at this time");
56 
57 constexpr FileId
59  return fid / 1023;
60 }
61 
62 constexpr FileId
64  return fid % 1023;
65 }
66 
67 constexpr uint64_t
69  return pid / MaxNumPagesPerFile;
70 }
71 
72 constexpr PageNumber
74  return pid % MaxNumPagesPerFile;
75 }
76 
77 constexpr PageNumber
78 DataFileIdAndPageIdGetPageNumber(uint64_t fsfileid, PageNumber fspid) {
79  return fsfileid * MaxNumPagesPerFile + fspid;
80 }
81 
88 #define DataFileNameLength 3
89 static_assert(MaxNumDataFiles <= 1 << (DataFileNameLength * 4));
90 
91 struct FreePageList {
92  atomic<PageNumber> m_next_fp_in_last_pg;
93  atomic<PageNumber> m_last_pg;
94 
95  // list head of the free page list
96  atomic<PageNumber> m_fp_list;
97 };
98 
101  uint64_t m_magic;
104 
112  atomic<FileId> m_last_free_fid;
113 };
114 
117  atomic<PageNumber> m_pid[1023];
118 };
119 static_assert(sizeof(FileDirectoryData) <= PAGE_SIZE);
120 
123 
129 
136  atomic<PageNumber> m_last_pid;
137 
140 };
141 
142 }
143 
144 #endif // STORAGE_FILEMANAGER_PRIVATE_H
#define DataFileNameLength
The length of the file name of main data files.
Definition: FileManager_private.h:88
PageHeaderData defines the header of every virtual file data page.
Definition: FileManager.h:23
Definition: datum.h:28
constexpr int FileIdBits
Definition: FileManager.h:105
constexpr PageNumber FM_META_PID
The FM meta page is always the first page in the file.
Definition: FileManager_private.h:16
constexpr uint64_t MaxNumDataFiles
Maximum number of data files.
Definition: FileManager_private.h:31
constexpr PageNumber PageNumberGetDataFilePageId(PageNumber pid)
Definition: FileManager_private.h:73
constexpr PageNumber DataFileIdAndPageIdGetPageNumber(uint64_t fsfileid, PageNumber fspid)
Definition: FileManager_private.h:78
uint32_t FileId
The file ID.
Definition: tdb_base.h:221
constexpr PageNumber MaxPageNumber
The maximum valid page number.
Definition: tdb_base.h:247
uint32_t PageNumber
Definition: tdb_base.h:213
constexpr FileId FileIdGetDir2Offset(FileId fid)
Definition: FileManager_private.h:63
constexpr PageNumber MaxNumPagesPerFile
Maximum number of pages in a single data file.
Definition: FileManager_private.h:28
constexpr PageNumber RESERVED_PID
An invalid page number reserved for file manager internal use.
Definition: tdb_base.h:242
constexpr PageNumber PENDING_CREATION_PID
Definition: FileManager_private.h:9
constexpr size_t MaxFileSize
Maximum size of a single data file.
Definition: FileManager_private.h:25
constexpr uint64_t DBFILE_MAGIC
Definition: FileManager_private.h:8
constexpr FileId FileIdGetDir1Offset(FileId fid)
Definition: FileManager_private.h:58
constexpr PageNumber PageGroupSize
Size of allocation in pages.
Definition: FileManager_private.h:19
constexpr PageNumber INVALID_PID
The invalid page number.
Definition: tdb_base.h:235
constexpr uint64_t PageNumberGetDataFileId(PageNumber pid)
Definition: FileManager_private.h:68
Definition: FileManager_private.h:99
MetaPageHeaderData m_ph
Definition: FileManager_private.h:100
atomic< FileId > m_last_free_fid
m_last_free_fid serves as a hint to locate the last allocated free file id.
Definition: FileManager_private.h:112
uint64_t m_magic
Definition: FileManager_private.h:101
FreePageList m_fpl
Definition: FileManager_private.h:103
PageNumber m_fdir1_pid
Definition: FileManager_private.h:102
Definition: FileManager_private.h:115
MetaPageHeaderData m_ph
Definition: FileManager_private.h:116
atomic< PageNumber > m_pid[1023]
Definition: FileManager_private.h:117
Definition: FileManager_private.h:91
atomic< PageNumber > m_next_fp_in_last_pg
Definition: FileManager_private.h:92
atomic< PageNumber > m_last_pg
Definition: FileManager_private.h:93
atomic< PageNumber > m_fp_list
Definition: FileManager_private.h:96
This is a truncated and private version of PageHeaderData.
Definition: FileManager_private.h:49
uint16_t m_flags
Definition: FileManager_private.h:50
uint16_t m_reserved
Definition: FileManager_private.h:51
Definition: FileManager_private.h:121
PageHeaderData m_ph
Definition: FileManager_private.h:122
PageNumber m_first_pid
The first page ID of this file.
Definition: FileManager_private.h:128
atomic< PageNumber > m_last_pid
The last page ID of this file.
Definition: FileManager_private.h:136
FreePageList m_fpl
The free page list of this file.
Definition: FileManager_private.h:139
constexpr const size_t PAGE_SIZE
Definition: tdb_base.h:159