source: trunk/CrypPlugins/KeySearcher/P2P/Tree/NodeBase.cs @ 2152

Last change on this file since 2152 was 2144, checked in by nolte, 11 years ago

Set mark for the dictionary update

File size: 4.6 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        //Wanted: String Avatarname = ???;
26        //public Dictionary<String, Dictionary<long, int>> Activity;
27        //------------------------------------------------------------
28
29        protected NodeBase(StorageHelper storageHelper, KeyQualityHelper keyQualityHelper, Node parentNode, BigInteger @from, BigInteger to, string distributedJobIdentifier)
30        {
31            StorageHelper = storageHelper;
32            KeyQualityHelper = keyQualityHelper;
33            ParentNode = parentNode;
34            From = @from;
35            To = to;
36            DistributedJobIdentifier = distributedJobIdentifier;
37
38            LastUpdate = DateTime.MinValue;
39            Result = new LinkedList<KeySearcher.ValueKey>();
40
41            StorageHelper.UpdateFromDht(this);
42        }
43
44        protected void UpdateDht()
45        {
46            // If this instance is the root node, we need a special handling
47            if (ParentNode == null)
48            {
49                UpdateDhtForRootNode();
50                return;
51            }
52
53            // Compare with refreshed parent node
54            var result = StorageHelper.UpdateFromDht(ParentNode, true);
55            if (!result.IsSuccessful())
56            {
57                throw new UpdateFailedException("Parent node could not be updated: " + result.Status);
58            }
59
60            IntegrateResultsIntoParent();
61            ParentNode.ChildFinished(this);
62            ParentNode.UpdateCache();
63
64            // TODO add check, if we retrieved our lock (e.g. by comparing the lock date or the future client identifier
65            if (StorageHelper.RetrieveWithStatistic(StorageHelper.KeyInDht(this)).Status == RequestResultType.KeyNotFound)
66            {
67                throw new ReservationRemovedException("Before updating parent node, this leaf's reservation was deleted.");
68            }
69
70            var updateResult = StorageHelper.UpdateInDht(ParentNode);
71            if (!updateResult.IsSuccessful())
72            {
73                throw new UpdateFailedException("Parent node could not be updated: " + updateResult.Status);
74            }
75
76            StorageHelper.RemoveWithStatistic(StorageHelper.KeyInDht(this));
77
78            if (ParentNode.IsCalculated())
79            {
80                ParentNode.UpdateDht();
81            }
82        }
83
84        private void IntegrateResultsIntoParent()
85        {
86            var bestValue = double.MinValue;
87            if (ParentNode.Result.Count > 0)
88            {
89                bestValue = ParentNode.Result.First.Value.value;
90            }
91
92            var revertedResults = new LinkedList<KeySearcher.ValueKey>();
93            foreach (var valueKey in Result)
94            {
95                revertedResults.AddFirst(valueKey);
96            }
97
98            foreach (var valueKey in revertedResults)
99            {
100                if (!KeyQualityHelper.IsBetter(valueKey.value, bestValue)) continue;
101
102                if (ParentNode.Result.Contains(valueKey)) continue;
103
104                ParentNode.Result.AddFirst(valueKey);
105                bestValue = valueKey.value;
106
107                if (ParentNode.Result.Count > 10)
108                {
109                    ParentNode.Result.RemoveLast();
110                }
111            }
112            //TODO Dictionary update into parentnode
113        }
114
115        private void UpdateDhtForRootNode()
116        {
117            StorageHelper.UpdateFromDht(this, true);
118            StorageHelper.UpdateInDht(this);
119        }
120
121        public abstract bool IsReserved();
122
123        public abstract Leaf CalculatableLeaf(bool useReservedNodes);
124
125        public abstract bool IsCalculated();
126
127        public abstract void Reset();
128
129        public abstract void UpdateCache();
130
131        public override string ToString()
132        {
133            return "NodeBase " + GetType() + ", from " + From + " to " + To;
134        }
135    }
136}
Note: See TracBrowser for help on using the repository browser.