/// <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); }
/// <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); }
/// <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); }
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; }
/// <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"); } } }
/// <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); }
/// <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; } } } }
/// <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; } } } }