コード例 #1
0
        public CrashedReplicaPMACK RemoveCrashedReplica_aux(CrashedReplicaPM request)
        {
            //propagate to each server
            foreach (Server s in servList)
            {
                CrashedReplicaServer crashed_replica = new CrashedReplicaServer();
                crashed_replica.Partitionid = request.Partitionid;
                foreach (String serv_id in request.Serverid)
                {
                    crashed_replica.Serverid.Add(serv_id);
                }
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                GrpcChannel channel = GrpcChannel.ForAddress(s.getURL());
                var         serv    = new GStoreServices.GStoreServicesClient(channel);
                serv.RemoveCrashedReplica(crashed_replica);
            }

            //propagate to each client
            foreach (Client c in cliList)
            {
                CrashedReplicaClient crashed_replica = new CrashedReplicaClient();
                crashed_replica.Partitionid = request.Partitionid;
                foreach (String serv_id in request.Serverid)
                {
                    crashed_replica.Serverid.Add(serv_id);
                }
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
                var         client  = new ClientServices.ClientServicesClient(channel);
                client.RemoveCrashedReplicaClient(crashed_replica);
            }
            return(new CrashedReplicaPMACK {
            });
        }
コード例 #2
0
        public NewLeaderACK UpdateLeader_aux(NewLeader request)
        {
            string partition_id = request.Partid;
            string leader_id    = request.Leaderid;
            int    pos_partlist = -1;
            int    pos_servlist = -1;

            //iterate over partition and update
            foreach (Partition p in partList)
            {
                pos_partlist = pos_partlist + 1;
                if (p.getName() == partition_id)
                {
                    //partition to update
                    foreach ((string server, bool is_master) in p.getServIDs())
                    {
                        pos_servlist = pos_servlist + 1;
                        if (server == leader_id)
                        {
                            goto UpdateLead;
                        }
                    }
                }
            }
UpdateLead:
            partList.ElementAt(pos_partlist).getServIDs().RemoveAt(pos_servlist);
            partList.ElementAt(pos_partlist).getServIDs().Add((leader_id, true));
            Console.WriteLine($"Puppet Master updated leader {leader_id} at partition {partition_id}");

            //propagate this change to clients
            Console.WriteLine("PuppetMaster is sending the update leader to the clients...");
            foreach (Client c in this.cliList)
            {
                //do client to server and propagate
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
                var         client  = new ClientServices.ClientServicesClient(channel);
                client.UpdateLeaderClient(new LeaderInfo
                {
                    Partitionid = partition_id,
                    Leaderid    = leader_id
                });
            }

            return(new NewLeaderACK {
            });
        }
コード例 #3
0
        private void sendPartitionToClient(string user_id)
        {
            Console.WriteLine("Sending partitions to the clients");
            var complete_partition = new CompletePartitionClient();

            foreach (Partition p in this.partList)
            {
                var part = new PartitionInfoClient();
                part.Partitionid = p.getName();
                foreach ((string s, bool b) in p.getServIDs())
                {
                    foreach (Server serv in this.servList)
                    {
                        if (serv.getID() == s)
                        {
                            //add server info to message
                            part.Servers.Add(new ServerInfoClient
                            {
                                Serverid = s,
                                Url      = serv.getURL(),
                                Mindelay = serv.getMin(),
                                Maxdelay = serv.getMax(),
                                Ismaster = b
                            });
                        }
                    }
                }
                complete_partition.Partitions.Add(part);
            }

            //send partition to every client
            foreach (Client c in this.cliList)
            {
                if (c.getUsername() == user_id)
                {
                    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                    GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
                    ClientServices.ClientServicesClient client = new ClientServices.ClientServicesClient(channel);
                    client.ReceivePartitionInfo(complete_partition);
                }
            }
        }
コード例 #4
0
 private void bt_Status(object sender, EventArgs e)
 {
     Console.WriteLine("PuppetMaster: Status Message");
     //iterate over every server and client in the mapping
     foreach (Client c in puppetList.getCliList())
     {
         AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
         GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
         ClientServices.ClientServicesClient client = new ClientServices.ClientServicesClient(channel);
         client.StatusClientAsync(new AskStatusClient {
         });
     }
     foreach (Server s in puppetList.getServList())
     {
         AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
         GrpcChannel channel_server = GrpcChannel.ForAddress(s.getURL());
         GStoreServices.GStoreServicesClient server_client = new GStoreServices.GStoreServicesClient(channel_server);
         server_client.StatusServerAsync(new AskStatusServer {
         });
     }
 }
