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); }