public PerformanceSnapshot Snapshot()
        {
            var snap = new PerformanceSnapshot(this.ReadBytes, this.WrittenBytes)
            {
                Start = this.Start,
                Taken = DateTime.UtcNow
            };

            return(snap);
        }
Example #2
0
        public IEnumerable <Block> GetBlocks(IEnumerable <uint256> neededBlocks, CancellationToken cancellationToken = default(CancellationToken))
        {
            AssertState(NodeState.HandShaked, cancellationToken);
            using (TraceCorrelation.Open())
            {
                NodeServerTrace.Information("Downloading blocks");
                int simultaneous = 70;
                PerformanceSnapshot lastSpeed = null;
                using (var listener = CreateListener()
                                      .OfType <BlockPayload>())
                {
                    foreach (var invs in neededBlocks
                             .Select(b => new InventoryVector()
                    {
                        Type = InventoryType.MSG_BLOCK,
                        Hash = b
                    })
                             .Partition(simultaneous))
                    {
                        NodeServerTrace.Information("Speed " + lastSpeed);
                        var begin = Counter.Snapshot();

                        var invsByHash = invs.ToDictionary(k => k.Hash);

                        this.SendMessage(new GetDataPayload(invs.ToArray()));

                        Block[] downloadedBlocks = new Block[invs.Count];
                        while (invsByHash.Count != 0)
                        {
                            var block    = listener.ReceivePayload <BlockPayload>(cancellationToken).Object;
                            var thisHash = block.GetHash();
                            if (invsByHash.ContainsKey(thisHash))
                            {
                                downloadedBlocks[invs.IndexOf(invsByHash[thisHash])] = block;
                                invsByHash.Remove(thisHash);
                            }
                        }
                        var end = Counter.Snapshot();
                        lastSpeed = end - begin;

                        foreach (var downloadedBlock in downloadedBlocks)
                        {
                            yield return(downloadedBlock);
                        }
                    }
                }
            }
        }