Example #1
0
        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;
        }
Example #2
0
        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);
                }
            }
        }