2
0
mirror of synced 2025-02-18 19:27:07 +00:00
cs-codex-dist-tests/Tools/TranscriptAnalysis/DuplicateBlocksReceived.cs
2024-08-06 15:56:42 +02:00

81 lines
2.4 KiB
C#

using CodexPlugin.OverwatchSupport;
using Logging;
using OverwatchTranscript;
namespace TranscriptAnalysis
{
public class DuplicateBlocksReceived
{
private readonly ILog log;
public DuplicateBlocksReceived(ILog log, ITranscriptReader reader)
{
this.log = new LogPrefixer(log, "(DuplicateBlocks) ");
reader.AddEventHandler<OverwatchCodexEvent>(Handle);
}
public void Finish()
{
Log("Number of BlockReceived events seen: " + seen);
var totalReceived = peerIdBlockAddrCount.Sum(a => a.Value.Sum(p => p.Value));
var maxRepeats = peerIdBlockAddrCount.Max(a => a.Value.Max(p => p.Value));
var occurances = new int[maxRepeats + 1];
foreach (var peerPair in peerIdBlockAddrCount)
{
foreach (var pair in peerPair.Value)
{
occurances[pair.Value]++;
}
}
float t = totalReceived;
for (var i = 1; i < occurances.Length; i++)
{
float n = occurances[i];
float p = 100.0f * (n / t);
Log($"Block received {i} times = {occurances[i]}x ({p}%)");
}
}
private void Handle(ActivateEvent<OverwatchCodexEvent> obj)
{
if (obj.Payload.BlockReceived != null)
{
Handle(obj.Payload, obj.Payload.BlockReceived);
}
}
private int seen = 0;
private readonly Dictionary<string, Dictionary<string, int>> peerIdBlockAddrCount = new Dictionary<string, Dictionary<string, int>>();
private void Handle(OverwatchCodexEvent payload, BlockReceivedEvent blockReceived)
{
var receiverPeerId = payload.PeerId;
var blockAddress = blockReceived.BlockAddress;
seen++;
if (!peerIdBlockAddrCount.ContainsKey(receiverPeerId))
{
peerIdBlockAddrCount.Add(receiverPeerId, new Dictionary<string, int>());
}
var blockAddCount = peerIdBlockAddrCount[receiverPeerId];
if (!blockAddCount.ContainsKey(blockAddress))
{
blockAddCount.Add(blockAddress, 1);
}
else
{
blockAddCount[blockAddress]++;
}
}
private void Log(string v)
{
log.Log(v);
}
}
}