<PackageReference Include="Relativity.Server.Transfer.SDK" Version="24000.0.1" />

StatisticsCalculator

using System.Collections.Concurrent; using System.Linq; namespace Relativity.Transfer.Job { internal class StatisticsCalculator : IStatisticsCalculator { private readonly ConcurrentBag<ITransferStatistics> savedStatistics = new ConcurrentBag<ITransferStatistics>(); private long lastTotalTransferredBytes; private double lastTransferTimeSeconds; private readonly IStatisticsTotalsCalculator totalsCalculator; public int Count => savedStatistics.Count; public StatisticsCalculator(IStatisticsTotalsCalculator totalsCalculator) { this.totalsCalculator = totalsCalculator; } public TransferStatistics Calculate(ITransferStatistics previousStatistics) { TransferStatistics transferStatistics = new TransferStatistics(previousStatistics); IStatisticsTotals statisticsTotals = totalsCalculator.Calculate(); transferStatistics.AssignTotals(statisticsTotals); transferStatistics.TransferTimeSeconds = previousStatistics.TransferTimeSeconds + savedStatistics.Sum((ITransferStatistics x) => x.TransferTimeSeconds); transferStatistics.StartTime = (statisticsTotals.HasDirectories ? previousStatistics.StartTime : (savedStatistics.FirstOrDefault() ?? previousStatistics).StartTime); transferStatistics.Progress = CalculateProgress(transferStatistics); transferStatistics.AverageTransferRateMbps = TransferHelper.CalculateTransferRateMbps(transferStatistics.TotalTransferredBytes, transferStatistics.TransferTimeSeconds); transferStatistics.TransferRateMbps = CalculateTransferRate(transferStatistics); lastTransferTimeSeconds = transferStatistics.TransferTimeSeconds; lastTotalTransferredBytes = transferStatistics.TotalTransferredBytes; return transferStatistics; } public void Save(ITransferStatistics statistics) { savedStatistics.Add(statistics); lastTotalTransferredBytes = 0; lastTransferTimeSeconds = 0; } public void Clear() { while (!savedStatistics.IsEmpty) { savedStatistics.TryTake(out ITransferStatistics _); } } private static double CalculateProgress(ITransferStatistics statistics) { if (statistics.TotalRequestBytes > 0) return TransferHelper.CalculateByteLevelProgress(statistics.TotalRequestBytes, statistics.TotalTransferredBytes); return TransferHelper.CalculateFileLevelProgress(statistics.TotalRequestFiles, statistics.TotalTransferredFiles, statistics.TotalFailedFiles); } private double CalculateTransferRate(ITransferStatistics copy) { long num = copy.TotalTransferredBytes - lastTotalTransferredBytes; double num2 = copy.TransferTimeSeconds - lastTransferTimeSeconds; if (lastTotalTransferredBytes > 0 && num > 0 && num2 > 0) return TransferHelper.CalculateTransferRateMbps(num, num2); return copy.AverageTransferRateMbps; } } }