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();
        }
Ejemplo n.º 4
0
        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);
        }