Example #1
0
func (this *Election) doSaveConfig(config *thispb.Configuration) {
	config.CommitteeList = append([]string{}, this.committee...)
	config.MajoritySize = proto.Int32(int32(this.MajoritySize()))
	if this.InCommittee() {
		config.InCommittee = proto.Bool(true)
	}
}
Example #2
0
func (this *Election) doRestoreConfig(config *thispb.Configuration) {
	this.committee = config.GetCommitteeList()
	atomic.StoreInt32(&this.majoritySize, int32(config.GetMajoritySize()))
	if config.GetInCommittee() {
		atomic.StoreInt32(&this.inCommittee, 1)
	}
}
Example #3
0
// Configure initializes the election instance with the committee members.
func (this *Election) Configure(agents []string) error {
	lock, errLock := this.ctlr.LockAll()
	if errLock != nil {
		return errLock
	}
	defer lock.Unlock()

	if this.MajoritySize() > 0 {
		this.Errorf("election instance is already configured")
		return errs.ErrInvalid
	}

	// TODO: Check for duplicates.

	committee := make([]string, len(agents))
	copy(committee, agents)
	sort.Sort(sort.StringSlice(committee))
	majoritySize := len(committee)/2 + 1

	self := this.msn.UID()

	inCommittee := false
	for _, member := range committee {
		if member == self {
			inCommittee = true
			break
		}
	}

	// Save configuration in the wal.
	config := thispb.Configuration{}
	config.CommitteeList = committee
	config.MajoritySize = proto.Int32(int32(majoritySize))
	config.InCommittee = proto.Bool(inCommittee)
	return this.doUpdateConfig(&config)
}