/// <summary> /// Оптимальная нода для скачивания блока файла /// </summary> /// <returns></returns> private string GetOptimalNodeForDownloadBlock(string fileName, int blockIndex) { string nodeHostName = null; if (Files.TryGetValue(fileName, out NodeFileInfo nodeFileInfo)) { NodeBlockInfo nodeBlockInfo = nodeFileInfo.Nodes.Where(n => n.Indexes.Contains(blockIndex)).OrderBy(n => n.Priority).FirstOrDefault(); nodeHostName = nodeBlockInfo?.HostName; } return(nodeHostName); }
private Dictionary <string, List <Block> > OptimalHosts(List <Block> blocks) { var optimalHosts = new Dictionary <string, List <Block> >(); foreach (var block in blocks) { NodeBlockInfo nodeBlockInfo = Files.Values.SelectMany(f => f.Nodes).OrderBy(x => x.Indexes.Count).ThenBy(x => x.Priority).FirstOrDefault(); nodeBlockInfo.Indexes.Add(block.Info.Index); if (!optimalHosts.TryGetValue(nodeBlockInfo.HostName, out var parts)) { parts = new List <Block>(); optimalHosts.Add(nodeBlockInfo.HostName, parts); } parts.Add(block); } return(optimalHosts); }