private Thrift.TheGraph.Client getServerOf(string value) { var _MD5 = Handler.HASH_MD5(value); if (this.servers.Keys.Count() == 0) { return(null); } foreach (string server in this.servers.Keys) { BigInteger start = Handler.BigIntegerOfNBits(this.servers[server].Item1); BigInteger end = Handler.BigIntegerOfNBits(this.servers[server].Item2); if (_MD5 >= start && _MD5 < end) { if (server.Equals(this.MyAddress)) { return(null); } Console.WriteLine(String.Format("Solicitacao redirecionada ao servidor {0}", server)); TSocket transport = new TSocket(server.Split(':')[0], int.Parse(server.Split(':')[1])); TBinaryProtocol protocol = new TBinaryProtocol(transport); Thrift.TheGraph.Client client = new Thrift.TheGraph.Client(protocol); transport.Open(); return(client); } } throw new Exception("Hash fora do range de servidores, O banco de dados foi comprometido."); }
public graph G(bool scan) { if (this.raftNode.current_state == Raft.Node.State.Leader) //CONSULTAS NÃO FAZEM COMITIS APENAS VALIDAM SE O NODO É O LIDER, APENAS UM LIDER PODE CONVERSAR COM O CLIENTE. { if (!scan || this.servers.Count() == 1) { return(this.g); } graph G = new graph(); foreach (string server in this.servers.Keys) { TTransport transport = new TSocket(server.Split(':')[0], int.Parse(server.Split(':')[1])); TProtocol protocol = new TBinaryProtocol(transport); Thrift.TheGraph.Client client = new Thrift.TheGraph.Client(protocol); transport.Open(); G.V.AddRange(client.G(false).V); G.E.AddRange(client.G(false).E); transport.Close(); } return(G); } else { Console.WriteLine("APENAS LIDERES PODEM CONSULTAR"); return(null); } }
private void SyncProtocol(string TargetAddress, Tuple <int, int> MyRange, Tuple <int, int> TargetRange) { this.MUTEX_V.WaitOne(); this.MUTEX_E.WaitOne(); this.MUTEX_S.WaitOne(); TTransport transport = new TSocket(TargetAddress.Split(':')[0], int.Parse(TargetAddress.Split(':')[1])); TProtocol protocol = new TBinaryProtocol(transport); Thrift.TheGraph.Client client = new Thrift.TheGraph.Client(protocol); transport.Open(); BigInteger floor = Handler.BigIntegerOfNBits(MyRange.Item2); //MAIOR NUMERO POSSIVEL NO RANGE ATUAL, ACIMA DISSO DEVE IR PARA O NOVO SERVER int stop = this.g.V.Count(); for (int i = 0; i < stop; i++) { var v = this.g.V[i]; if (Handler.HASH_MD5(v.Name.ToString()) > floor) { Console.WriteLine(string.Format("Enviando vertice {0} e suas arestas para o servidor {1}", v.Name, TargetAddress)); client.copyVertex(v); foreach (var e in this.g.E.Where(edge => edge.V1 == v.Name || (!edge.Directed && edge.V2 == v.Name))) { client.copyEdge(e); } this.g.E.RemoveAll(edge => edge.V1 == v.Name || (!edge.Directed && edge.V2 == v.Name)); this.g.V.RemoveAt(i); stop--; i--; } } this.servers[MyAddress] = MyRange; this.servers.Add(TargetAddress, TargetRange); string message = string.Format("REFRESH|{0}|<{1}, {2}>", MyAddress, MyRange.Item1, MyRange.Item2); this.SendMessage(message); message = string.Format("REFRESH|{0}|<{1}, {2}>", TargetAddress, TargetRange.Item1, TargetRange.Item2); this.SendMessage(message); this.MUTEX_V.ReleaseMutex(); this.MUTEX_E.ReleaseMutex(); this.MUTEX_S.ReleaseMutex(); }
private void txt_Command_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == (char)Keys.Enter) { string command = txt_Command.Text.ToLower(); txt_Command.Text = ""; txt_Console.Text += command + "\n"; if (command.Contains("draw")) { this.graph = client.G(true); pnl_Grafo.Refresh(); } else if (command.Contains("connect")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); if (this.transport != null && this.transport.IsOpen) { this.transport.Close(); } this.transport = new TSocket(values[0], int.Parse(values[1])); this.protocol = new TBinaryProtocol(transport); this.client = new Thrift.TheGraph.Client(this.protocol); transport.Open(); } else if (command.Contains("add-v")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int Name = int.Parse(values[0]); int Color = int.Parse(values[1]); // double P = double.Parse(values[2].Replace(".", ",")); // string Description = values[3]; try { var result = client.createVertex(new Thrift.vertex() { Name = Name, Color = Color, Weight = P, Description = Description }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("get-v")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); try { if (values.Length == 1) { int name = int.Parse(values[0]); var V = client.readV(name); txt_Console.Text += string.Format("Name = {0}\nColor={1}\nWeight={2}\nDescription={3}\n", V.Name, V.Color, V.Weight, V.Description); } if (values.Length == 3) { int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); bool Directed = bool.Parse(values[2]); var LV = client.getVertex(new Thrift.edge() { V1 = V1, V2 = V2, Directed = Directed }); foreach (var V in LV) { txt_Console.Text += string.Format("Name = {0}\nColor={1}\nWeight={2}\nDescription={3}\n", V.Name, V.Color, V.Weight, V.Description); } } } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("rem-v")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int Name = int.Parse(values[0]); try { client.deleteVertex(new Thrift.vertex() { Name = Name }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("update-v")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int Name = int.Parse(values[0]); int Color = int.Parse(values[1]); // double P = double.Parse(values[2].Replace(".", ",")); // string Description = values[3]; try { client.updateVertex(new Thrift.vertex() { Name = Name, Color = Color, Weight = P, Description = Description }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("add-e")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); // double P = double.Parse(values[2].Replace(".", ",")); // bool Directed = bool.Parse(values[3]); // string Description = values[4]; try { client.createEdge(new Thrift.edge() { V1 = V1, V2 = V2, Weight = P, Directed = Directed, Description = Description }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("get-e")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); try { if (values.Length == 3) { // int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); // bool Directed = bool.Parse(values[2]); var E = client.readE(V1, V2, Directed); txt_Console.Text += string.Format("V1={0}\nV2={1}\nDirected={2}\nWeight={3}\nDescription={4}\n", E.V1, E.V2, E.Directed, E.Weight, E.Description); } else if (values.Length == 1) { int Name = int.Parse(values[0]); var LE = client.getEdges(new Thrift.vertex() { Name = Name }); foreach (var E in LE) { txt_Console.Text += string.Format("V1={0}\nV2={1}\nDirected={2}\nWeight={3}\nDescription={4}\n", E.V1, E.V2, E.Directed, E.Weight, E.Description); } } } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("rem-e")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); bool Directed = bool.Parse(values[2]); try { client.deleteEdge(new Thrift.edge() { V1 = V1, V2 = V2, Directed = Directed }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("update-e")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); // double P = double.Parse(values[2].Replace(".", ",")); // bool Directed = bool.Parse(values[3]); // string Description = values[4]; try { client.updateEdge(new Thrift.edge() { V1 = V1, V2 = V2, Weight = P, Directed = Directed, Description = Description }); } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("bfs")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); // int V1 = int.Parse(values[0]); int V2 = int.Parse(values[1]); // try { try{ var result = client.bfs(V2, new List <List <int> >() { new List <int>() { V1 } }, new List <int>()); txt_Console.Text += string.Join("-", result) + "\n"; } catch (Exception ex) { txt_Console.Text += "NÃO EXISTE CAMINHO\n"; } } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } else if (command.Contains("neighborhood")) { command = command.Remove(0, command.IndexOf("(")); command = command.Replace("(", "").Replace(")", ""); var values = command.Split(','); try { int Name = int.Parse(values[0]); var LV = client.getNeighborhood(new Thrift.vertex() { Name = Name }); foreach (var V in LV) { txt_Console.Text += string.Format("Name = {0}\nColor={1}\nWeight={3}\nDescription={2}\n", V.Name, V.Color, V.Weight, V.Description); } } catch (Exception exception) { MessageBox.Show(exception.ToString()); } } } }
public void DeadProtocol() { this.MUTEX_V.WaitOne(); this.MUTEX_E.WaitOne(); this.MUTEX_S.WaitOne(); var MyRange = this.servers[MyAddress]; var TargetAddress = ""; Tuple <int, int> newRange = Tuple.Create <int, int>(-1, -1); foreach (string server in this.servers.Keys) { if (MyRange.Item2 != LIMIT_BITS_MD5) //RIGHT SHIFT { if (this.servers[server].Item1 == MyRange.Item2 + 1) { TargetAddress = server; newRange = Tuple.Create <int, int>(MyRange.Item1, this.servers[server].Item2); break; } } else //LEFT SHIFT { if (this.servers[server].Item2 == MyRange.Item1 - 1) { TargetAddress = server; newRange = Tuple.Create <int, int>(this.servers[server].Item1, LIMIT_BITS_MD5); break; } } } if (TargetAddress == string.Empty) { Console.WriteLine("Não existe outro servidor disponivel, os dados deste serão perdidos"); return; } else { Console.WriteLine(string.Format("Novo servidor responsavel: {0}", TargetAddress)); } string buffer = string.Format("DEAD|{0}|{1}|<{2}, {3}>", TargetAddress, MyAddress, newRange.Item1, newRange.Item2); SendMessage(buffer); for (; !buffer.Contains("DEAD_OK|") && buffer.Split('|')[1].Equals(MyAddress); buffer = this.ReceiveMessage()) { ; } TTransport transport = new TSocket(TargetAddress.Split(':')[0], int.Parse(TargetAddress.Split(':')[1])); TProtocol protocol = new TBinaryProtocol(transport); Thrift.TheGraph.Client client = new Thrift.TheGraph.Client(protocol); transport.Open(); foreach (var v in this.g.V) { Console.WriteLine(string.Format("Enviando vertice {0} para o servidor {1}", v.Name, TargetAddress)); client.copyVertex(v); } foreach (var e in this.g.E) { Console.WriteLine(string.Format("Enviando aresta {0}-{1}-{2} para o servidor {3}", e.V1, e.V2, e.Directed, TargetAddress)); client.copyEdge(e); } buffer = string.Format("REFRESH|{0}|<{1}, {2}>", TargetAddress, newRange.Item1, newRange.Item2); this.SendMessage(buffer); buffer = string.Format("REFRESH|{0}|<{1}, {2}>", MyAddress, -1, -1); this.SendMessage(buffer); }