pub struct EntityResync { /* private fields */ }Expand description
The projector’s way back to the VM its mutations come from.
The entity cache is bounded. A patch for a key it does not hold carries
only the fields that changed and cannot rebuild the entity, unless it is
the mutation that created the entity. A linked VM marks those
(WholeEntity::Created), so the cache stores a creation and refuses any
other patch for a key it lacks, whether it evicted the key or never held
it. The projector then asks the VM, which holds the whole entity, to send
all of it at the end of its next batch of mutations, whether or not the
key changes in it (see WholeEntityRequests).
A resend is the entity again, not a change, so it must not take the
position (_seq) of the batch it arrives in: in a view ordered by recency
it would rank ahead of entities that really changed there. The projector
remembers the position of each requested key’s latest change — the refused
patch, or any change it sees for the key after it — and stamps the resend
with that, in the cache, in derived views and on the upsert it
publishes. It learns a key’s changes in stream order, which the VM cannot:
positions are assigned per batch, after the VM has emitted it. A resend
with no remembered position (one past the bound, or from a source without
a VM, which sends whole entities as changes) takes its batch’s.
For an account-owned entity it also remembers the explicit account position
at request time, so a whole entity produced for an old lifetime cannot land
after deletion and recreation.
The generated runtime hands its VM over through
crate::snapshot::register_runtime, inside Self::scope, before it
emits anything. A mutation source that registers no VM marks nothing and
cannot be asked: the cache takes a patch for a key it lacks for a new
entity unless it remembers evicting the key, and a remembered key stays
out until the source sends a mutation marked whole
(arete_interpreter::Mutation::mark_whole_entity) or a source delete.
Implementations§
Source§impl EntityResync
impl EntityResync
pub fn new() -> Self
Sourcepub async fn scope<F: Future>(&self, future: F) -> F::Output
pub async fn scope<F: Future>(&self, future: F) -> F::Output
Run a mutation source (the generated parser) so that the VM it registers answers this projector’s requests.
pub fn is_linked(&self) -> bool
Sourcepub fn requests(&self) -> &WholeEntityRequests
pub fn requests(&self) -> &WholeEntityRequests
The request set, for inspection.