RemainingTimeCalculator
class 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);
}
}
}