13 #include <unordered_map> 17 #include <condition_variable> 42 states =
new std::atomic<State>[size];
43 for (
size_t i = 0; i < size; i++) {
79 for (
unsigned i = 0; i <
_size; i++) {
88 for (
unsigned i = 0; i <
_size; i++) {
116 template<
typename RestoreFunctor>
121 bool virgin_pages,
bool on_demand =
true,
bool start_locked =
false)
122 : _segment_size{segSize},
125 _virgin_pages{virgin_pages},
126 _on_demand(on_demand),
127 _start_locked(start_locked),
141 using namespace std::chrono_literals;
143 auto segment = pid / _segment_size;
144 if (segment >= _bitmap->get_size() || _bitmap->is_restored(segment)) {
148 std::unique_lock<std::mutex> lck{_mutex};
151 if (_bitmap->is_restored(segment)) {
157 auto ticket = getWaitingTicket(segment);
159 if (_on_demand && _bitmap->attempt_restore(segment)) {
161 doRestore(segment, segment + 1, ticket);
163 constexpr
auto sleep_time = 10ms;
164 auto pred = [
this, segment] {
165 return _bitmap->is_restored(segment);
168 ticket->wait_for(lck, sleep_time, pred);
178 if (_on_demand && !_waiting_table.empty()) {
182 std::unique_lock<std::mutex> lck{_mutex};
183 auto segment_begin = _bitmap->get_first_unrestored();
185 if (segment_begin == _bitmap->get_size()) {
192 size_t restore_size = 0;
193 unsigned segment_end = segment_begin;
195 if (!_bitmap->is_unrestored(segment_end)) {
199 getWaitingTicket(segment_end);
200 if (_bitmap->attempt_restore(segment_end)) {
202 restore_size += _segment_size;
207 if (restore_size > MaxRestorePages - _segment_size) {
212 if (segment_end > segment_begin) {
215 ERROUT(<<
"background restore: " << segment_begin <<
" - " <<
217 doRestore(segment_begin, segment_end,
nullptr);
225 auto segment = pid / _segment_size;
226 return segment >= _bitmap->get_size() || _bitmap->is_restored(segment);
230 return _bitmap->get_first_restoring() >= _bitmap->get_size();
240 using Ticket = std::shared_ptr<std::condition_variable>;
264 static constexpr
size_t MaxRestorePages = 1024;
268 auto it = _waiting_table.find(segment);
269 if (it == _waiting_table.end()) {
270 auto ticket = make_shared<std::condition_variable>();
271 _waiting_table[segment] = ticket;
280 _restoreFunctor(segment_begin, segment_end, _segment_size,
281 _virgin_pages, _begin_lsn, _end_lsn);
283 for (
auto s = segment_begin; s < segment_end; s++) {
289 ticket->notify_all();
292 std::unique_lock<std::mutex> lck{_mutex};
293 for (
auto s = segment_begin; s < segment_end; s++) {
294 bool erased = _waiting_table.erase(s);
301 template<
class LogScan,
class PageIter>
302 static void replay(LogScan logs, PageIter& pagesBegin, PageIter pagesEnd);
306 static void bf_restore(
unsigned segment_begin,
unsigned segment_end,
307 size_t segment_size,
bool virgin_pages,
lsn_t begin_lsn,
lsn_t end_lsn);
311 template<
class Coordinator,
class OnDoneCallback>
316 _notify_done(callback) {}
319 using namespace std::chrono_literals;
321 bool no_segments_left =
false;
322 bool restored_last =
false;
325 constexpr
auto sleep_time = 100ms;
326 std::this_thread::sleep_for(sleep_time);
330 if (!restored_last) {
333 restored_last = _coord->tryBackgroundRestore(no_segments_left);
335 if (no_segments_left || should_exit()) {
340 while (!should_exit() && no_segments_left && !_coord->allDone()) {
344 if (_coord->allDone()) {
358 #endif // __RESTORE_H Definition: restore.h:305
const size_t _segment_size
Definition: restore.h:242
void start()
Definition: restore.h:233
Bitmap data structure that controls the progress of restore.
Definition: restore.h:31
Definition: worker_thread.h:12
#define w_assert1(x)
Level 1 should not add significant extra time.
Definition: w_base.h:198
std::atomic< State > * states
Definition: restore.h:109
OnDoneCallback _notify_done
Definition: restore.h:355
bool attempt_restore(unsigned i)
Definition: restore.h:68
std::unordered_map< unsigned, Ticket > _waiting_table
Definition: restore.h:246
Definition: restore.h:312
lsn_t _begin_lsn
Definition: restore.h:259
bool is_restoring(unsigned i) const
Definition: restore.h:60
const bool _on_demand
Definition: restore.h:254
bool tryBackgroundRestore(bool &done)
Definition: restore.h:173
RestoreFunctor _restoreFunctor
Definition: restore.h:250
Coordinator that synchronizes multi-threaded decentralized restore.
Definition: restore.h:117
Start-up parameters for the storage engine. See OPTIONS.
Definition: sm_options.h:24
bool is_unrestored(unsigned i) const
Definition: restore.h:56
static const lsn_t null
Definition: lsn.h:371
lsn_t _end_lsn
Definition: restore.h:261
std::unique_ptr< RestoreBitmap > _bitmap
Definition: restore.h:248
Encapsulates all file and I/O operations on the log archive.
Definition: logarchive_index.h:94
bool is_restored(unsigned i) const
Definition: restore.h:64
void doRestore(unsigned segment_begin, unsigned segment_end, Ticket ticket)
Definition: restore.h:279
std::mutex _mutex
Definition: restore.h:244
BackgroundRestorer(std::shared_ptr< Coordinator > coord, OnDoneCallback callback)
Definition: restore.h:314
void mark_restored(unsigned i)
Definition: restore.h:73
uint32_t PageID
Definition: basics.h:45
bool allDone() const
Definition: restore.h:229
#define w_assert0(x)
Default assert/debug level is 0.
Definition: w_base.h:175
Log Sequence Number. See Log Sequence Numbers (LSN).
Definition: lsn.h:243
void set_lsns(lsn_t begin, lsn_t end)
Definition: restore.h:135
void fetch(PageID pid)
Definition: restore.h:140
Ticket getWaitingTicket(unsigned segment)
Definition: restore.h:266
const bool _start_locked
Definition: restore.h:257
#define ERROUT(a)
Definition: w_debug.h:175
size_t get_size()
Definition: restore.h:52
const size_t _size
Definition: restore.h:111
std::shared_ptr< Coordinator > _coord
Definition: restore.h:353
State
Definition: restore.h:34
unsigned get_first_restoring() const
Definition: restore.h:87
Definition: restore.h:300
const bool _virgin_pages
Definition: restore.h:252
RestoreCoordinator(size_t segSize, size_t segCount, RestoreFunctor f, bool virgin_pages, bool on_demand=true, bool start_locked=false)
Definition: restore.h:120
std::shared_ptr< std::condition_variable > Ticket
Definition: restore.h:240
virtual void do_work()
Definition: restore.h:318
~RestoreBitmap()
Definition: restore.h:48
RestoreBitmap(size_t size)
Definition: restore.h:40
bool isPidRestored(PageID pid) const
Definition: restore.h:224
unsigned get_first_unrestored() const
Definition: restore.h:78