source: trunk/CrypPlugins/KeySearcher/P2P/Tree/Node.cs @ 1693

Last change on this file since 1693 was 1693, checked in by Paul Lelgemann, 12 years ago

o Work on the distributed KeySearcher cache

File size: 4.6 KB
Line 
1using System;
2using System.Numerics;
3using KeySearcher.Helper;
4using KeySearcher.P2P.Exceptions;
5using KeySearcher.P2P.Storage;
6
7namespace KeySearcher.P2P.Tree
8{
9    class Node : NodeBase
10    {
11        internal bool LeftChildFinished;
12        internal bool RightChildFinished;
13
14        private NodeBase leftChild;
15        private NodeBase rightChild;
16        private bool leftChildReserved;
17        private bool rightChildReserved;
18
19        public Node(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
20            : base(storageHelper, keyQualityHelper, parentNode, @from, to, distributedJobIdentifier)
21        {
22        }
23
24        private void LoadOrUpdateChildNodes()
25        {
26            var middle = (From + To)/2;
27
28            if (!LeftChildFinished)
29            {
30                if (leftChild == null)
31                {
32                    leftChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, From, middle,
33                                                        DistributedJobIdentifier);
34                }
35                else
36                {
37                    StorageHelper.UpdateFromDht(leftChild);
38                }
39            }
40
41            // Only load right node, if the left one is finished or reserved
42            if ((LeftChildFinished || leftChild.IsReserverd()) && !RightChildFinished)
43            {
44                if (rightChild == null)
45                {
46                    rightChild = NodeFactory.CreateNode(StorageHelper, KeyQualityHelper, this, middle + 1, To,
47                                                         DistributedJobIdentifier);
48                }
49                else
50                {
51                    StorageHelper.UpdateFromDht(rightChild);
52                }
53            }
54        }
55
56        public override bool IsCalculated()
57        {
58            return LeftChildFinished && RightChildFinished;
59        }
60
61        public override void Reset()
62        {
63            leftChild = null;
64            rightChild = null;
65        }
66
67        public override void UpdateCache()
68        {
69            LoadOrUpdateChildNodes();
70
71            leftChildReserved = LeftChildFinished || leftChild.IsReserverd();
72            rightChildReserved = RightChildFinished || (rightChild != null && rightChild.IsReserverd());
73        }
74
75        public override Leaf CalculatableLeaf(bool useReservedNodes)
76        {
77            // LoadOrUpdateChildNodes();
78
79            // Left child not finished and not reserved (or reserved leafs are allowed)
80            if (!LeftChildFinished && (!leftChildReserved || useReservedNodes))
81            {
82                return leftChild.CalculatableLeaf(useReservedNodes);
83            }
84
85            if (rightChild == null)
86            {
87                throw new AlreadyCalculatedException();
88            }
89
90            return rightChild.CalculatableLeaf(useReservedNodes);
91        }
92
93        public void ChildFinished(NodeBase childNode)
94        {
95            if (childNode == leftChild)
96            {
97                LeftChildFinished = true;
98                leftChild = null;
99                UpdateCache();
100                return;
101            }
102
103            if (childNode == rightChild)
104            {
105                RightChildFinished = true;
106                rightChild = null;
107                UpdateCache();
108                return;
109            }
110        }
111
112        public override bool IsReserverd()
113        {
114            // LoadOrUpdateChildNodes();
115
116            // var leftChildFinishedOrReserved = LeftChildFinished || leftChildReserved;
117
118            if (LeftChildFinished && !RightChildFinished)
119            {
120                return rightChildReserved;
121            }
122
123            if (!LeftChildFinished && RightChildFinished)
124            {
125                return leftChildReserved;
126            }
127
128            if (!LeftChildFinished && !RightChildFinished && rightChildReserved)
129            {
130                return leftChildReserved;
131            }
132
133            return rightChildReserved;
134            /*
135            if (leftChildFinishedOrReserved && !RightChildFinished)
136            {
137                return rightChildReserved;
138            }
139
140            return !LeftChildFinished && leftChildReserved;*/
141        }
142
143        public override string ToString()
144        {
145            return base.ToString() + ", LeftChildFinished " + LeftChildFinished + ",  RightChildFinished " +
146                   RightChildFinished;
147        }
148    }
149}
Note: See TracBrowser for help on using the repository browser.