/ Tools / TranscriptAnalysis / Receivers / DuplicateBlocksReceived.cs
DuplicateBlocksReceived.cs
 1  using CodexPlugin.OverwatchSupport;
 2  using OverwatchTranscript;
 3  
 4  namespace TranscriptAnalysis.Receivers
 5  {
 6      public class DuplicateBlocksReceived : BaseReceiver<OverwatchCodexEvent>
 7      {
 8          public static List<int> Counts = new List<int>();
 9          private long uploadSize;
10  
11          public override string Name => "BlocksReceived";
12  
13          public override void Receive(ActivateEvent<OverwatchCodexEvent> @event)
14          {
15              if (@event.Payload.BlockReceived != null)
16              {
17                  Handle(@event.Payload, @event.Payload.BlockReceived);
18              }
19              if (@event.Payload.FileUploaded != null)
20              {
21                  var uploadEvent = @event.Payload.FileUploaded;
22                  uploadSize = uploadEvent.ByteSize;
23              }
24          }
25  
26          public override void Finish()
27          {
28              Log("Number of BlockReceived events seen: " + seen);
29              var csv = CsvWriter.CreateNew();
30  
31              var totalReceived = peerIdBlockAddrCount.Sum(a => a.Value.Sum(p => p.Value));
32              var maxRepeats = peerIdBlockAddrCount.Max(a => a.Value.Max(p => p.Value));
33              var occurances = new OccuranceMap();
34  
35              foreach (var peerPair in peerIdBlockAddrCount)
36              {
37                  foreach (var blockCountPair in peerPair.Value)
38                  {
39                      occurances.Add(blockCountPair.Value);
40                  }
41              }
42  
43              if (Counts.Any()) throw new Exception("Should be empty");
44  
45              float t = totalReceived;
46              csv.GetColumn("numNodes", Header.Nodes.Length);
47              csv.GetColumn("filesize", uploadSize.ToString());
48              var receiveCountColumn = csv.GetColumn("receiveCount", 0.0f);
49              var occuranceColumn = csv.GetColumn("occurance", 0.0f);
50              occurances.PrintContinous((i, count) =>
51              {
52                  float n = count;
53                  float p = 100.0f * (n / t);
54                  Log($"Block received {i} times = {count}x ({p}%)");
55                  Counts.Add(count);
56                  csv.AddRow(
57                      new CsvCell(receiveCountColumn, i),
58                      new CsvCell(occuranceColumn, count)
59                  );
60              });
61  
62              CsvWriter.Write(csv, SourceFilename + "_blockduplicates.csv");
63          }
64  
65          private int seen = 0;
66          private readonly Dictionary<string, Dictionary<string, int>> peerIdBlockAddrCount = new Dictionary<string, Dictionary<string, int>>();
67  
68          private void Handle(OverwatchCodexEvent payload, BlockReceivedEvent blockReceived)
69          {
70              var receiverPeerId = GetPeerId(payload.NodeIdentity);
71              if (receiverPeerId == null) return;
72              var blockAddress = blockReceived.BlockAddress;
73              seen++;
74  
75              if (!peerIdBlockAddrCount.ContainsKey(receiverPeerId))
76              {
77                  peerIdBlockAddrCount.Add(receiverPeerId, new Dictionary<string, int>());
78              }
79              var blockAddCount = peerIdBlockAddrCount[receiverPeerId];
80              if (!blockAddCount.ContainsKey(blockAddress))
81              {
82                  blockAddCount.Add(blockAddress, 1);
83              }
84              else
85              {
86                  blockAddCount[blockAddress]++;
87              }
88          }
89      }
90  }