use crate::lifecycle::AdmissionOrder;
use crate::wire::{
BindingEpoch, CloseCause, ConversationId, DeliverySeq, ParticipantId, ParticipantIndex,
RepaymentEdge, TransactionOrder,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct UncleanServerRestartCause {
pub prior_server_incarnation: u64,
}
impl UncleanServerRestartCause {
#[must_use]
pub const fn as_close_cause(self) -> CloseCause {
CloseCause::UncleanServerRestart {
prior_server_incarnation: self.prior_server_incarnation,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum BindingRecoveryFinalization {
Appended {
delivery_seq: DeliverySeq,
},
Pending {
admission_order: AdmissionOrder,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct BindingRecoveryCommitted {
pub participant_id: ParticipantId,
pub conversation_id: ConversationId,
pub recovered_binding_epoch: BindingEpoch,
pub cause: UncleanServerRestartCause,
pub assigned_transaction_order: TransactionOrder,
pub finalization: BindingRecoveryFinalization,
pub repayment_edge: RepaymentEdge,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
#[repr(u8)]
pub enum CandidatePhase {
BindingTerminal = 0,
MembershipExit = 1,
AttachLifecycle = 2,
OrdinaryRecord = 3,
CompactionMarker = 4,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ClaimCounter {
DeliverySeq,
TransactionOrder,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ParticipantStateCorruptReason {
DuplicateCandidateKey {
transaction_order: TransactionOrder,
candidate_phase: CandidatePhase,
participant_index: ParticipantIndex,
},
ClaimFrontierInvalid {
counter: ClaimCounter,
first_bad_position: u128,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ParticipantStateCorrupt {
pub conversation_id: ConversationId,
pub reason: ParticipantStateCorruptReason,
}