コード例 #5
0
        public void propagateCrash(string server_id)
        {
            Console.WriteLine("*****************************************************");
            Console.WriteLine("Puppet Master is propagating crash...");
            Console.WriteLine("*****************************************************");
            //propagate to the servers
            foreach (Server s in this.servList)
            {
                Console.WriteLine($"Server {s.getID()}....");
                if (s.getID() != server_id)
                {
                    //do client to server and propagate
                    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                    GrpcChannel channel = GrpcChannel.ForAddress(s.getURL());
                    var         client  = new GStoreServices.GStoreServicesClient(channel);
                    client.ServerCrasedServer(new ServerCrashedID
                    {
                        Serverid = server_id
                    });
                }
            }
            Console.WriteLine("Propagating to clients....");
            //propagate to the clients

            foreach (Client c in this.cliList)
            {
                //do client to server and propagate
                AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
                var         client  = new ClientServices.ClientServicesClient(channel);
                client.ServerCrasedClient(new ServerCrashedClientID
                {
                    Serverclientid = server_id
                });
            }
        }
コード例 #6
0
        private void bt_PMScriptRun(object sender, EventArgs e)
        {
            string PMScript = "";
            Thread t        = new Thread((ThreadStart)(() =>
            {
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
                string path = Directory.GetCurrentDirectory();
                openFileDialog1.InitialDirectory = Path.GetFullPath(Path.Combine(path, @"..\..\..\"));
                openFileDialog1.RestoreDirectory = true;
                openFileDialog1.Title = "Browse Text Files";
                openFileDialog1.DefaultExt = "txt";
                openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                openFileDialog1.FilterIndex = 2;
                openFileDialog1.CheckFileExists = true;
                openFileDialog1.CheckPathExists = true;
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    PMScript = openFileDialog1.FileName;
                }
            }));

            t.SetApartmentState(ApartmentState.STA);
            t.Start();
            t.Join();



            Console.WriteLine(PMScript);

            if (PMScript != "")
            {
                //puppetList.startPM();
                // Verificacao da existencia do ficheiro
                Console.WriteLine("Verificar se o ficheiro existe....");

                if (File.Exists(PMScript))
                {
                    Console.WriteLine("O ficheiro existe....");
                    // PRIMEIRA PASSAGEM
                    //- Adiciona a lista geral os servers, partitions e clients, ignorando o resto.
                    using (StreamReader file = new StreamReader(PMScript))
                    {
                        string ln;

                        while ((ln = file.ReadLine()) != null)
                        {
                            // Parsing das linhas do script...
                            string[] parts = ln.Split(new[] { ' ' });

                            if (parts[0].Equals("ReplicationFactor") && parts.Count() == 2)
                            {
                                continue; // Ignora
                            }
                            else if (parts[0].Equals("Partition"))
                            {
                                Console.WriteLine("Found a partition to create...");
                                //join dos ids servidores
                                string servers_id = "";
                                for (int i = 3; i != parts.Length; i++)
                                {
                                    servers_id += parts[i] + " ";
                                }
                                //Console.WriteLine($"Lista final dos servidores da partição: {servers_id}");
                                puppetList.AddPartition(parts[1], parts[2], servers_id);
                                //Console.WriteLine($"Comprimento da lista das partições (após inserção) : {puppetList.getPartList().Count}");
                            }
                            else if (parts[0].Equals("Server") && parts.Count() == 5)
                            {
                                Console.WriteLine("Found a server to create...");
                                puppetList.AddServerInfo(parts[1], parts[2], parts[3], parts[4]);
                                //Console.WriteLine($"Comprimento da lista dos servidores (após inserção) : {puppetList.getServList().Count}");
                            }
                        }
                        file.Close();
                    }

                    // Depois da primeira passagem, lança todos os servidores / clientes
                    //partições já estão completas
                    puppetList.LaunchServers();
                    //puppetList.LaunchClients();

                    //enviar partições para os clientes e servidores
                    puppetList.sendPartitionToProcesses();


                    // SEGUNDA PASSAGEM
                    // - Nesta passagem so nos interessa os waits, freezes, unfreezes e status

                    using (StreamReader file = new StreamReader(PMScript))
                    {
                        string ln;

                        while ((ln = file.ReadLine()) != null)
                        {
                            // Parsing das linhas do script...
                            string[] parts = ln.Split(new[] { ' ' });

                            if (parts[0].Equals("Status") && parts.Count() == 1)
                            {
                                Console.WriteLine("PuppetMaster: Status Message");
                                //iterate over every server and client in the mapping
                                List <Client> puppet_clients = puppetList.getCliList();
                                List <Server> puppet_servers = puppetList.getServList();
                                foreach (Client c in puppet_clients)
                                {
                                    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                                    GrpcChannel channel = GrpcChannel.ForAddress(c.getURL());
                                    ClientServices.ClientServicesClient client = new ClientServices.ClientServicesClient(channel);
                                    client.StatusClientAsync(new AskStatusClient {
                                    });
                                }
                                foreach (Server s in puppet_servers)
                                {
                                    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                                    GrpcChannel channel_server = GrpcChannel.ForAddress(s.getURL());
                                    GStoreServices.GStoreServicesClient server_client = new GStoreServices.GStoreServicesClient(channel_server);
                                    server_client.StatusServerAsync(new AskStatusServer {
                                    });
                                }
                            }
                            else if (parts[0].Equals("Wait") && parts.Count() == 2)
                            {
                                Console.WriteLine("***************************************************************************");
                                Console.WriteLine($"PuppetMaster vai ficar em sleep durante {parts[1]} milisegundos.");
                                Thread.Sleep(Convert.ToInt32(parts[1]));
                                Console.WriteLine("PuppetMaster vai continuar....");
                                Console.WriteLine("***************************************************************************");
                            }
                            else if (parts[0].Equals("Freeze") && parts.Count() == 2)
                            {
                                Console.WriteLine("PuppetMaster: Freeze Message");
                                //sending freeze request to pretended server
                                List <Server> puppet_servers = puppetList.getServList();
                                foreach (Server s in puppet_servers)
                                {
                                    Console.WriteLine($"Freeze ID do s: {s.getID()}");
                                    Console.WriteLine($"Freeze ID do argumento: {parts[1]}");

                                    if (s.getID() == parts[1])
                                    {
                                        Console.WriteLine($"Freezing Server {parts[1]}...");
                                        AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                                        GrpcChannel channel_server = GrpcChannel.ForAddress(s.getURL());
                                        GStoreServices.GStoreServicesClient server_client = new GStoreServices.GStoreServicesClient(channel_server);
                                        server_client.FreezeServerAsync(new FreezeMessage {
                                        });
                                    }
                                }
                            }
                            else if (parts[0].Equals("Unfreeze") && parts.Count() == 2)
                            {
                                Console.WriteLine("PuppetMaster: Unfreeze Message");
                                //sending unfreeze request to pretended server
                                List <Server> puppet_servers = puppetList.getServList();
                                foreach (Server s in puppet_servers)
                                {
                                    Console.WriteLine($"Unfreeze ID do s: {s.getID()}");
                                    Console.WriteLine($"Unfreeze ID do argumento: {parts[1]}");

                                    if (s.getID() == parts[1])
                                    {
                                        Console.WriteLine($"Unfreezing Server {parts[1]}...");
                                        AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
                                        GrpcChannel channel_server = GrpcChannel.ForAddress(s.getURL());
                                        GStoreServices.GStoreServicesClient server_client = new GStoreServices.GStoreServicesClient(channel_server);
                                        server_client.UnfreezeServerAsync(new UnfreezeMessage {
                                        });
                                    }
                                }
                            }
                            else if (parts[0].Equals("Crash") && parts.Count() == 2)
                            {
                                Console.WriteLine($"Puppet Master found a crash. Crashing server {parts[1]}");
                                bool b = false;
                                foreach (Server serv in puppetList.getServList().ToList())
                                {
                                    if (serv.getID().Equals(parts[1]))
                                    {
                                        b = true;
                                    }
                                }

                                if (b)
                                {
                                    puppetList.DelServer(parts[1]);
                                }

                                //propagar para todos
                                puppetList.propagateCrash(parts[1]);
                            }
                            else if (parts[0].Equals("Client") && parts.Count() == 4)
                            {
                                Console.WriteLine("Found a cliente to create...");
                                puppetList.AddClient(parts[1], parts[2], parts[3]);
                                //Console.WriteLine($"Comprimento da lista dos clientes (após inserção) : {puppetList.getCliList().Count}");
                            }
                        }
                        file.Close();
                    }
                }
                tb_showServ.Text = puppetList.ShowAll();
            }
        }