Ejemplo n.º 1
0
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
	}
}
Ejemplo n.º 2
0
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
}