MetadataStatistics
public class MetadataStatistics : ITransferStatistics, IMetadataProcessingStatistics, IProcessingStatistics, IStateful
using kCura.WinEDDS;
using Relativity.DataExchange.Export.VolumeManagerV2.Batches;
using Relativity.DataExchange.Io;
using Relativity.DataExchange.Logger;
using Relativity.DataExchange.Transfer;
using Relativity.Logging;
using System;
using System.Collections.Generic;
namespace Relativity.DataExchange.Export.VolumeManagerV2.Statistics
{
public class MetadataStatistics : ITransferStatistics, IMetadataProcessingStatistics, IProcessingStatistics, IStateful
{
private double _savedThroughput;
private long _savedMetadataBytes;
private TimeSpan _savedMetadataTransferDuration;
private Dictionary<string, long> _savedFilesSize;
private readonly kCura.WinEDDS.Statistics _statistics;
private readonly IFile _fileWrapper;
private readonly ILog _logger;
private readonly object _lock = new object();
private readonly Dictionary<string, long> _filesSize;
public long MetadataTime => _statistics.MetadataTransferDuration.Ticks;
public MetadataStatistics(kCura.WinEDDS.Statistics statistics, IFile fileWrapper, ILog logger)
{
_filesSize = new Dictionary<string, long>();
_savedFilesSize = new Dictionary<string, long>();
_statistics = statistics.ThrowIfNull("statistics");
_fileWrapper = fileWrapper.ThrowIfNull("fileWrapper");
_logger = logger.ThrowIfNull<ILog>("logger");
}
public void Subscribe(ITapiBridge tapiBridge)
{
tapiBridge.ThrowIfNull("tapiBridge");
_logger.LogVerbose("Attached tapi bridge {TapiBridgeInstanceId} to metadata statistics.", new object[1] {
tapiBridge.InstanceId
});
tapiBridge.TapiProgress += OnProgress;
tapiBridge.TapiStatistics += TapiBridgeOnTapiStatistics;
}
private void TapiBridgeOnTapiStatistics(object sender, TapiStatisticsEventArgs e)
{
lock (_lock) {
_statistics.MetadataTransferThroughput = e.TransferRateBytes;
}
}
private void OnProgress(object sender, TapiProgressEventArgs e)
{
_logger.LogVerbose("Progress event for file {FileName} with status {Successful}.", new object[2] {
e.FileName.Secure(),
e.Successful
});
if (e.Successful) {
lock (_lock) {
_statistics.MetadataTransferredBytes += e.FileBytes;
_statistics.MetadataTransferDuration += e.EndTime - e.StartTime;
_statistics.MetadataFilesTransferredCount++;
}
}
}
public void Unsubscribe(ITapiBridge tapiBridge)
{
tapiBridge.ThrowIfNull("tapiBridge");
_logger.LogVerbose("Detached tapi bridge {TapiBridgeInstanceId} from metadata statistics.", new object[1] {
tapiBridge.InstanceId
});
tapiBridge.TapiProgress -= OnProgress;
tapiBridge.TapiStatistics -= TapiBridgeOnTapiStatistics;
}
public void UpdateStatisticsForFile(string path)
{
lock (_lock) {
if (_fileWrapper.Exists(path)) {
long num = 0;
if (_filesSize.ContainsKey(path))
num = _filesSize[path];
long fileSize = _fileWrapper.GetFileSize(path);
_statistics.MetadataTransferredBytes += fileSize - num;
_filesSize[path] = fileSize;
} else
_logger.LogWarning("Trying to add statistics for file {path}, but file doesn't exist.", new object[1] {
path.Secure()
});
}
}
public void UpdateStatistics(string fileName, bool transferResult, long transferredBytes, long totalTicks)
{
_logger.LogVerbose("Progress event for file {FileName} with status {Successful}.", new object[2] {
fileName.Secure(),
transferResult
});
if (transferResult) {
lock (_lock) {
_statistics.MetadataFilesTransferredCount++;
_statistics.MetadataTransferredBytes += transferredBytes;
_statistics.MetadataTransferDuration = new TimeSpan(totalTicks);
_statistics.MetadataTransferThroughput = kCura.WinEDDS.Statistics.CalculateThroughput(_statistics.MetadataTransferredBytes, _statistics.MetadataTransferDuration.TotalSeconds);
}
}
}
public void SaveState()
{
lock (_lock) {
_savedThroughput = _statistics.MetadataTransferThroughput;
_savedMetadataBytes = _statistics.MetadataTransferredBytes;
_savedMetadataTransferDuration = _statistics.MetadataTransferDuration;
_savedFilesSize = new Dictionary<string, long>(_filesSize);
}
}
public void RestoreLastState()
{
lock (_lock) {
_statistics.MetadataTransferThroughput = _savedThroughput;
_statistics.MetadataTransferredBytes = _savedMetadataBytes;
_statistics.MetadataTransferDuration = _savedMetadataTransferDuration;
_filesSize.Clear();
foreach (KeyValuePair<string, long> item in _savedFilesSize) {
_filesSize.Add(item.Key, item.Value);
}
}
}
}
}