17#include <unordered_map>
20 namespace replacement_detail {
25 template <
class Family>
struct clean_family<Family, std::void_t<typename Family::storage_type::clean_storage_type>> {
26 using type =
typename Family::template rebind_storage<typename Family::storage_type::clean_storage_type>;
27 static constexpr bool enabled = !std::is_same_v<Family, type>;
32 template <
class A = wrapping_fingerpr
int_algebra>
40 void validate(std::uint64_t admissions)
const {
44 throw std::invalid_argument(
"invalid replacement generation mass");
49 throw std::invalid_argument(
"inactive replacement generation passed its trigger");
55 if (
clean_base < 64 || mutations < trigger || mutations - trigger > extra)
56 throw std::invalid_argument(
"invalid active replacement generation");
59 std::vector<std::byte>
encode() const requires std::same_as<typename A::element, std::uint64_t> {
61 std::vector<std::byte> result(40 + inner.size());
62 constexpr std::array<unsigned char, 8> magic{
'E',
'V',
'R',
'T',
'.',
'R',
'B',0};
63 for (
unsigned i = 0; i != 8; ++i) result[i] = std::byte(magic[i]);
65 for (
unsigned n = 0; n != fields.size(); ++n)
66 for (
unsigned i = 0; i != 8; ++i) result[8 + n * 8 + i] = std::byte(fields[n] >> (i << 3));
67 std::copy(inner.begin(), inner.end(), result.begin() + 40);
71 requires std::same_as<typename A::element, std::uint64_t> {
72 constexpr std::array<unsigned char, 8> magic{
'E',
'V',
'R',
'T',
'.',
'R',
'B',0};
73 if (data.size() <= 56)
throw std::invalid_argument(
"truncated replacement metadata");
74 for (
unsigned i = 0; i != 8; ++i)
75 if (data[i] != std::byte(magic[i]))
throw std::invalid_argument(
"replacement metadata signature mismatch");
76 std::array<std::uint64_t, 4> fields{};
77 for (
unsigned n = 0; n != fields.size(); ++n)
78 for (
unsigned i = 0; i != 8; ++i)
79 fields[n] |= std::uint64_t(std::to_integer<unsigned char>(data[8 + n * 8 + i])) << (i << 3);
80 if (fields[0] != 1 || fields[3] > 1)
throw std::invalid_argument(
"replacement metadata version or flags");
81 return {
base_type::decode(data.subspan(40)), fields[1], fields[2], fields[3] != 0};
86 template <
class P = storage_policy<>,
class A = wrapping_fingerpr
int_algebra,
87 class Family = redundant_runtime_family<P>>
127 template <
class P = storage_policy<>,
class A = wrapping_fingerpr
int_algebra,
128 std::u
int64_t DepthLimit = 256,
class Family = redundant_runtime_family<P>>
132 static_assert(!std::is_void_v<sort_type>,
"replacement rebuild needs one occupied sort");
137 static_assert(typed_detail::replacement<sort_type> && std::is_same_v<state_type, arrow_type>,
138 "replacement rebuild requires replacement state/arrow types");
142 static_assert(
charged_service,
"replacement rebuild requires charged redundant service");
149 static_assert(DepthLimit >= 3);
157 if (source.runtime().admissions() != source.metadata().live_count)
158 throw std::invalid_argument(
"replacement rebuild restore needs a clean admission mass");
159 auto b = source.metadata().live_count;
165 template <
class Storage>
169 if (source.runtime().admissions() != source.metadata().live_count)
170 throw std::invalid_argument(
"replacement rebuild restore needs a clean admission mass");
171 auto b = source.metadata().live_count;
174 template <
class Storage>
207 throw std::invalid_argument(
"replacement rebase requires a settled equivalent snapshot");
212 }
catch (...) {
poison();
throw; }
228 template <
class S = sort_type>
requires std::same_as<S, sort_type>
230 return engine_type::template put<sort_type>(key, value);
232 template <
class S = sort_type>
requires std::same_as<S, sort_type>
235 template <
class S = sort_type>
requires std::same_as<S, sort_type>
237 return engine_type::template change<S>(key, arrow);
242 auto h = std::min<std::uint64_t>(64, DepthLimit - 3);
243 auto g =
action_bound(h), c = runtime_type::local_charge_bound;
244 constexpr std::uint64_t runs = 128,
scan = 32, setup = runs * (
scan + 8) + 32;
249 auto query =
mul(
mul(64,
add(DepthLimit, 1)),
add(
add(P::group_size, P::codec_block_size), 16));
250 auto extra =
add(
add(std::max(large, small), query), runs * 8 + 32);
265 if (!
admission_ready())
throw std::logic_error(
"replacement foreground needs recovery service");
267 throw std::invalid_argument(
"rebuild contribution uses another schema");
269 (input.base() && input.base()->runtime().query_root().head()->depth() > DepthLimit))
270 throw std::length_error(
"replacement query exceeds depth allowance");
271 if (input.records().empty())
return published_;
276 if constexpr (std::is_same_v<sort_type, unsorted<std::optional<std::string>>> &&
277 requires(
runtime_type & runtime, std::span<profile_record const> records) {
278 runtime.try_initialize_sorted(records, std::uint64_t{}, DepthLimit);
280 auto count = input.records().size();
303 std::vector<mutation> entries; entries.reserve(input.records().size());
304 foreground_->visit_changes(input, [&]<
class S>(std::type_identity<S>,
auto const & key,
305 auto && before,
auto && after,
auto const & record) {
306 static_assert(std::is_same_v<S, sort_type>);
307 entries.push_back({key, std::move(before), std::move(after), typed_detail::value<P, S>(record.value.view()),
308 0, record.retained_limit_bits});
312 for (
auto & entry : entries) {
315 if (!semantics::present(entry.key, entry.after) &&
work_.
generations != generation)
316 entry.retained_limit_bits = 0;
317 apply(std::move(entry));
321 }
catch (...) {
poison();
throw; }
323 std::optional<world_type>
advance(std::uint64_t budget) {
330 }
catch (...) {
poison();
throw; }
344 auto result = engine_type::template change<sort_type>(entry.
key, entry.
arrow);
350 std::unique_ptr<scan_type>
scan;
373 template <
class Storage>
382 throw std::length_error(
"restored replacement query exceeds depth allowance");
387 void active()
const {
if (!
foreground_)
throw std::logic_error(
"moved-from replacement rebuild engine"); }
392 static std::uint64_t
ceil(std::uint64_t a, std::uint64_t b) {
return a / b + (a % b != 0); }
393 static void require(
bool value,
char const * message) {
if (!value)
throw std::logic_error(message); }
395 if constexpr (
requires { semantics::clean(key, state); })
return semantics::clean(key, state);
397 static_assert(std::is_same_v<sort_type, unsorted<std::optional<std::string>>>,
398 "custom replacement sort must define clean(key,state)");
409 require(
foreground_->admission_ready(),
"replacement foreground exhausted its admission service");
415 bool extends_clean =
false;
416 if constexpr (std::is_same_v<sort_type, unsorted<std::optional<std::string>>>)
419 require(
job_->admitted <
job_->horizon,
"rebuild deadline exhausted before admission");
420 job_->queue.push_back(entry);
444 auto live =
foreground_->snapshot().metadata().live_count;
453 auto depth =
add(height, 3), c = runtime_type::local_charge_bound;
455 auto query =
mul(
mul(64,
add(depth, 1)),
add(
add(P::group_size, P::codec_block_size), 16));
456 auto service =
mul(
mul(8, c),
add(height, 2));
461 auto freeze =
add(
mul(source.runtime().runs().size(), 8), 32);
465 auto next = std::make_unique<rebuild>(std::move(source));
466 next->live = next->frozen.metadata().live_count;
467 next->horizon = small ? 1 : next->live / 8;
468 require(next->horizon,
"empty rebuilding horizon");
470 auto limit =
add(next->live, small ? 0 : next->horizon);
471 auto height = std::bit_width(limit);
auto depth =
add(height, 3);
472 if (depth > DepthLimit)
throw std::length_error(
"rebuild candidate exceeds supported depth");
473 auto c = runtime_type::local_charge_bound;
475 std::uint64_t physical = 0;
476 auto runs = next->frozen.runtime().runs();
477 for (
auto const & run : runs) physical =
add(physical, run->native->size());
478 next->source_records = physical;
481 next->scan_price =
add(
mul(2, std::bit_width(runs.size())), 16);
482 next->setup =
add(
mul(runs.size(),
add(next->scan_price, 8)), 32);
483 auto r =
add(next->setup,
mul(
add(
add(physical, next->live), 1), next->scan_price));
484 r =
add(r,
mul(next->live, next->action));
488 r =
add(r,
mul(limit, next->action));
489 r =
add(r,
mul(next->horizon, next->action));
490 next->bound =
add(r, next->action);
492 next->quantum =
ceil(next->bound, next->horizon);
494 job_ = std::move(next);
501 auto const & j = *
job_;
502 if (j.tiny)
return j.bound;
503 if (!j.candidate)
return j.setup;
504 if (j.building && !j.scan->has_row() && !j.scan->done())
return j.scan_price;
508 auto before =
job_->candidate->work().charged;
527 using source_pair =
typename Source::query_type::pair_type;
528 using source_node = std::remove_const_t<typename source_pair::element_type>;
529 using source_object =
typename Source::object_pointer::element_type;
530 using target_node =
typename Family::node_type;
531 using target_pair =
typename target_node::pair_type;
532 using target_object =
typename Family::snapshot_type::object_pointer;
533 static_assert(std::is_same_v<typename source_node::native_type, typename Family::native_type>);
534 auto const & old = source.frontier();
536 "tiny conversion exceeds its bounded settled frontier");
537 std::uint64_t charged = 0;
538 auto charge = [&](std::uint64_t amount) {
539 charged =
add(charged, amount);
544 charge(
add(32,
mul(old.levels.size(), 16)));
545 std::unordered_map<source_node const *, target_pair> pairs;
546 auto copy_pair = [&](
auto && self, source_pair
const & value) -> target_pair {
547 if (!value)
return {};
548 if (
auto found = pairs.find(value.get()); found != pairs.end())
return found->second;
549 auto main = self(self, value->main_target());
550 require(pairs.size() < 8 * (std::bit_width(
small_limit) + 1),
"too many tiny conversion pairs");
551 auto secondary = value->secondary_target();
552 auto a =
main ?
ceil(
main->virtual_size(), P::group_size) : 0;
554 auto n =
add(value->native_owner()->size(),
add(a, b));
556 charge(
add(
add(16,
mul(n, P::group_size + 6)),
add(
ceil(a, P::codec_block_size),
ceil(b, P::codec_block_size))));
558 while (!builder.
done()) builder.
step(1);
559 auto result = target_node::from_built(builder.
finish());
561 pairs.emplace(value.get(), result);
return result;
563 std::unordered_map<source_object const *, target_object> objects;
564 auto copy_object = [&](
auto && self,
typename Source::object_pointer
const & value) -> target_object {
565 if (!value)
return {};
566 if (
auto found = objects.find(value.get()); found != objects.end())
return found->second;
567 typename Family::routes_type next{self(self, value->next.main), self(self, value->next.secondary)};
568 require(objects.size() < 3 * old.levels.size(),
"too many tiny conversion objects");
570 auto result = std::make_shared<typename Family::object_type const>(
typename Family::object_type{
571 value->identity, value->first, value->last, value->level, value->native,
572 copy_pair(copy_pair, value->pair), std::move(next)});
573 objects.emplace(value.get(), result);
return result;
575 auto copy_route = [&](
auto const & route) {
576 return typename Family::routes_type{copy_object(copy_object, route.main), copy_object(copy_object, route.secondary)};
578 typename Family::frontier_type out;
579 out.admissions = old.admissions; out.next_identity = old.next_identity; out.service_due = old.service_due;
580 out.levels.resize(old.levels.size());
581 for (std::size_t i = 0; i != old.levels.size(); ++i) {
582 auto const & before = old.levels[i];
auto & after = out.levels[i];
583 require(!before.job,
"tiny conversion requires completed jobs");
585 for (std::size_t j = 0; j != before.slots.size(); ++j) {
587 after.slots[j] = {slot.state, copy_object(copy_object, slot.object), copy_route(slot.route),
588 copy_pair(copy_pair, slot.carrier), slot.ever_visible};
590 require(
active < 2,
"tiny conversion requires a settled level");
591 after.last_destination = before.last_destination; after.last_destination_visible = before.last_destination_visible;
593 out.root = copy_route(old.root);
594 auto head = copy_pair(copy_pair, source.query_root().head());
595 auto result = Family::snapshot_type::restore(std::move(out), std::move(head));
598 void tiny_rebuild()
requires replacement_detail::clean_family<Family>::enabled {
603 j.queue.empty() && !j.admitted,
"tiny rebuild escaped its bounded eager path");
604 clean_engine candidate(j.frozen.metadata().schema_id);
606 auto execute = [&](
auto && operation) {
607 auto before = candidate.work().charged;
613 while (!rows.
done()) {
617 auto arrow =
clean(row.key, row.value);
618 require(semantics::apply(row.key, semantics::initial(row.key), arrow) == row.value,
"invalid clean replacement arrow");
619 while (!candidate.admission_ready()) execute([&] { candidate.advance(j.action); });
620 execute([&] { candidate.contribute(clean_engine::template change<sort_type>(row.key, arrow)); });
622 require(j.rows <= j.live,
"tiny scan exceeds frozen live count");
624 auto scanned = candidate.snapshot();
626 scanned.runtime().admissions() == j.live && scanned.metadata() == j.frozen.metadata(),
627 "tiny rebuild differs from frozen source");
628 while (candidate.pending()) execute([&] { candidate.advance(j.action); });
629 auto clean = candidate.snapshot();
631 auto state = typed_world_type::restore(std::move(runtime),
clean.metadata(), j.frozen.metadata().schema_id);
632 require(state.metadata() ==
foreground_->snapshot().metadata() && state.runtime().admissions() == j.live,
633 "tiny handoff differs from foreground");
642 auto cost =
price();
if (
job_->credit < cost)
break;
644 require(
job_->committed <= limit && cost <= limit - job_->committed,
"rebuild exceeded its reserved work bound");
651 auto seed = std::make_unique<engine_type>(j.frozen.metadata().schema_id);
653 if constexpr (
requires {
foreground_->storage(); }) {
656 j.candidate = std::make_unique<engine_type>(
659 }
else j.candidate = std::move(seed);
660 j.scan = std::make_unique<scan_type>(j.frozen);
661 }
else if (j.building) {
662 if (j.scan->has_row()) {
663 if (!j.candidate->admission_ready())
candidate_work([&]{ j.candidate->advance(j.action); });
665 auto row = j.scan->take_row();
666 auto arrow =
clean(row.key, row.value);
667 require(semantics::apply(row.key, semantics::initial(row.key), arrow) == row.value,
"invalid clean replacement arrow");
668 auto input = engine_type::template change<sort_type>(row.key, arrow);
669 candidate_work([&]{ j.candidate->template contribute_validated<sort_type>(
670 input.records_[0], row.key, semantics::initial(row.key), row.value); });
675 require(j.scan->consumed() == j.source_records && j.rows == j.live &&
mass(j.candidate->snapshot()) == j.live &&
676 j.candidate->snapshot().metadata() == j.frozen.metadata(),
"clean rebuild differs from frozen source");
677 j.scan.reset(); j.building =
false;
679 }
else if (!j.queue.empty()) {
680 if (!j.candidate->admission_ready())
candidate_work([&]{ j.candidate->advance(j.action); });
682 auto const & entry = j.queue.front();
683 require(entry.ordinal ==
add(
add(j.frozen_ordinal, j.replayed), 1),
"rebuild replay order changed");
685 input.records_[0].retained_limit_bits = 0;
686 candidate_work([&]{ j.candidate->template contribute_validated<sort_type>(
687 input.records_[0], entry.key, entry.before, entry.after); });
690 }
else if (j.candidate->pending())
candidate_work([&]{ j.candidate->advance(j.action); });
692 auto state = j.candidate->snapshot();
693 require(j.replayed == j.admitted && state.runtime().admissions() ==
add(j.live, j.replayed) &&
694 state.metadata() ==
foreground_->snapshot().metadata(),
"rebuild handoff differs from foreground");
std::uint64_t add(std::uint64_t a, std::uint64_t b)
Definition profile.h:39
std::uint64_t multiply(std::uint64_t a, std::uint64_t b)
Definition profile.h:44
typename sort_codec< S >::value_codec::value_type arrow_t
Definition typed_world.h:53
typename sort_codec< S >::key_codec::value_type key_t
Definition typed_world.h:52
typename default_sort< typename registry_detail::info< typename P::registry_type >::leaves >::type default_sort_t
Definition typed_world.h:51
typename sort_semantics< S >::state_type state_t
Definition typed_world.h:54
Definition active_engine.h:18
Executes redundant COLA slots with charged jobs and immutable frontiers.
Definition cola_index.h:496
auto finish()
Definition cola_index.h:581
bool done() const noexcept
Definition cola_index.h:520
std::uint64_t step(std::uint64_t budget)
Definition cola_index.h:529
typename Family::template rebind_storage< typename Family::storage_type::clean_storage_type > type
Definition replacement_rebuild.h:26
Definition replacement_rebuild.h:21
static constexpr bool enabled
Definition replacement_rebuild.h:23
Family type
Definition replacement_rebuild.h:22
Definition replacement_rebuild.h:336
std::uint64_t ordinal
Definition replacement_rebuild.h:340
arrow_type arrow
Definition replacement_rebuild.h:339
std::optional< std::uint64_t > retained_limit_bits
Definition replacement_rebuild.h:341
state_type after
Definition replacement_rebuild.h:338
state_type before
Definition replacement_rebuild.h:338
key_type key
Definition replacement_rebuild.h:337
Definition replacement_rebuild.h:348
std::uint64_t frozen_ordinal
Definition replacement_rebuild.h:353
std::uint64_t source_records
Definition replacement_rebuild.h:354
std::uint64_t action
Definition replacement_rebuild.h:355
std::unique_ptr< scan_type > scan
Definition replacement_rebuild.h:350
std::uint64_t rows
Definition replacement_rebuild.h:354
std::unique_ptr< engine_type > candidate
Definition replacement_rebuild.h:351
std::uint64_t horizon
Definition replacement_rebuild.h:353
std::uint64_t live
Definition replacement_rebuild.h:353
typed_world_type frozen
Definition replacement_rebuild.h:349
std::uint64_t replayed
Definition replacement_rebuild.h:354
std::uint64_t committed
Definition replacement_rebuild.h:356
std::uint64_t admitted
Definition replacement_rebuild.h:354
std::uint64_t credit
Definition replacement_rebuild.h:356
std::uint64_t bound
Definition replacement_rebuild.h:355
std::uint64_t quantum
Definition replacement_rebuild.h:355
bool tiny
Definition replacement_rebuild.h:358
std::uint64_t scan_price
Definition replacement_rebuild.h:355
bool building
Definition replacement_rebuild.h:357
std::deque< mutation > queue
Definition replacement_rebuild.h:352
rebuild(typed_world_type value)
Definition replacement_rebuild.h:359
std::uint64_t setup
Definition replacement_rebuild.h:355
Definition replacement_rebuild.h:129
static constexpr std::uint64_t tiny_record_limit
Definition replacement_rebuild.h:151
static std::uint64_t add(std::uint64_t a, std::uint64_t b)
Definition replacement_rebuild.h:390
void start(bool small)
Definition replacement_rebuild.h:459
static arrow_type clean(key_type const &key, state_type const &state)
Definition replacement_rebuild.h:394
static contribution_type put(key_type const &key, state_type const &value)
Definition replacement_rebuild.h:229
static std::uint64_t action_bound(std::uint64_t height)
Definition replacement_rebuild.h:452
std::uint64_t price() const
Definition replacement_rebuild.h:500
auto storage() const
Definition replacement_rebuild.h:197
world_type contribute(contribution_type input)
Definition replacement_rebuild.h:263
void candidate_work(auto &&operation)
Definition replacement_rebuild.h:507
static replacement_rebuild_engine from_snapshot(world_type source)
Definition replacement_rebuild.h:162
static void require(bool value, char const *message)
Definition replacement_rebuild.h:393
static replacement_rebuild_engine from_clean(typed_world_type source)
Definition replacement_rebuild.h:156
void writable() const
Definition replacement_rebuild.h:388
replacement_rebuild_work work_
Definition replacement_rebuild.h:365
void foreground_advance(std::uint64_t budget)
Definition replacement_rebuild.h:402
typed_detail::arrow_t< sort_type > arrow_type
Definition replacement_rebuild.h:136
static contribution_type command(mutation const &entry)
Definition replacement_rebuild.h:343
typed_detail::default_sort_t< P > sort_type
Definition replacement_rebuild.h:131
static std::uint64_t mul(std::uint64_t a, std::uint64_t b)
Definition replacement_rebuild.h:391
replacement_rebuild_engine(world_type value, Storage storage)
Definition replacement_rebuild.h:374
typed_detail::key_t< sort_type > key_type
Definition replacement_rebuild.h:134
static contribution_type change(key_type const &key, arrow_type const &arrow)
Definition replacement_rebuild.h:236
void active() const
Definition replacement_rebuild.h:387
std::unique_ptr< engine_type > foreground_
Definition replacement_rebuild.h:361
static constexpr std::uint64_t small_limit
Definition replacement_rebuild.h:150
typename engine_type::world_type typed_world_type
Definition replacement_rebuild.h:145
static auto batch()
Definition replacement_rebuild.h:227
auto convert_tiny(Source const &source)
Definition replacement_rebuild.h:526
bool pending() const noexcept
Definition replacement_rebuild.h:214
replacement_rebuild_work work() const noexcept
Definition replacement_rebuild.h:216
replacement_rebuild_engine(replacement_rebuild_engine const &)=delete
world_type published_
Definition replacement_rebuild.h:362
replacement_rebuild_status status() const
Definition replacement_rebuild.h:217
replacement_rebuild_engine & operator=(replacement_rebuild_engine const &)=delete
typed_detail::state_t< sort_type > state_type
Definition replacement_rebuild.h:135
static std::uint64_t reservation_work(std::uint64_t records)
Definition replacement_rebuild.h:241
std::uint64_t mutations_
Definition replacement_rebuild.h:364
replacement_rebuild_engine(world_type value)
Definition replacement_rebuild.h:368
bool admission_ready() const noexcept
Definition replacement_rebuild.h:215
void initialize_restore()
Definition replacement_rebuild.h:380
bool recovering_
Definition replacement_rebuild.h:366
typename engine_type::contribution_type contribution_type
Definition replacement_rebuild.h:147
void tiny_rebuild()
Definition replacement_rebuild.h:598
P policy_type
Definition replacement_rebuild.h:130
Family runtime_family
Definition replacement_rebuild.h:143
typename engine_type::runtime_type runtime_type
Definition replacement_rebuild.h:140
void grant(std::uint64_t amount)
Definition replacement_rebuild.h:496
std::unique_ptr< rebuild > job_
Definition replacement_rebuild.h:363
bool failed() const noexcept
Definition replacement_rebuild.h:186
void poison() noexcept
Definition replacement_rebuild.h:192
std::uint64_t base_
Definition replacement_rebuild.h:364
static replacement_rebuild_engine from_clean(typed_world_type source, Storage storage)
Definition replacement_rebuild.h:166
static std::uint64_t mass(typed_world_type const &state)
Definition replacement_rebuild.h:389
world_type publication() const
Definition replacement_rebuild.h:386
std::optional< world_type > advance(std::uint64_t budget)
Definition replacement_rebuild.h:323
replacement_rebuild_engine()
Definition replacement_rebuild.h:153
static std::uint64_t ceil(std::uint64_t a, std::uint64_t b)
Definition replacement_rebuild.h:392
static replacement_rebuild_engine from_snapshot(world_type source, Storage storage)
Definition replacement_rebuild.h:175
replacement_rebuild_engine(std::string schema)
Definition replacement_rebuild.h:154
static contribution_type erase(key_type const &key)
Definition replacement_rebuild.h:233
static session_reservation reservation(contribution_type const &input)
Definition replacement_rebuild.h:254
void apply(mutation entry)
Definition replacement_rebuild.h:408
static std::uint64_t tiny_conversion_bound()
Definition replacement_rebuild.h:522
world_type snapshot() const
Definition replacement_rebuild.h:185
bool failed_
Definition replacement_rebuild.h:366
replacement_rebuild_engine(replacement_rebuild_engine &&) noexcept=default
static constexpr bool charged_service
Definition replacement_rebuild.h:141
void rebase(world_type state)
Definition replacement_rebuild.h:203
replacement_world< P, A, Family > world_type
Definition replacement_rebuild.h:146
Definition replacement_rebuild.h:114
bool rebuilding
Definition replacement_rebuild.h:120
std::uint64_t horizon
Definition replacement_rebuild.h:116
bool scanning
Definition replacement_rebuild.h:120
std::uint64_t clean_rows
Definition replacement_rebuild.h:119
std::uint64_t replayed
Definition replacement_rebuild.h:116
std::uint64_t action_bound
Definition replacement_rebuild.h:117
std::uint64_t mutations
Definition replacement_rebuild.h:115
std::uint64_t initial_bound
Definition replacement_rebuild.h:117
std::uint64_t committed
Definition replacement_rebuild.h:118
std::uint64_t quantum
Definition replacement_rebuild.h:117
std::uint64_t queued
Definition replacement_rebuild.h:118
std::uint64_t admitted
Definition replacement_rebuild.h:116
std::uint64_t frozen_live
Definition replacement_rebuild.h:116
std::uint64_t credit
Definition replacement_rebuild.h:118
std::uint64_t source_records
Definition replacement_rebuild.h:119
std::uint64_t clean_base
Definition replacement_rebuild.h:115
Definition replacement_rebuild.h:106
std::uint64_t tiny_conversion_charged
Definition replacement_rebuild.h:112
std::uint64_t replayed
Definition replacement_rebuild.h:110
std::uint64_t reserved
Definition replacement_rebuild.h:109
std::uint64_t foreground_charged
Definition replacement_rebuild.h:108
std::uint64_t maximum_replay
Definition replacement_rebuild.h:111
std::uint64_t generations
Definition replacement_rebuild.h:107
std::uint64_t granted
Definition replacement_rebuild.h:109
std::uint64_t committed
Definition replacement_rebuild.h:109
std::uint64_t candidate_charged
Definition replacement_rebuild.h:108
std::uint64_t clean_rows
Definition replacement_rebuild.h:110
std::uint64_t tiny_indexes
Definition replacement_rebuild.h:112
std::uint64_t scan_records
Definition replacement_rebuild.h:110
std::uint64_t mutations
Definition replacement_rebuild.h:107
std::uint64_t maximum_handoff_mutations
Definition replacement_rebuild.h:111
std::uint64_t tiny_generations
Definition replacement_rebuild.h:112
Definition replacement_rebuild.h:88
std::shared_ptr< metadata_type const > metadata_
Definition replacement_rebuild.h:103
replacement_world(base_type value, std::uint64_t b=0, std::uint64_t u=0, bool active=false)
Definition replacement_rebuild.h:92
metadata_type const & metadata() const &noexcept
Definition replacement_rebuild.h:96
typename Family::snapshot_type runtime_snapshot
Definition replacement_rebuild.h:91
static replacement_world restore(runtime_snapshot data, metadata_type metadata, std::string_view schema)
Definition replacement_rebuild.h:97
Definition typed_world.h:31
Definition typed_world.h:406
static typed_batch< P, A, Family > batch()
Definition typed_world.h:462
static typed_engine from_snapshot(world_type state)
Definition typed_world.h:433
static session_reservation reservation(contribution_type const &input)
Definition typed_world.h:477
static constexpr bool charged_service
Definition typed_world.h:417
typename Family::template runtime_type< compose_type > runtime_type
Definition typed_world.h:416
static std::uint64_t reservation_work(std::uint64_t records)
Definition typed_world.h:474
typed_world< P, A, Family > world_type
Definition typed_world.h:408
typed_contribution< P, A, Family > contribution_type
Definition typed_world.h:409
Definition typed_scan.h:33
bool has_row() const noexcept
Definition typed_scan.h:99
bool done() const noexcept
Definition typed_scan.h:98
std::uint64_t step(std::uint64_t budget)
Definition typed_scan.h:112
row_type take_row()
Definition typed_scan.h:102
std::uint64_t consumed() const noexcept
Definition typed_scan.h:101
Definition typed_world.h:222
static typed_world restore(runtime_snapshot data, metadata_type metadata, std::string_view expected_schema)
Definition typed_world.h:238
runtime_snapshot const & runtime() const &noexcept
Definition typed_world.h:230
Scans one sort in an immutable typed world with chronological resolution.