コード例 #1
0
ファイル: coordinator.go プロジェクト: jchris/indexing
//
// run election
//
func (s *Coordinator) runElection() (leader string, err error) {

	host := s.getHostUDPAddr()
	peers := s.getPeerUDPAddr()

	// Create an election site to start leader election.
	logging.Debugf("Coordinator.runElection(): Local Coordinator %s start election", host)
	logging.Debugf("Coordinator.runElection(): Peer in election")
	for _, peer := range peers {
		logging.Debugf("	peer : %s", peer)
	}

	s.site, err = protocol.CreateElectionSite(host, peers, s.factory, s, false)
	if err != nil {
		return "", err
	}

	// blocked until leader is elected. coordinator.Terminate() will unblock this.
	resultCh := s.site.StartElection()
	leader, ok := <-resultCh
	if !ok {
		return "", NewError(ERROR_COOR_ELECTION_FAIL, NORMAL, COORDINATOR, nil,
			fmt.Sprintf("Index Coordinator Election Fails"))
	}

	return leader, nil
}
コード例 #2
0
ファイル: server.go プロジェクト: couchbase/gometa
//
// run election
//
func (s *Server) runElection() (leader string, err error) {

	host := GetHostUDPAddr()
	peers := GetPeerUDPAddr()

	// Create an election site to start leader election.
	log.Current.Debugf("Server.runElection(): Local Server %s start election", host)
	log.Current.Debugf("Server.runElection(): Peer in election")
	for _, peer := range peers {
		log.Current.Debugf("	peer : %s", peer)
	}

	s.site, err = protocol.CreateElectionSite(host, peers, s.factory, s.handler, false)
	if err != nil {
		return "", err
	}

	resultCh := s.site.StartElection()
	if resultCh == nil {
		return "", common.NewError(common.SERVER_ERROR, "Election Site is in progress or is closed.")
	}

	leader, ok := <-resultCh // blocked until leader is elected
	if !ok {
		return "", common.NewError(common.SERVER_ERROR, "Election Fails")
	}

	return leader, nil
}