fn enter_joint(&self) -> (bool, bool) {
        // NB: in theory, more config changes could qualify for the "simple"
        // protocol but it depends on the config on top of which the changes apply.
        // For example, adding two learners is not OK if both nodes are part of the
        // base config (i.e. two voters are turned into learners in the process of
        // applying the conf change). In practice, these distinctions should not
        // matter, so we keep it simple and use Joint Consensus liberally.
        if self.get_transition() != ConfChangeTransitionAuto || self.changes.len() > 1 {
            // Use Joint Consensus.
            let mut auto_leave = false;
            match self.get_transition() {
                ConfChangeTransitionAuto | ConfChangeTransitionJointImplicit => auto_leave = true,
                ConfChangeTransitionJointExplicit => {}
            }
            return (auto_leave, true);
        }
        (false, false)
    }
// EnterJoint returns two bools. The second bool is true if and only if this
// config change will use Joint Consensus, which is the case if it contains more
// than one change or if the use of Joint Consensus was requested explicitly.
// The first bool can only be true if second one is, and indicates whether the
// Joint State will be left automatically.
EnterJoint returns two bools. The second bool is true if and only if this
config change will use Joint Consensus, which is the case if it contains more
than one change or if the use of Joint Consensus was requested explicitly.
The first bool can only be true if second one is, and indicates whether the
Joint State will be left automatically.
EnterJoint returns two bools . The second bool is true if and only if this config change will use Joint Consensus which is the case if it contains more than one change or if the use of Joint Consensus was requested explicitly . The first bool can only be true if second one is and indicates whether the Joint State will be left automatically .
fn enter_joint(&self) -> (bool, bool) {
        // NB: in theory, more config changes could qualify for the "simple"
        // protocol but it depends on the config on top of which the changes apply.
        // For example, adding two learners is not OK if both nodes are part of the
        // base config (i.e. two voters are turned into learners in the process of
        // applying the conf change). In practice, these distinctions should not
        // matter, so we keep it simple and use Joint Consensus liberally.
        if self.get_transition() != ConfChangeTransitionAuto || self.changes.len() > 1 {
            // Use Joint Consensus.
            let mut auto_leave = false;
            match self.get_transition() {
                ConfChangeTransitionAuto | ConfChangeTransitionJointImplicit => auto_leave = true,
                ConfChangeTransitionJointExplicit => {}
            }
            return (auto_leave, true);
        }
        (false, false)
    }
fn enter_joint ( & self ) -> ( bool , bool ) { // NB: in theory, more config changes could qualify for the "simple" // protocol but it depends on the config on top of which the changes apply. // For example, adding two learners is not OK if both nodes are part of the // base config (i.e. two voters are turned into learners in the process of // applying the conf change). In practice, these distinctions should not // matter, so we keep it simple and use Joint Consensus liberally. if self . get_transition ( ) != ConfChangeTransitionAuto || self . changes . len ( ) > 1 { // Use Joint Consensus. let mut auto_leave = false ; match self . get_transition ( ) { ConfChangeTransitionAuto | ConfChangeTransitionJointImplicit => auto_leave = true , ConfChangeTransitionJointExplicit => { } } return ( auto_leave , true ) ; } ( false , false ) }
EnterJoint returns two bools.
EnterJoint returns two bools .
&self