pub enum ChannelMonitorUpdateStatus {
    Completed,
    InProgress,
    UnrecoverableError,
}
Expand description

An enum representing the status of a channel monitor update persistence.

These are generally used as the return value for an implementation of Persist which is used as the storage layer for a ChainMonitor. See the docs on Persist for a high-level explanation of how to handle different cases.

While UnrecoverableError is provided as a failure variant, it is not truly “handled” on the calling side, and generally results in an immediate panic. For those who prefer to avoid panics, InProgress can be used and you can retry the update operation in the background or shut down cleanly.

Note that channels should generally not be force-closed after a persistence failure. Force-closing with the latest ChannelMonitorUpdate applied may result in a transaction being broadcast which can only be spent by the latest ChannelMonitor! Thus, if the latest ChannelMonitor is not durably persisted anywhere and exists only in memory, naively calling ChannelManager::force_close_broadcasting_latest_txn may result in loss of funds!

Variants§

§

Completed

The update has been durably persisted and all copies of the relevant ChannelMonitor have been updated.

This includes performing any fsync() calls required to ensure the update is guaranteed to be available on restart even if the application crashes.

§

InProgress

Indicates that the update will happen asynchronously in the background or that a transient failure occurred which is being retried in the background and will eventually complete.

This will “freeze” a channel, preventing us from revoking old states or submitting a new commitment transaction to the counterparty. Once the update(s) which are InProgress have been completed, a MonitorEvent::Completed can be used to restore the channel to an operational state.

Even when a channel has been “frozen”, updates to the ChannelMonitor can continue to occur (e.g. if an inbound HTLC which we forwarded was claimed upstream, resulting in us attempting to claim it on this channel) and those updates must still be persisted.

No updates to the channel will be made which could invalidate other ChannelMonitors until a MonitorEvent::Completed is provided, even if you return no error on a later monitor update for the same channel.

For deployments where a copy of ChannelMonitors and other local state are backed up in a remote location (with local copies persisted immediately), it is anticipated that all updates will return InProgress until the remote copies could be updated.

Note that while fully asynchronous persistence of ChannelMonitor data is generally reliable, this feature is considered beta, and a handful of edge-cases remain. Until the remaining cases are fixed, in rare cases, using this feature may lead to funds loss.

§

UnrecoverableError

Indicates that an update has failed and will not complete at any point in the future.

Currently returning this variant will cause LDK to immediately panic to encourage immediate shutdown. In the future this may be updated to disconnect peers and refuse to continue normal operation without a panic.

Applications which wish to perform an orderly shutdown after failure should consider returning InProgress instead and simply shut down without ever marking the update complete.

Trait Implementations§

§

impl Clone for ChannelMonitorUpdateStatus

§

fn clone(&self) -> ChannelMonitorUpdateStatus

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for ChannelMonitorUpdateStatus

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl PartialEq for ChannelMonitorUpdateStatus

§

fn eq(&self, other: &ChannelMonitorUpdateStatus) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
§

impl Copy for ChannelMonitorUpdateStatus

§

impl Eq for ChannelMonitorUpdateStatus

§

impl StructuralPartialEq for ChannelMonitorUpdateStatus

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoRequest<T> for T

source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> DartSafe for T

§

impl<T> TaskRetFutTrait for T
where T: Send,