/// <summary> /// Возвращает для текущейго контейнера кол-во блокировок, вызванных потоковой передачей. /// </summary> /// <returns></returns> private int GetContainerStreamingLocksCount(ICollection <Blob> activeBlobs) { if (activeBlobs == null) { throw new ArgumentNullException("activeBlobs"); } int containerStreamingLocks = 0; if (activeBlobs.Count > 0) { string pathLower = this.Path.ToLower(); lock (_commonLocker) { if (_containerStreamingLocks.ContainsKey(pathLower)) { ContainerLockInfo containerLockInfo = _containerStreamingLocks[pathLower]; foreach (Blob blob in activeBlobs) { if (containerLockInfo.LockExists(blob)) { containerStreamingLocks++; } } } } } return(containerStreamingLocks); }
private Blob GetRandomBlob(List <Blob> activeBlobs) { if (activeBlobs == null) { throw new ArgumentNullException("activeBlobs"); } List <Blob> resultCollection = null; if (activeBlobs.Count > 1) { //выборка блоба без потоковой блокировки string pathLower = this.Path.ToLower(); List <Blob> blobsWithoutStreamingLock = new List <Blob>(); object containerStreamingLocker = this.GetContainerLocker(ContainerLockerType.Streaming); lock (containerStreamingLocker) { if (_containerStreamingLocks.ContainsKey(pathLower)) { ContainerLockInfo containerLockInfo = _containerStreamingLocks[pathLower]; foreach (Blob blob in activeBlobs) { if (!containerLockInfo.LockExists(blob)) { blobsWithoutStreamingLock.Add(blob); } } } } if (blobsWithoutStreamingLock.Count > 0) { resultCollection = blobsWithoutStreamingLock; } else { //нет свободных от потоковых блокировок блобов, выбираем из тех, что заблокированы //какой из таких блобов освободится первее для записи невозможно, т.к. заренее неизвестен //объем потоковых данных resultCollection = activeBlobs; } } else { resultCollection = activeBlobs; } Blob randomBlob = null; if (resultCollection.Count == 0) { throw new Exception(string.Format("Невозможно выбрать произвольный блоб из пустой коллекции")); } else if (resultCollection.Count == 1) { //в коллекции 1 блоб, его и выбираем randomBlob = resultCollection.First(); } else { //выбираем рандомный блоб для записи. //для равномерного распределения файлов используем хеш-код GUID int index = Math.Abs(Guid.NewGuid().GetHashCode() % resultCollection.Count); randomBlob = resultCollection[index]; } return(randomBlob); }