func (servers *mongoServers) BestFit(serverTags []bson.D) *mongoServer {
	var best *mongoServer
	for _, next := range servers.slice {
		if best == nil {
			best = next
			best.RLock()
			if serverTags != nil && !next.info.Mongos && !best.hasTags(serverTags) {
				best.RUnlock()
				best = nil
			}
			continue
		}
		next.RLock()
		swap := false
		switch {
		case serverTags != nil && !next.info.Mongos && !next.hasTags(serverTags):
			// Must have requested tags.
		case next.info.Master != best.info.Master:
			// Prefer slaves.
			swap = best.info.Master
		case absDuration(next.pingValue-best.pingValue) > 15*time.Millisecond:
			// Prefer nearest server.
			swap = next.pingValue < best.pingValue
		case len(next.liveSockets)-len(next.unusedSockets) < len(best.liveSockets)-len(best.unusedSockets):
			// Prefer servers with less connections.
			swap = true
		}
		if swap {
			best.RUnlock()
			best = next
		} else {
			next.RUnlock()
		}
	}
	if best != nil {
		best.RUnlock()
	}
	return best
}
func (servers *mongoServers) BestFit(serverTags []bson.D) *mongoServer {
	var best *mongoServer
	for _, next := range servers.slice {
		if best == nil {
			best = next
			best.RLock()
			if serverTags != nil && !next.info.Mongos && !best.hasTags(serverTags) {
				best.RUnlock()
				best = nil
			}
			continue
		}
		next.RLock()
		swap := false
		switch {
		case serverTags != nil && !next.info.Mongos && !next.hasTags(serverTags):
			
		case next.info.Master != best.info.Master:
			
			swap = best.info.Master
		case absDuration(next.pingValue-best.pingValue) > 15*time.Millisecond:
			
			swap = next.pingValue < best.pingValue
		case len(next.liveSockets)-len(next.unusedSockets) < len(best.liveSockets)-len(best.unusedSockets):
			
			swap = true
		}
		if swap {
			best.RUnlock()
			best = next
		} else {
			next.RUnlock()
		}
	}
	if best != nil {
		best.RUnlock()
	}
	return best
}
func ( servers * mongoServers ) BestFit ( serverTags [ ] bson . D ) * mongoServer { var best * mongoServer for _ , next := range servers . slice { if best == nil { best = next best . RLock ( ) if serverTags != nil && ! next . info . Mongos && ! best . hasTags ( serverTags ) { best . RUnlock ( ) best = nil } continue } next . RLock ( ) swap := false switch { case serverTags != nil && ! next . info . Mongos && ! next . hasTags ( serverTags ) : // Must have requested tags. case next . info . Master != best . info . Master : // Prefer slaves. swap = best . info . Master case absDuration ( next . pingValue - best . pingValue ) > 15 * time . Millisecond : // Prefer nearest server. swap = next . pingValue < best . pingValue case len ( next . liveSockets ) - len ( next . unusedSockets ) < len ( best . liveSockets ) - len ( best . unusedSockets ) : // Prefer servers with less connections. swap = true } if swap { best . RUnlock ( ) best = next } else { next . RUnlock ( ) } } if best != nil { best . RUnlock ( ) } return best }
// BestFit returns the best guess of what would be the most interesting
// server to perform operations on at this point in time.
BestFit returns the best guess of what would be the most interesting server to perform operations on at this point in time .