예제 #1
0
        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);
        }
예제 #2
0
        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
            }
        }
예제 #3
0
        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);
        }
예제 #4
0
 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);
 }
예제 #5
0
        /*
            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();
            }));
        }
예제 #6
0
 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);
 }
예제 #7
0
        /*
         *  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();
            }));
        }