void handle_ST_DATA_FETCH() { rootBackoff = ROOT_BACKOFF; long totalOrderedNodes = 0; long totalOrderedLeaves = 0; while ((PendingNodesToBeFetched.Count > 0) && (totalOrderedNodes < Common.LSYNC_MAX_ORDERED_NODES) && (totalOrderedLeaves < Common.LSYNC_MAX_ORDERED_LEAVES)) { NodeDataEntity nde = PendingNodesToBeFetched.Dequeue(); if (nde.LeafCount <= Common.LSYNC_MAX_LEAVES_TO_FETCH) { // Fetch all nodes below List<NodeSocketData> nsds; // A single random trusted node is okay for fetching data. if (nodeConfig.GetRandomTrustedNode(out nsds, 1)) { AllLeafDataRequest aldr = new AllLeafDataRequest(nde); NetworkPacket request = new NetworkPacket(nodeConfig.PublicKey, PacketType.TPT_LSYNC_LEAF_REQUEST_ALL, aldr.Serialize(), TNetUtils.GenerateNewToken()); networkPacketSwitch.AddToQueue(nsds[0].PublicKey, request); totalOrderedLeaves += aldr.TotalRequestedLeaves; } // DebugPrint("Fetch Normal All Nodes Below", DisplayType.ImportantInfo); } else { // Fetch selective nodes //DebugPrint("Fetch Selective Nodes", DisplayType.ImportantInfo); ListTreeNode currentNode; if (LedgerTree.TraverseToNode(nde.AddressNibbles, out currentNode) == TraverseResult.Success) { if (currentNode.Hash != nde.NodeHash) { for (int i = 0; i < 16; i++) { Hash remoteChildHash = nde.Children[i]; ListTreeNode currentChild = currentNode.Children[i]; if (NodeFetchQueue.Count > Common.LSYNC_MAX_PENDING_QUEUE_LENGTH) break; if (remoteChildHash != null) { if (currentChild == null) { FetchRemoteNode(nde.AddressNibbles, (byte)i); totalOrderedNodes++; } else { if (remoteChildHash != currentChild.Hash) { FetchRemoteNode(nde.AddressNibbles, (byte)i); totalOrderedNodes++; } } } else { //DebugPrint("REMOTE NULL !!", DisplayType.ImportantInfo); // HANDLE CASE FOR THE REMOTE HAVING NO NODE WHEN WE HAVE // VERIFY WITH OTHERS AND DELETE // ONLY NEEDED IF THE TRUSTED NODES ARE SENDING BAD DATA // SHOULD BE IMPLEMENTED BEFORE FINAL NETWORK COMPLETION } } } } else { // ORDER ALL NODES BELOW. Probably in the initial condition. for (int i = 0; i < 16; i++) { FetchRemoteNode(nde.AddressNibbles, (byte)i); totalOrderedNodes++; } } } } ProcessPendingRemoteFetches(); if (PendingNodesToBeFetched.Count == 0) LedgerState = LedgerSyncStateTypes.ST_GOOD; }
void HandleLeafRequestAll(NetworkPacket packet) { AllLeafDataRequest aldr = new AllLeafDataRequest(); aldr.Deserialize(packet.Data); // DebugPrint("LEAF REQUEST All : " + aldr.TotalRequestedLeaves + " NODES : " + packet.Data.Length + " Bytes", DisplayType.ImportantInfo); if (aldr.TotalRequestedLeaves <= Common.LSYNC_MAX_LEAVES_TO_FETCH) { ListTreeNode node; if (LedgerTree.TraverseToNode(aldr.AddressNibbles, out node) == TraverseResult.Success) { List<LeafDataType> leaves = new List<LeafDataType>(); LedgerTree.GetAllLeavesUnderNode(Common.LSYNC_MAX_LEAVES_TO_FETCH, node, ref leaves); LeafAccountDataResponse ladr = new LeafAccountDataResponse(); foreach (LeafDataType ldt in leaves) { AccountInfo ai = (AccountInfo)ldt; ladr.Add(ai); } NetworkPacket response = new NetworkPacket(nodeConfig.PublicKey, PacketType.TPT_LSYNC_LEAF_RESPONSE, ladr.Serialize(), packet.Token); networkPacketSwitch.AddToQueue(packet.PublicKeySource, response); //DebugPrint("SENT LEAF RESPONSE : " + ladr.LeafCount + " Leaves ... " + response.Data.Length + " Bytes", DisplayType.CodeAssertionFailed); } } }