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

RemainingTimeCalculator

using System; using System.Collections.Concurrent; using System.Linq; namespace Relativity.Transfer.Job { internal class RemainingTimeCalculator { private readonly ConcurrentQueue<double> transferRateMbpsSnapshots = new ConcurrentQueue<double>(); private readonly IGlobalSettings globalSettings; public RemainingTimeCalculator(IGlobalSettings globalSettings) { this.globalSettings = globalSettings; } public TimeSpan Calculate(ITransferStatistics statistics) { Enqueue(statistics); if (statistics.TransferTimeSeconds <= 0 || statistics.TotalRequestBytes <= 0 || statistics.TotalTransferredBytes <= 0) return TimeSpan.Zero; double num = ConvertMbpsToBps(transferRateMbpsSnapshots.Average()); if (num > 0) return TimeSpan.FromSeconds(Math.Round((double)(statistics.TotalRequestBytes - statistics.TotalTransferredBytes) / num)); return TimeSpan.Zero; } public void Clear() { while (!transferRateMbpsSnapshots.IsEmpty) { transferRateMbpsSnapshots.TryDequeue(out double _); } } private static double ConvertMbpsToBps(double transferRateMBps) { return transferRateMBps / 8 * 1048576; } private void Enqueue(ITransferStatistics statistics) { if (transferRateMbpsSnapshots.Count == globalSettings.StatisticsMaxSamples) transferRateMbpsSnapshots.TryDequeue(out double _); transferRateMbpsSnapshots.Enqueue(statistics.TransferRateMbps); } } }