<PackageReference Include="Relativity.Server.Import.SDK" Version="2.9.2" />

MetadataStatistics

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