Beispiel #1
0
        public override Task <StateSyncBatch?> PrepareRequest()
        {
            StateSyncBatch?request;

            lock (_requestedNodes)
            {
                if (_requestedNodes.Count == 0)
                {
                    return(Task.FromResult((StateSyncBatch?)null));
                }

                StateSyncItem[] requestedNodes;
                if (_requestedNodes.Count < StateSyncFeed.MaxRequestSize)
                {
                    // do not make it state sync item :)
                    requestedNodes = _requestedNodes.Select(n => new StateSyncItem(n, NodeDataType.State)).ToArray();
                    _requestedNodes.Clear();
                }
                else
                {
                    Keccak[] source = _requestedNodes.ToArray();
                    requestedNodes = new StateSyncItem[StateSyncFeed.MaxRequestSize];
                    _requestedNodes.Clear();
                    for (int i = 0; i < source.Length; i++)
                    {
                        if (i < StateSyncFeed.MaxRequestSize)
                        {
                            // not state sync item
                            requestedNodes[i] = new StateSyncItem(source[i], NodeDataType.State);
                        }
                        else
                        {
                            _requestedNodes.Add(source[i]);
                        }
                    }
                }

                request            = new StateSyncBatch(requestedNodes);
                request.ConsumerId = FeedId;
            }

            Interlocked.Increment(ref Metrics.BeamedRequests);
            return(Task.FromResult <StateSyncBatch?>(request));
        }
 private static void BuildRequestAndHandleResponse(TrieNode node, StateSyncBatch stateSyncBatch, StateSyncFeed stateSyncFeed)
 {
     stateSyncBatch.Responses = new[] { node.FullRlp };
     stateSyncFeed.HandleResponse(stateSyncBatch);
 }