private async Task PrepareOnTheRestOfTheNodes(PrepareRequest request, Session session) { Host host; HostDistance distance; var lbp = session.Cluster.Configuration.Policies.LoadBalancingPolicy; var tasks = new List <Task>(); var triedHosts = new Dictionary <IPEndPoint, Exception>(); while ((host = GetNextHost(lbp, out distance)) != null) { var connection = await RequestHandler .GetConnectionFromHost(host, distance, session, triedHosts).ConfigureAwait(false); if (connection == null) { continue; } // For each valid connection, send a the request in parallel tasks.Add(connection.Send(request)); } try { await Task.WhenAll(tasks).ConfigureAwait(false); } catch { // Don't consider individual failures } }
private async Task <Connection> GetNextConnection(Session session, Dictionary <IPEndPoint, Exception> triedHosts) { Host host; HostDistance distance; var lbp = session.Cluster.Configuration.Policies.LoadBalancingPolicy; while ((host = GetNextHost(lbp, out distance)) != null) { var connection = await RequestHandler .GetConnectionFromHost(host, distance, session, triedHosts).ConfigureAwait(false); if (connection != null) { return(connection); } } throw new NoHostAvailableException(triedHosts); }