raft.go
func (r *Raft) checkLeaderLease() time.Duration {
	// Track contacted nodes, we can always contact ourself
	contacted := 1

	// Check each follower
	var maxDiff time.Duration
	now := time.Now()
	for peer, f := range r.leaderState.replState {
		diff := now.Sub(f.LastContact())
		if diff <= r.conf.LeaderLeaseTimeout {
			contacted++
			if diff > maxDiff {
				maxDiff = diff
			}
		} else {
			// Log at least once at high value, then debug. Otherwise it gets very verbose.
			if diff <= 3*r.conf.LeaderLeaseTimeout {
				r.logger.Warn(fmt.Sprintf("Failed to contact %v in %v", peer, diff))
			} else {
				r.logger.Debug(fmt.Sprintf("Failed to contact %v in %v", peer, diff))
			}
		}
		metrics.AddSample([]string{"raft", "leader", "lastContact"}, float32(diff/time.Millisecond))
	}

	// Verify we can contact a quorum
	quorum := r.quorumSize()
	if contacted < quorum {
		r.logger.Warn("Failed to contact quorum of nodes, stepping down")
		r.setState(Follower)
		metrics.IncrCounter([]string{"raft", "transition", "leader_lease_timeout"}, 1)
	}
	return maxDiff
}
func (r *Raft) checkLeaderLease() time.Duration {
	// Track contacted nodes, we can always contact ourself
	contacted := 1

	// Check each follower
	var maxDiff time.Duration
	now := time.Now()
	for peer, f := range r.leaderState.replState {
		diff := now.Sub(f.LastContact())
		if diff <= r.conf.LeaderLeaseTimeout {
			contacted++
			if diff > maxDiff {
				maxDiff = diff
			}
		} else {
			// Log at least once at high value, then debug. Otherwise it gets very verbose.
			if diff <= 3*r.conf.LeaderLeaseTimeout {
				r.logger.Warn(fmt.Sprintf("Failed to contact %v in %v", peer, diff))
			} else {
				r.logger.Debug(fmt.Sprintf("Failed to contact %v in %v", peer, diff))
			}
		}
		metrics.AddSample([]string{"raft", "leader", "lastContact"}, float32(diff/time.Millisecond))
	}

	// Verify we can contact a quorum
	quorum := r.quorumSize()
	if contacted < quorum {
		r.logger.Warn("Failed to contact quorum of nodes, stepping down")
		r.setState(Follower)
		metrics.IncrCounter([]string{"raft", "transition", "leader_lease_timeout"}, 1)
	}
	return maxDiff
}
func ( r * Raft ) checkLeaderLease ( ) time . Duration { // Track contacted nodes, we can always contact ourself contacted := 1 // Check each follower var maxDiff time . Duration now := time . Now ( ) for peer , f := range r . leaderState . replState { diff := now . Sub ( f . LastContact ( ) ) if diff <= r . conf . LeaderLeaseTimeout { contacted ++ if diff > maxDiff { maxDiff = diff } } else { // Log at least once at high value, then debug. Otherwise it gets very verbose. if diff <= 3 * r . conf . LeaderLeaseTimeout { r . logger . Warn ( fmt . Sprintf ( " " , peer , diff ) ) } else { r . logger . Debug ( fmt . Sprintf ( " " , peer , diff ) ) } } metrics . AddSample ( [ ] string { " " , " " , " " } , float32 ( diff / time . Millisecond ) ) } // Verify we can contact a quorum quorum := r . quorumSize ( ) if contacted < quorum { r . logger . Warn ( " " ) r . setState ( Follower ) metrics . IncrCounter ( [ ] string { " " , " " , " " } , 1 ) } return maxDiff }
// checkLeaderLease is used to check if we can contact a quorum of nodes
// within the last leader lease interval. If not, we need to step down,
// as we may have lost connectivity. Returns the maximum duration without
// contact. This must only be called from the main thread.
checkLeaderLease is used to check if we can contact a quorum of nodes within the last leader lease interval . If not we need to step down as we may have lost connectivity . Returns the maximum duration without contact . This must only be called from the main thread .