uint32_t PagePoolOffsetAndEpochChunk::get_safe_offset_count(const Epoch& threshold) const { ASSERT_ND(is_sorted()); OffsetAndEpoch dummy; dummy.safe_epoch_ = threshold.value(); struct CompareEpoch { bool operator() (const OffsetAndEpoch& left, const OffsetAndEpoch& right) { return Epoch(left.safe_epoch_) < Epoch(right.safe_epoch_); } }; const OffsetAndEpoch* result = std::lower_bound(chunk_, chunk_ + size_, dummy, CompareEpoch()); ASSERT_ND(result); ASSERT_ND(result - chunk_ <= size_); return result - chunk_; }
ErrorStack SavepointManagerPimpl::take_savepoint(Epoch new_global_durable_epoch) { while (get_saved_durable_epoch() < new_global_durable_epoch) { if (get_requested_durable_epoch() < new_global_durable_epoch) { if (get_requested_durable_epoch() < new_global_durable_epoch) { control_block_->requested_durable_epoch_ = new_global_durable_epoch.value(); control_block_->save_wakeup_.signal(); } } { uint64_t demand = control_block_->save_done_event_.acquire_ticket(); if (get_saved_durable_epoch() >= new_global_durable_epoch) { break; } control_block_->save_done_event_.wait(demand); } } return kRetOk; }
ErrorStack SavepointManagerPimpl::take_savepoint_after_snapshot( snapshot::SnapshotId new_snapshot_id, Epoch new_snapshot_epoch) { while (get_latest_snapshot_id() != new_snapshot_id) { { control_block_->new_snapshot_id_ = new_snapshot_id; control_block_->new_snapshot_epoch_ = new_snapshot_epoch.value(); control_block_->save_wakeup_.signal(); } { uint64_t demand = control_block_->save_done_event_.acquire_ticket(); if (get_latest_snapshot_id() != new_snapshot_id) { control_block_->save_done_event_.wait(demand); } } } ASSERT_ND(get_latest_snapshot_id() == new_snapshot_id); ASSERT_ND(get_latest_snapshot_epoch() == new_snapshot_epoch); return kRetOk; }