コード例 #1
0
        /// <summary>
        /// Removes a client with key nick
        /// </summary>
        /// <param name="nick"></param>
        /// <param name="url"></param>
        public void removeClient(string url)
        {
            UInt64 clientID = ParticipantID.get(url, BINARY_KEY_LENGTH);
            string retURL   = "";

            if (mClients.TryRemove(clientID, out retURL))
            {
                System.Console.WriteLine("Client removed: " + url);
                return;
            }

            System.Console.WriteLine("Client not found for url " + url);
        }
コード例 #2
0
        /// <summary>
        /// Removes a server with key nick
        /// </summary>
        /// <param name="nick"> The nickname of the server to be removed </param>
        public void removeServer(string url)
        {
            UInt64 serverID = ParticipantID.get(url, BINARY_KEY_LENGTH);
            string retURL   = "";

            if (mServers.TryRemove(serverID, out retURL))
            {
                System.Console.WriteLine("Server removed: " + url);
                return;
            }

            System.Console.WriteLine("Server not found for url " + url);
        }
コード例 #3
0
ファイル: NodeRouter.cs プロジェクト: sanchaz/PADITable
 /// <summary>
 /// Checks if the server is responsible for some key which it was not supposed to be
 /// </summary>
 /// <param name="key"></param>
 /// <returns></returns>
 public string needUpdate(string key)
 {
     if (mServers.Count > 1)
     {
         //System.Console.WriteLine("INSIDE NEED UPDATE");
         UInt64 serverKey   = ParticipantID.get(key, BINARY_KEY_LENGTH); //CHANGED LINE
         int    serverCount = mServers.Count;
         for (int i = 0; i < mServers.Count; i++)
         {
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR");
             //The third element before this one
             int serverIndex = ((i - 3) > 0) ? ((i - 3) % serverCount) : (((i - 3) % serverCount) + serverCount);
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 1");
             //The second element before this one
             int serverIndex1 = ((i - 2) > 0) ? ((i - 2) % serverCount) : (((i - 2) % serverCount) + serverCount);
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 2");
             //The first element before this one
             int serverIndex2 = ((i - 1) > 0) ? ((i - 1) % serverCount) : (((i - 1) % serverCount) + serverCount);
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 3");
             //Check if it has some key which belongs to the server before the one this replicates
             if (serverCount == 2 && (mServers.ElementAt(i).Key == mID) && (serverKey > mID))
             {
                 return(mServers[mThisIsReplicaOf]);
             }                                                                                                                       //CHANGED LINE
             if ((i == 1) && (mServers.ElementAt(i).Key == mID) && (serverKey > mServers.ElementAt(serverIndex1).Key))
             {
                 //System.Console.WriteLine("S INSIDE NEED UPDATE");
                 return(mServers.ElementAt(serverIndex2).Value);
             }
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 5");
             //Check if it has some key which is to be replicated now to the server just before him
             if ((mServers.ElementAt(i).Key == mID) && (serverKey > mServers.ElementAt(serverIndex).Key) &&
                 (serverKey <= mServers.ElementAt(serverIndex1).Key))
             {
                 //System.Console.WriteLine("S INSIDE NEED UPDATE");
                 return(mServers.ElementAt(serverIndex1).Value);
             }
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 6");
             if ((mServers.ElementAt(i).Key == mID) && (serverKey > mServers.ElementAt(serverIndex1).Key) &&
                 (serverKey <= mServers.ElementAt(serverIndex2).Key))
             {
                 //System.Console.WriteLine("S INSIDE NEED UPDATE");
                 return(mServers.ElementAt(serverIndex2).Value);
             }
             //System.Console.WriteLine("INSIDE NEED UPDATE FOR 4");
         }
         //System.Console.WriteLine("S INSIDE NEED UPDATE");
         return(null);
     }
     return(null);
 }
コード例 #4
0
ファイル: NodeRouter.cs プロジェクト: sanchaz/PADITable
        public NodeRouter(string url, KeyManager kManager, Server server)
        {
            mClients            = new Dictionary <UInt64, string>();
            mServers            = new Dictionary <UInt64, string>();
            mURL                = url;
            mServer             = server;
            thisReplicaObject   = new Object();
            thisIsReplicaObject = new Object();

            mID = ParticipantID.get(url, BINARY_KEY_LENGTH);
            System.Console.WriteLine("MID ------- " + mID);

            mKeyManager = kManager;
        }
