private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string addressType) { var count = addresses.Count; if (count == 0) { LogDebug($"Unable to select {addressType}, no known addresses given."); return(null); } var index = roundRobinIndex.Next(count); var address = addresses[index]; LogDebug($"Selected {addressType} with address: '{address}' in round-robin fashion."); return(address); }
private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string addressType) { var count = addresses.Count; if (count == 0) { _logger.Trace($"Unable to select {addressType}, no known addresses given"); return(null); } var index = roundRobinIndex.Next(count); var address = addresses[index]; _logger.Trace($"Unable to select {addressType}, no known addresses given"); return(address); }
private Uri Select(IList <Uri> addresses, RoundRobinArrayIndex roundRobinIndex, string forDatabase, string addressType) { var count = addresses.Count; if (count == 0) { LogDebug($"Unable to select {addressType} for database '{forDatabase}', no known addresses given"); return(null); } // choose start index for iteration in round-robin fashion var startIndex = roundRobinIndex.Next(count); var index = startIndex; Uri leastConnectedAddress = null; var leastActiveConnections = Int32.MaxValue; // iterate over the array to find least connected address do { Uri address = addresses[index]; int inUseConnections = _connectionPool.NumberOfInUseConnections(address); if (inUseConnections < leastActiveConnections) { leastConnectedAddress = address; leastActiveConnections = inUseConnections; } // loop over to the start of the array when end is reached if (index == count - 1) { index = 0; } else { index++; } } while (index != startIndex); LogDebug( $"Selected {addressType} for database '{forDatabase}' with least connected address: '{leastConnectedAddress}' and active connections: {leastActiveConnections}"); return(leastConnectedAddress); }