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 }