@ -1999,11 +1999,30 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
if ( nTries > 100 )
break ;
CAddrInfo addr = addrman . SelectTriedCollision ( ) ;
CAddrInfo addr ;
// SelectTriedCollision returns an invalid address if it is empty.
if ( ! fFeeler | | ! addr . IsValid ( ) ) {
addr = addrman . Select ( fFeeler ) ;
if ( fFeeler ) {
// First, try to get a tried table collision address. This returns
// an empty (invalid) address if there are no collisions to try.
addr = addrman . SelectTriedCollision ( ) ;
if ( ! addr . IsValid ( ) ) {
// No tried table collisions. Select a new table address
// for our feeler.
addr = addrman . Select ( true ) ;
} else if ( AlreadyConnectedToAddress ( addr ) ) {
// If test-before-evict logic would have us connect to a
// peer that we're already connected to, just mark that
// address as Good(). We won't be able to initiate the
// connection anyway, so this avoids inadvertently evicting
// a currently-connected peer.
addrman . Good ( addr ) ;
// Select a new table address for our feeler instead.
addr = addrman . Select ( true ) ;
}
} else {
// Not a feeler
addr = addrman . Select ( ) ;
}
// Require outbound connections, other than feelers, to be to distinct network groups