func (p *Proposer) TopologyChange(topology *configuration.Topology) { if topology == p.topology { return } p.topology = topology rmsRemoved := topology.RMsRemoved() server.Log("proposer", p.txnId, "in", p.currentState, "sees loss of", rmsRemoved) if _, found := rmsRemoved[p.proposerManager.RMId]; found { return } // create new acceptors slice because the initial slice can be // shared with proposals. acceptors := make([]common.RMId, 0, len(p.acceptors)) for _, rmId := range p.acceptors { if _, found := rmsRemoved[rmId]; !found { acceptors = append(acceptors, rmId) } } p.acceptors = acceptors switch p.currentState { case &p.proposerAwaitBallots, &p.proposerReceiveOutcomes, &p.proposerAwaitLocallyComplete: if p.outcomeAccumulator.TopologyChange(topology) { p.allAcceptorsAgree() } case &p.proposerReceiveGloballyComplete: for rmId := range rmsRemoved { p.TxnGloballyCompleteReceived(rmId) } case &p.proposerAwaitFinished: // do nothing } }
func (oa *OutcomeAccumulator) TopologyChange(topology *configuration.Topology) bool { result := false for rmId := range topology.RMsRemoved() { if _, found := oa.pendingTGC[rmId]; found { delete(oa.pendingTGC, rmId) if outcome, found := oa.acceptorIdToTxnOutcome[rmId]; found { delete(oa.acceptorIdToTxnOutcome, rmId) outcome.outcomeReceivedCount-- } oa.acceptorCount-- if oa.acceptorCount > oa.fInc { oa.fInc = oa.acceptorCount } if oa.decidingOutcome != nil { result = result || oa.decidingOutcome.outcomeReceivedCount == oa.acceptorCount } } } return result }