source: trunk/CrypPlugins/KeySearcher/P2P/Tree/NodeBase.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.2 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;
8using KeySearcher.P2P.Storage;
9
10namespace KeySearcher.P2P.Tree
11{
12    abstract class NodeBase
13    {
14        protected internal readonly BigInteger From;
15        protected internal readonly BigInteger To;
16        protected internal readonly string DistributedJobIdentifier;
17        protected readonly StorageHelper StorageHelper;
18        protected readonly KeyQualityHelper KeyQualityHelper;
19
20        protected internal DateTime LastUpdate;
21
22        public readonly Node ParentNode;
23        public LinkedList<KeySearcher.ValueKey> Result;
24
25        protected NodeBase(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
26        {
27            StorageHelper = storageHelper;
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            StorageHelper.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 = StorageHelper.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            ParentNode.UpdateCache();
59
60            if (StorageHelper.RetrieveWithStatistic(StorageHelper.KeyInDht(this)).Status == RequestResultType.KeyNotFound)
61            {
62                throw new ReservationRemovedException("Before updating parent node, this leaf's reservation was deleted.");
63            }
64
65            var updateResult = StorageHelper.UpdateInDht(ParentNode);
66            if (!updateResult.IsSuccessful())
67            {
68                throw new UpdateFailedException("Parent node could not be updated: " + updateResult.Status);
69            }
70
71            StorageHelper.RemoveWithStatistic(StorageHelper.KeyInDht(this));
72
73            if (ParentNode.IsCalculated())
74            {
75                ParentNode.UpdateDht();
76            }
77        }
78
79        private void IntegrateResultsIntoParent()
80        {
81            var bestValue = double.MinValue;
82            if (ParentNode.Result.Count > 0)
83            {
84                bestValue = ParentNode.Result.First.Value.value;
85            }
86
87            var revertedResults = new LinkedList<KeySearcher.ValueKey>();
88            foreach (var valueKey in Result)
89            {
90                revertedResults.AddFirst(valueKey);
91            }
92
93            foreach (var valueKey in revertedResults)
94            {
95                if (!KeyQualityHelper.IsBetter(valueKey.value, bestValue)) continue;
96
97                if (ParentNode.Result.Contains(valueKey)) continue;
98
99                ParentNode.Result.AddFirst(valueKey);
100                bestValue = valueKey.value;
101
102                if (ParentNode.Result.Count > 10)
103                {
104                    ParentNode.Result.RemoveLast();
105                }
106            }
107        }
108
109        private void UpdateDhtForRootNode()
110        {
111            StorageHelper.UpdateFromDht(this, true);
112            StorageHelper.UpdateInDht(this);
113        }
114
115        public abstract bool IsReserverd();
116
117        public abstract Leaf CalculatableLeaf(bool useReservedNodes);
118
119        public abstract bool IsCalculated();
120
121        public abstract void Reset();
122
123        public abstract void UpdateCache();
124
125        public override string ToString()
126        {
127            return "NodeBase " + GetType() + ", from " + From + " to " + To;
128        }
129    }
130}
Note: See TracBrowser for help on using the repository browser.