in src/Transport/Failover/FailoverTransport.cs [1291:1363]
private bool BuildBackups()
{
lock(backupMutex)
{
if (!disposed && (backup || priorityBackup) && backups.Count < backupPoolSize)
{
List<Uri> backupList = new List<Uri>(priorityList);
List<Uri> connectList = ConnectList;
foreach(Uri uri in connectList)
{
if (!backupList.Contains(uri))
{
backupList.Add(uri);
}
}
foreach(BackupTransport bt in backups)
{
if(bt.Disposed)
{
backups.Remove(bt);
}
}
foreach(Uri u in connectList)
{
if (disposed)
{
break;
}
Uri uri = AddExtraQueryOptions(u);
if (ConnectedTransportURI != null && !ConnectedTransportURI.Equals(uri))
{
try
{
BackupTransport bt = new BackupTransport(this)
{
Uri = uri
};
if(!backups.Contains(bt))
{
ITransport t = TransportFactory.CompositeConnect(uri);
t.CommandAsync = bt.OnCommand;
t.Exception = bt.OnException;
t.Start();
bt.Transport = t;
if (priorityBackup && IsPriority(uri))
{
priorityBackupAvailable = true;
backups.Insert(0, bt);
}
else
{
backups.Add(bt);
}
}
}
catch(Exception e)
{
Tracer.DebugFormat("Failed to build backup: {0}", e.Message);
}
}
if(backups.Count == BackupPoolSize)
{
break;
}
}
}
}
return false;
}