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 { }); }
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 { }); }
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); } } }
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 { }); } }
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 }); } }
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(); } }