source: trunk/CrypPlugins/KeySearcher/P2P/Nodes/NodeBase.cs @ 1665

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

+ CrypP2P: Return types of synchronous methods Store/Retrieve/Remove changed
o Work on the distributed KeySearcher

File size: 4.1 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Numerics;
4using Cryptool.P2P;
5using Cryptool.P2P.Internal;
6using KeySearcher.Helper;
7using KeySearcher.P2P.Exceptions;
8
9namespace KeySearcher.P2P.Nodes
10{
11    abstract class NodeBase
12    {
13        protected internal readonly BigInteger From;
14        protected internal readonly BigInteger To;
15        protected internal readonly string DistributedJobIdentifier;
16        protected readonly P2PHelper P2PHelper;
17        protected readonly KeyQualityHelper KeyQualityHelper;
18
19        protected internal DateTime LastUpdate;
20        protected internal RequestResultType LastUpdateResult;
21
22        public readonly Node ParentNode;
23        public LinkedList<KeySearcher.ValueKey> Result;
24
25        protected NodeBase(P2PHelper p2PHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
26        {
27            P2PHelper = p2PHelper;
28            KeyQualityHelper = keyQualityHelper;
29            ParentNode = parentNode;
30            From = @from;
31            To = to;
32            DistributedJobIdentifier = distributedJobIdentifier;
33
34            LastUpdate = DateTime.MinValue;
35            Result = new LinkedList<KeySearcher.ValueKey>();
36
37            P2PHelper.UpdateFromDht(this);
38        }
39
40        protected void UpdateDht()
41        {
42            // If this instance is the root node, we need a special handling
43            if (ParentNode == null)
44            {
45                UpdateDhtForRootNode();
46                return;
47            }
48
49            // Compare with refreshed parent node
50            var result = P2PHelper.UpdateFromDht(ParentNode, true);
51            if (!result.IsSuccessful())
52            {
53                throw new UpdateFailedException("Parent node could not be updated: " + result.Status);
54            }
55
56            IntegrateResultsIntoParent();
57            ParentNode.ChildFinished(this);
58
59            if (P2PManager.Retrieve(P2PHelper.KeyInDht(this)).Status == RequestResultType.KeyNotFound)
60            {
61                throw new ReservationRemovedException("Before updating parent node, this leaf's reservation was deleted.");
62            }
63
64            var updateResult = P2PHelper.UpdateInDht(ParentNode);
65            if (!updateResult.IsSuccessful())
66            {
67                throw new UpdateFailedException("Parent node could not be updated: " + updateResult.Status);
68            }
69
70            P2PManager.Remove(P2PHelper.KeyInDht(this));
71
72            if (ParentNode.IsCalculated())
73            {
74                ParentNode.UpdateDht();
75            }
76        }
77
78        private void IntegrateResultsIntoParent()
79        {
80            var bestValue = double.MinValue;
81            if (ParentNode.Result.Count > 0)
82            {
83                bestValue = ParentNode.Result.First.Value.value;
84            }
85
86            var revertedResults = new LinkedList<KeySearcher.ValueKey>();
87            foreach (var valueKey in Result)
88            {
89                revertedResults.AddFirst(valueKey);
90            }
91
92            foreach (var valueKey in revertedResults)
93            {
94                if (!KeyQualityHelper.IsBetter(valueKey.value, bestValue)) continue;
95
96                if (ParentNode.Result.Contains(valueKey)) continue;
97
98                ParentNode.Result.AddFirst(valueKey);
99                bestValue = valueKey.value;
100
101                if (ParentNode.Result.Count > 10)
102                {
103                    ParentNode.Result.RemoveLast();
104                }
105            }
106        }
107
108        private void UpdateDhtForRootNode()
109        {
110            P2PHelper.UpdateFromDht(this, true);
111            P2PHelper.UpdateInDht(this);
112        }
113
114        public abstract bool IsReserverd();
115
116        public abstract Leaf CalculatableLeaf(bool useReservedNodes);
117
118        public abstract bool IsCalculated();
119
120        public abstract void Reset();
121
122        public override string ToString()
123        {
124            return "NodeBase " + GetType() + ", from " + From + " to " + To;
125        }
126    }
127}
Note: See TracBrowser for help on using the repository browser.