public IConnection AcquireConnection(AccessMode mode) { _routingTableManager.EnsureRoutingTableForMode(mode); while (true) { Uri uri; switch (mode) { case AccessMode.Read: uri = _loadBalancingStrategy.SelectReader(_routingTableManager.RoutingTable.Readers); break; case AccessMode.Write: uri = _loadBalancingStrategy.SelectWriter(_routingTableManager.RoutingTable.Writers); break; default: throw new InvalidOperationException($"Unknown access mode {mode}"); } if (uri == null) { // no server known to routingTable break; } IConnection conn = CreateClusterConnection(uri, mode); if (conn != null) { return(conn); } //else connection already removed by clusterConnection onError method } throw new SessionExpiredException($"Failed to connect to any {mode.ToString().ToLower()} server."); }
public async Task <IConnection> AcquireConnectionAsync(AccessMode mode, string database, Bookmark bookmark) { var routingTable = await _routingTableManager.EnsureRoutingTableForModeAsync(mode, database, bookmark) .ConfigureAwait(false); while (true) { Uri uri; switch (mode) { case AccessMode.Read: uri = _loadBalancingStrategy.SelectReader(routingTable.Readers, database); break; case AccessMode.Write: uri = _loadBalancingStrategy.SelectWriter(routingTable.Writers, database); break; default: throw new InvalidOperationException($"Unknown access mode {mode}"); } if (uri == null) { // no server known to routingTable break; } var conn = await CreateClusterConnectionAsync(uri, mode, database, bookmark).ConfigureAwait(false); if (conn != null) { return(conn); } //else connection already removed by clusterConnection onError method } throw new SessionExpiredException($"Failed to connect to any {mode.ToString().ToLower()} server."); }