コード例 #5
0
ファイル: NodeRouter.cs プロジェクト: sanchaz/PADITable
        /// <summary>
        /// Returns the server to which we send the message
        /// </summary>
        /// <param name="key">The key we want to execute a put or get operation</param>
        /// <returns></returns>
        public string getServerToSend(string key)
        {
            lock (mServers)
            {
                if ((mServers != null) && mServers.Count > 0)
                {
                    UInt64 serverKey = ParticipantID.get(key, BINARY_KEY_LENGTH);
                    System.Console.WriteLine("SERVERKEY " + key + " " + serverKey);
                    foreach (UInt64 skey in mServers.Keys)
                    {
                        System.Console.WriteLine("SERVER KEY - " + skey + " " + mServers[skey]);
                    }
                    //Retornar server consoante valor achado
                    string serverURL;

                    if (mServers.TryGetValue(serverKey, out serverURL))
                    {
                        return(serverURL);
                    }

                    System.Console.WriteLine("No server found with key equals to key computed using the key for the operation: " + serverKey);

                    for (int i = 0; i < mServers.Count; i++)
                    {
                        if ((i == 0) && ((serverKey > mServers.ElementAt(mServers.Count - 1).Key) ||
                                         (serverKey <= mServers.ElementAt(i).Key)))
                        {
                            System.Console.WriteLine("RETURNING  " + mServers.ElementAt(i).Value); return(mServers.ElementAt(i).Value);
                        }
                        else if ((i != 0) && (serverKey > mServers.ElementAt(i - 1).Key) && (serverKey <= mServers.ElementAt(i).Key))
                        {
                            System.Console.WriteLine("RETURNING  " + mServers.ElementAt(i).Value); return(mServers.ElementAt(i).Value);
                        }
                    }

                    System.Console.WriteLine("RETURNING LAST " + mServers.ElementAt(mServers.Count - 1).Value);
                    return(mServers.ElementAt(mServers.Count - 1).Value);
                }
                else
                {
                    System.Console.WriteLine("RegisterManager: getServerToSend, empty list of servers");
                    throw new RemoteException("Empty list of servers");
                }
            }
        }
コード例 #6
0
ファイル: NodeRouter.cs プロジェクト: sanchaz/PADITable
        /// <summary>
        /// Checks if the server has some key which it should not be responsible for at a moment
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool keyBelongsToServer(string key)
        {
            UInt64 serverKey = ParticipantID.get(key, BINARY_KEY_LENGTH);

            System.Console.WriteLine("serverKey " + key + " " + serverKey);
            if (mServers.Count == 1)
            {
                return(true);
            }
            if ((mServers.ElementAt(0).Key == mID) && ((serverKey > mThisIsReplicaOf) ||
                                                       (serverKey <= mID)))
            {
                return(true);
            }
            else if ((serverKey > mThisIsReplicaOf) && (serverKey <= mID))
            {
                return(true);
            }
            return(false);
        }
コード例 #7
0
        /// <summary>
        /// Add a server to the list of servers which the central directory knows
        /// </summary>
        /// <param name="nick"></param>
        /// <param name="url"></param>
        public void addServer(string url)
        {
            UInt64 serverID = ParticipantID.get(url, BINARY_KEY_LENGTH);

            if (mServers.TryAdd(serverID, url))
            {
                System.Console.WriteLine("Server added " + url + " " + serverID);
            }
            else
            {
                while (true)
                {
                    serverID = (serverID + 1) % ((UInt64)Math.Pow(2.0, BINARY_KEY_LENGTH));
                    if (mServers.TryAdd(serverID, url))
                    {
                        System.Console.WriteLine("Server added " + url + " " + serverID);
                        break;
                    }
                }
            }
        }
コード例 #8
0
        /// <summary>
        /// Adds a client to the list of clients which the central directory knows.
        /// </summary>
        /// <param name="nick"> nickname of the client </param>
        /// <param name="url"> url to get the client </param>
        public void addClient(string url)
        {
            UInt64 clientID = ParticipantID.get(url, BINARY_KEY_LENGTH);

            if (mClients.TryAdd(clientID, url))
            {
                System.Console.WriteLine("Client added " + url + " " + clientID);
                return;
            }
            else
            {
                while (true)
                {
                    clientID++;
                    if (mClients.TryAdd(clientID, url))
                    {
                        System.Console.WriteLine("Client added " + url + " " + clientID);
                        break;
                    }
                }
            }
        }