public void accessCriticalSection() { if (!(wantsToEnterCriticalSection() && isReady())) { return; } if (requestToCriticalSectionSend) { return; } requestToCriticalSectionSend = true; writeToLog("I want enter Critical Section"); if (clients.Count == 0) { writeToLog("Entering critical section because no nodes to notify"); enteredCriticalSection(); return; } foreach (var client in clients) { client.Value.ackCriticalSection = false; } CriticalRequest newRequest = new CriticalRequest(++lamportCounter, stringId); newRequest.ackSend = true; addRequestToQueue(newRequest); MessageLIS message = new MessageLIS('L', ""); message.setLamportCounter(lamportCounter); sendMessageToAll(message); }
private void sendACKToNextNode() { if (!criticalRequests.Any()) //Empty { return; } CriticalRequest request = criticalRequests.ElementAt(0); if (request.ackSend == false) // Should be received message { writeToLog(string.Format("CS Access granted from me to node {0} ({1}) ", request.stringId, request.counter)); request.ackSend = true; clients[request.stringId].sendMessage(new MessageLIS('A', "")); //Acknowledge CS } }
public void accessCriticalSection() { if (!(wantsToEnterCriticalSection() && isReady())) return; if (requestToCriticalSectionSend) return; requestToCriticalSectionSend = true; writeToLog("I want enter Critical Section"); if(clients.Count == 0) { writeToLog("Entering critical section because no nodes to notify"); enteredCriticalSection(); return; } foreach (var client in clients) { client.Value.ackCriticalSection = false; } CriticalRequest newRequest = new CriticalRequest(++lamportCounter, stringId); newRequest.ackSend = true; addRequestToQueue(newRequest); MessageLIS message = new MessageLIS('L', ""); message.setLamportCounter(lamportCounter); sendMessageToAll(message); }
private void addRequestToQueue(CriticalRequest request) { writeToLog("Added new CriticalRequest to queue " + request.stringId + " " + "(" + request.counter + ")"); criticalRequests.Add(request); criticalRequests = criticalRequests.OrderByDescending(c => c.counter).ThenBy(c => c.stringId).ToList();//.ThenBy(c => c.ackSend); }
/* Lamport A = Ack CS F = Release CS L = Lamport Request CS Nodes manipulation C = Conf recieved D = Remove node K = Connect to known node J = Join request N = new client to connect Files manipulation T = file request */ public void receivedMessage(MessageLIS message) { System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => { //writeToLog("Recieved message:" + message.messageType); ClientConnection client; if (clients.ContainsKey(message.stringId)) client = clients[message.stringId]; else if (clientsToConnect.ContainsKey(message.stringId)) client = clientsToConnect[message.stringId]; else { writeToLog("Recieved message from unknown node !!!" + message.stringId); return; } if (message.messageType == 'J') // RequestJoin { writeToLog("New client wants to join " + message.messageData); client.requestedToJoin = true; client.stringId = message.messageData; } else if (message.messageType == 'K') { writeToLog("New clients wants to only connect " + message.messageData); client.stringId = message.messageData; clientsToConnect.Remove(message.stringId); addClient(client); waitingForConnectionsNumber--; } else if (message.messageType == 'C') // Configuration { writeToLog("Recieved configuration - "+ message.messageData); var configs = message.messageData.Split('|'); lamportCounter = int.Parse(configs[0]); waitingForConnectionsNumber += configs[1].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Length; } else if (message.messageType == 'N') // New client to connect { var connectionInfo = message.messageData.Split(':'); writeToLog("Connecting to NODE " + message.messageData); addNewClientConnection(connectionInfo[0], int.Parse(connectionInfo[1]), true); } else if (message.messageType == 'D') { writeToLog("Removing NODE (D) " + message.messageData); removeClient(message.messageData); } else if (message.messageType == 'L') // Lamport Request CS { writeToLog(string.Format("CS Requested {0} ({1})", message.stringId, message.getLamportCounter())); CriticalRequest newRequest = new CriticalRequest(message.getLamportCounter(), message.stringId); addRequestToQueue(newRequest); lamportCounter = Math.Max(lamportCounter, message.getLamportCounter()); } else if (message.messageType == 'A') // Acknowledged CS { writeToLog(string.Format("CS Access granted to me from {0}", message.stringId)); client.ackCriticalSection = true; //criticalRequests.Find() } else if (message.messageType == 'F') // Release CS { writeToLog(string.Format("CS Released {0} ", message.stringId)); criticalRequests.RemoveAll(c => c.stringId == message.stringId); /*int requestIndex = criticalRequests.FindIndex(c => c.stringId == message.stringId); if(requestIndex >= 0) { criticalRequests.RemoveAt(requestIndex); }*/ } else if (message.messageType == 'T') // Transfer File (Text Only) { writeToLog(string.Format("File recieved " + message.messageData)); string[] conf = message.messageData.Split(new char[] { '|' }, 3); var path = Path.Combine(folderPath, conf[1]); try { if (conf[0] == "D") { //Delete file File.Move(path, path + myExtension); File.Delete(path + myExtension); } else { //watcher.EnableRaisingEvents = false; if (File.Exists(path)) File.Delete(path + myExtension); File.WriteAllText(path+myExtension, conf[2]); if(File.Exists(path)) { File.Move(path, path + ".todelete" + myExtension); File.Delete(path + ".todelete" + myExtension); } File.Move(path + myExtension, path); //watcher.EnableRaisingEvents = true; } } catch (Exception ex) { writeToLog(ex.ToString()); } } checkActions(); })); }
/* * Lamport * A = Ack CS * F = Release CS * L = Lamport Request CS * * * Nodes manipulation * C = Conf recieved * D = Remove node * K = Connect to known node * J = Join request * N = new client to connect * * Files manipulation * T = file request */ public void receivedMessage(MessageLIS message) { System.Windows.Application.Current.Dispatcher.Invoke(new Action(() => { //writeToLog("Recieved message:" + message.messageType); ClientConnection client; if (clients.ContainsKey(message.stringId)) { client = clients[message.stringId]; } else if (clientsToConnect.ContainsKey(message.stringId)) { client = clientsToConnect[message.stringId]; } else { writeToLog("Recieved message from unknown node !!!" + message.stringId); return; } if (message.messageType == 'J') // RequestJoin { writeToLog("New client wants to join " + message.messageData); client.requestedToJoin = true; client.stringId = message.messageData; } else if (message.messageType == 'K') { writeToLog("New clients wants to only connect " + message.messageData); client.stringId = message.messageData; clientsToConnect.Remove(message.stringId); addClient(client); waitingForConnectionsNumber--; } else if (message.messageType == 'C') // Configuration { writeToLog("Recieved configuration - " + message.messageData); var configs = message.messageData.Split('|'); lamportCounter = int.Parse(configs[0]); waitingForConnectionsNumber += configs[1].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Length; } else if (message.messageType == 'N') // New client to connect { var connectionInfo = message.messageData.Split(':'); writeToLog("Connecting to NODE " + message.messageData); addNewClientConnection(connectionInfo[0], int.Parse(connectionInfo[1]), true); } else if (message.messageType == 'D') { writeToLog("Removing NODE (D) " + message.messageData); removeClient(message.messageData); } else if (message.messageType == 'L') // Lamport Request CS { writeToLog(string.Format("CS Requested {0} ({1})", message.stringId, message.getLamportCounter())); CriticalRequest newRequest = new CriticalRequest(message.getLamportCounter(), message.stringId); addRequestToQueue(newRequest); lamportCounter = Math.Max(lamportCounter, message.getLamportCounter()); } else if (message.messageType == 'A') // Acknowledged CS { writeToLog(string.Format("CS Access granted to me from {0}", message.stringId)); client.ackCriticalSection = true; //criticalRequests.Find() } else if (message.messageType == 'F') // Release CS { writeToLog(string.Format("CS Released {0} ", message.stringId)); criticalRequests.RemoveAll(c => c.stringId == message.stringId); /*int requestIndex = criticalRequests.FindIndex(c => c.stringId == message.stringId); * if(requestIndex >= 0) * { * criticalRequests.RemoveAt(requestIndex); * }*/ } else if (message.messageType == 'T') // Transfer File (Text Only) { writeToLog(string.Format("File recieved " + message.messageData)); string[] conf = message.messageData.Split(new char[] { '|' }, 3); var path = Path.Combine(folderPath, conf[1]); try { if (conf[0] == "D") { //Delete file File.Move(path, path + myExtension); File.Delete(path + myExtension); } else { //watcher.EnableRaisingEvents = false; if (File.Exists(path)) { File.Delete(path + myExtension); } File.WriteAllText(path + myExtension, conf[2]); if (File.Exists(path)) { File.Move(path, path + ".todelete" + myExtension); File.Delete(path + ".todelete" + myExtension); } File.Move(path + myExtension, path); //watcher.EnableRaisingEvents = true; } } catch (Exception ex) { writeToLog(ex.ToString()); } } checkActions(); })); }