@@ -40,32 +40,15 @@ namespace bustub {
40
40
*/
41
41
class DiskManagerMemory : public DiskManager {
42
42
public:
43
- explicit DiskManagerMemory (size_t pages );
43
+ explicit DiskManagerMemory (size_t capacity );
44
44
45
45
~DiskManagerMemory () override { delete[] memory_; }
46
46
47
- /* *
48
- * This function should increase the disk space, but since we have a fixed amount of memory we just check that the
49
- * pages are in bounds.
50
- */
51
- void IncreaseDiskSpace (size_t pages) override ;
52
-
53
- /* *
54
- * Write a page to the database file.
55
- * @param page_id id of the page
56
- * @param page_data raw page data
57
- */
58
47
void WritePage (page_id_t page_id, const char *page_data) override ;
59
48
60
- /* *
61
- * Read a page from the database file.
62
- * @param page_id id of the page
63
- * @param[out] page_data output buffer
64
- */
65
49
void ReadPage (page_id_t page_id, char *page_data) override ;
66
50
67
51
private:
68
- size_t pages_;
69
52
char *memory_;
70
53
};
71
54
@@ -75,133 +58,21 @@ class DiskManagerMemory : public DiskManager {
75
58
*/
76
59
class DiskManagerUnlimitedMemory : public DiskManager {
77
60
public:
78
- DiskManagerUnlimitedMemory () {
79
- std::scoped_lock l (mutex_);
80
- while (data_.size () < pages_ + 1 ) {
81
- data_.push_back (std::make_shared<ProtectedPage>());
82
- }
83
- std::fill (recent_access_.begin (), recent_access_.end (), -1 );
84
- }
85
-
86
- /* *
87
- * This function should increase the disk space, but since this is memory we just resize the vector.
88
- */
89
- void IncreaseDiskSpace (size_t pages) override {
90
- std::scoped_lock l (mutex_);
91
-
92
- if (pages < pages_) {
93
- return ;
94
- }
95
-
96
- while (data_.size () < pages + 1 ) {
97
- data_.push_back (std::make_shared<ProtectedPage>());
98
- }
99
-
100
- pages_ = pages;
101
- }
102
-
103
- /* *
104
- * Write a page to the database file.
105
- * @param page_id id of the page
106
- * @param page_data raw page data
107
- */
108
- void WritePage (page_id_t page_id, const char *page_data) override {
109
- ProcessLatency (page_id);
110
-
111
- std::unique_lock<std::mutex> l (mutex_);
112
- if (!thread_id_.has_value ()) {
113
- thread_id_ = std::this_thread::get_id ();
114
- }
115
- if (page_id >= static_cast <int >(data_.size ())) {
116
- data_.resize (page_id + 1 );
117
- }
118
- if (data_[page_id] == nullptr ) {
119
- data_[page_id] = std::make_shared<ProtectedPage>();
120
- }
121
- std::shared_ptr<ProtectedPage> ptr = data_[page_id];
122
- std::unique_lock<std::shared_mutex> l_page (ptr->second );
123
- l.unlock ();
124
-
125
- memcpy (ptr->first .data (), page_data, BUSTUB_PAGE_SIZE);
126
- num_writes_ += 1 ;
127
-
128
- PostProcessLatency (page_id);
129
- }
130
-
131
- /* *
132
- * Read a page from the database file.
133
- * @param page_id id of the page
134
- * @param[out] page_data output buffer
135
- */
136
- void ReadPage (page_id_t page_id, char *page_data) override {
137
- ProcessLatency (page_id);
138
-
139
- std::unique_lock<std::mutex> l (mutex_);
140
- if (!thread_id_.has_value ()) {
141
- thread_id_ = std::this_thread::get_id ();
142
- }
143
- if (page_id >= static_cast <int >(data_.size ()) || page_id < 0 ) {
144
- fmt::println (stderr, " page {} not in range" , page_id);
145
- std::terminate ();
146
- return ;
147
- }
148
- if (data_[page_id] == nullptr ) {
149
- fmt::println (stderr, " page {} not exist" , page_id, pages_);
150
- std::terminate ();
151
- return ;
152
- }
153
- std::shared_ptr<ProtectedPage> ptr = data_[page_id];
154
- std::shared_lock<std::shared_mutex> l_page (ptr->second );
155
- l.unlock ();
156
-
157
- memcpy (page_data, ptr->first .data (), BUSTUB_PAGE_SIZE);
158
-
159
- PostProcessLatency (page_id);
160
- }
161
-
162
- /* *
163
- * Delete a page from the database file. Reclaim the disk space.
164
- * Note: This is a no-op for now without a more complex data structure to
165
- * track deallocated pages.
166
- * @param page_id id of the page
167
- */
168
- void DeletePage (page_id_t page_id) override { num_deletes_ += 1 ; }
169
-
170
- void ProcessLatency (page_id_t page_id) {
171
- uint64_t sleep_micro_sec = 1000 ; // for random access, 1ms latency
172
- if (latency_simulator_enabled_) {
173
- std::unique_lock<std::mutex> lck (latency_processor_mutex_);
174
- for (auto &recent_page_id : recent_access_) {
175
- if ((recent_page_id & (~0x3 )) == (page_id & (~0x3 ))) {
176
- sleep_micro_sec = 100 ; // for access in the same "block", 0.1ms latency
177
- break ;
178
- }
179
- if (page_id >= recent_page_id && page_id <= recent_page_id + 3 ) {
180
- sleep_micro_sec = 100 ; // for sequential access, 0.1ms latency
181
- break ;
182
- }
183
- }
184
- lck.unlock ();
185
- std::this_thread::sleep_for (std::chrono::microseconds (sleep_micro_sec));
186
- }
187
- }
188
-
189
- void PostProcessLatency (page_id_t page_id) {
190
- if (latency_simulator_enabled_) {
191
- std::scoped_lock<std::mutex> lck (latency_processor_mutex_);
192
- recent_access_[access_ptr_] = page_id;
193
- access_ptr_ = (access_ptr_ + 1 ) % recent_access_.size ();
194
- }
195
- }
61
+ DiskManagerUnlimitedMemory ();
62
+
63
+ void WritePage (page_id_t page_id, const char *page_data) override ;
64
+
65
+ void ReadPage (page_id_t page_id, char *page_data) override ;
66
+
67
+ void DeletePage (page_id_t page_id) override ;
68
+
69
+ void ProcessLatency (page_id_t page_id);
70
+
71
+ void PostProcessLatency (page_id_t page_id);
196
72
197
73
void EnableLatencySimulator (bool enabled) { latency_simulator_enabled_ = enabled; }
198
74
199
- auto GetLastReadThreadAndClear () -> std::optional<std::thread::id> {
200
- std::unique_lock<std::mutex> lck (mutex_);
201
- auto t = thread_id_;
202
- thread_id_ = std::nullopt;
203
- return t;
204
- }
75
+ auto GetLastReadThreadAndClear () -> std::optional<std::thread::id>;
205
76
206
77
private:
207
78
bool latency_simulator_enabled_{false };
@@ -216,8 +87,6 @@ class DiskManagerUnlimitedMemory : public DiskManager {
216
87
std::mutex mutex_;
217
88
std::optional<std::thread::id> thread_id_;
218
89
std::vector<std::shared_ptr<ProtectedPage>> data_;
219
-
220
- size_t pages_{DEFAULT_DB_IO_SIZE};
221
90
};
222
91
223
92
} // namespace bustub
0 commit comments