Enum holochain_types::prelude::ChainTopOrdering
source · [−]pub enum ChainTopOrdering {
Relaxed,
Strict,
}
Variants
Relaxed
Relaxed chain top ordering REWRITES ACTIONS INLINE during a flush of
the source chain to sit on top of the current chain top. The “as at”
of the zome call initial state is completely ignored.
This may be significantly more efficient if you are CERTAIN that none
of your zome or validation logic is order dependent. Examples include
simple chat messages or tweets. Note however that even chat messages
and tweets may have subtle order dependencies, such as if a cap grant
was written or revoked that would have invalidated the zome call that
wrote data after the revocation, etc.
The efficiency of relaxed ordering comes from simply rehashing and
signing actions on the new chain top during flush, avoiding the
overhead of the client, websockets, zome call instance, wasm execution,
validation, etc. that would result from handling a HeadMoved
error
via an external driver.
Strict
The default Strict
ordering is the default for a very good reason.
Writes normally compare the chain head from the start of a zome call
against the time a write transaction is flushed from the source chain.
This is REQUIRED for data integrity if any zome or validation logic
depends on the ordering of data in a chain.
This order dependence could be obvious such as an explicit reference or
dependency. It could be very subtle such as checking for the existence
or absence of some data.
If you are unsure whether your data is order dependent you should err
on the side of caution and handle HeadMoved
errors on the client of
the zome call and restart the zome call from the start.
Trait Implementations
sourceimpl Clone for ChainTopOrdering
impl Clone for ChainTopOrdering
sourcefn clone(&self) -> ChainTopOrdering
fn clone(&self) -> ChainTopOrdering
1.0.0 · sourceconst fn clone_from(&mut self, source: &Self)
const fn clone_from(&mut self, source: &Self)
source
. Read moresourceimpl Debug for ChainTopOrdering
impl Debug for ChainTopOrdering
sourceimpl Default for ChainTopOrdering
impl Default for ChainTopOrdering
sourcefn default() -> ChainTopOrdering
fn default() -> ChainTopOrdering
sourceimpl<'de> Deserialize<'de> for ChainTopOrdering
impl<'de> Deserialize<'de> for ChainTopOrdering
sourcefn deserialize<__D>(
__deserializer: __D
) -> Result<ChainTopOrdering, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D
) -> Result<ChainTopOrdering, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
sourceimpl PartialEq<ChainTopOrdering> for ChainTopOrdering
impl PartialEq<ChainTopOrdering> for ChainTopOrdering
sourcefn eq(&self, other: &ChainTopOrdering) -> bool
fn eq(&self, other: &ChainTopOrdering) -> bool
sourceimpl Serialize for ChainTopOrdering
impl Serialize for ChainTopOrdering
sourcefn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for ChainTopOrdering
impl StructuralPartialEq for ChainTopOrdering
Auto Trait Implementations
impl RefUnwindSafe for ChainTopOrdering
impl Send for ChainTopOrdering
impl Sync for ChainTopOrdering
impl Unpin for ChainTopOrdering
impl UnwindSafe for ChainTopOrdering
Blanket Implementations
impl<T> Any for Twhere
T: Any + ?Sized,
impl<T> Any for Twhere
T: Any + ?Sized,
fn type_id_compat(&self) -> TypeId
fn type_id_compat(&self) -> TypeId
impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
type ArchivedMetadata = ()
type ArchivedMetadata = ()
fn pointer_metadata(
&<T as ArchivePointee>::ArchivedMetadata
) -> <T as Pointee>::Metadata
fn pointer_metadata(
&<T as ArchivePointee>::ArchivedMetadata
) -> <T as Pointee>::Metadata
sourceimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<F, W, T, D> Deserialize<With<T, W>, D> for Fwhere
W: DeserializeWith<F, T, D>,
D: Fallible + ?Sized,
F: ?Sized,
impl<F, W, T, D> Deserialize<With<T, W>, D> for Fwhere
W: DeserializeWith<F, T, D>,
D: Fallible + ?Sized,
F: ?Sized,
fn deserialize(
&self,
deserializer: &mut D
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize(
&self,
deserializer: &mut D
) -> Result<With<T, W>, <D as Fallible>::Error>
impl<T> FutureExt for T
impl<T> FutureExt for T
fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
impl<T> Pointable for T
impl<T> Pointable for T
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read morefn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.