Пример #1
0
 public PeerFindPeer() : base()
 {
     this.Pattern = (s, k, i) => s == PeerOrder.PeerFindPeer;
     this.Apply   = (s, k, i) =>
     {
         var key     = HashKey.ComputeHash(k.ToString());
         var current = (LinkedTo as PeerBehaviors <TKey, TValue>).CurrentPeer;
         Debug.WriteLine(string.Format(CultureInfo.InvariantCulture, "Search Key {0} in {1}", key.ToString(), current.ToString()), "PeerBehavior");
         if (key.CompareTo(current) <= 0)
         {
             // Store here
             i.SendMessage(LinkedActor as IPeerActor <TKey, TValue>);
         }
         else
         {
             // find best peer
             var nextPeer = (LinkedTo as PeerBehaviors <TKey, TValue>).Peers
                            .Where(n => n.Key.CompareTo(current) > 0).OrderBy(n => n.Key).FirstOrDefault();
             if (nextPeer.Key != null)
             {
                 nextPeer.Value.SendMessage(s, k, i);
             }
             else
             {
                 i.SendMessage(LinkedActor as IPeerActor <TKey, TValue>);
             }
         }
     };
 }
Пример #2
0
        public AgentActor()
        {
            Become(new Behavior <IPeerActor <TKey, TValue> >(
                       a =>
            {
                var keys  = a.AskKeys();
                var peers = a.AskPeers();
                // peek key out of centroid
                var key = CenterKey <TKey> .Calc(keys.Result());
                // calc nearest peer
                var orderedPeers = peers.Result().OrderBy(n => n.GetPeerHashKey().ToString());
                var hashKey      = HashKey.ComputeHash(key.ToString());

                foreach (var peer in orderedPeers)
                {
                    if (hashKey.CompareTo(peer.GetPeerHashKey()) > 0)
                    {
                        // deposit
                        // get current K V
                        var result = a.GetNode(key).Result();
                        if (result != null)
                        {
                            // set current K V
                            (peer as IPeerActor <TKey, TValue>).StoreNode(key, result);
                        }
                        break;
                    }
                }
            }));
        }
Пример #3
0
        public override bool Equals(object obj)
        {
            HashKey other = obj as HashKey; //avoid double casting

            if (object.ReferenceEquals(other, null))
            {
                return(false);
            }
            return(this.CompareTo(other) == 0);
        }
Пример #4
0
 public static int Compare(HashKey left, HashKey right)
 {
     if (object.ReferenceEquals(left, right))
     {
         return(0);
     }
     if (object.ReferenceEquals(left, null))
     {
         return(-1);
     }
     return(left.CompareTo(right));
 }
Пример #5
0
        public static TKey Calc(IEnumerable <TKey> keys)
        {
            CheckArg.IEnumerable(keys);
            var dic = new Dictionary <HashKey, TKey>();

            foreach (var k in keys)
            {
                dic[HashKey.ComputeHash(k.ToString())] = k;
            }
            var elected = dic.Keys.OrderBy(h => h.ToString()).FirstOrDefault();

            return(dic[elected]);
        }
Пример #6
0
 public void NewPeer(IPeerActor <TKey, TValue> actor, HashKey hash)
 {
     this.SendMessage(PeerOrder.PeerNewPeer, actor, hash);
 }