Exemplo n.º 1
0
        public static void Client_thread(Uri uri, String path)
        {
            Console.WriteLine(uri);

            ClientProgram cp = new ClientProgram(uri, path);

            cp.ClientStateMachine(); //while infinite
        }
Exemplo n.º 2
0
 public void sink(MyTuple mt)
 {
     while (MustFreeze == true)
     {
         ;                        //Freeze
     }
     if (mt != null)
     {
         Console.WriteLine("(ClientServices) RECEBI: " + mt.ToString());
     }
     else
     {
         Console.WriteLine("(ClientServices) NADA A RECEBER");
     }
     ClientProgram.AnswerIsReceived();
 }
Exemplo n.º 3
0
        public static void ProcessReceivedReplys_thread()
        {
            while (true)
            {
                Thread.Sleep(50);                 //Min time to check commands
                if (commLayer.GetQueueSize() > 0) //if there is commands
                {
                    Command mt = commLayer.RemoveFromCommandQueue();
                    //MyTuple payload = (MyTuple)mt.GetPayload();
                    Object tmp;

                    switch (mt.GetCommand())
                    {
                    case "read":
                        for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                        {
                            if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)
                            {
                                ClientProgram.ThreadsInAction[i].GetThreadState().Kill_hread();
                                ClientProgram.ThreadsInAction[i].GetThread().Join();
                                ClientProgram.ThreadsInAction.RemoveAt(i);
                                ClientProgram.Pending_SignalEvent.Set();
                                Console.WriteLine("(ClientServices) RECEBI: " + mt.GetPayload().ToString());
                                flag = true;
                                break;
                            }
                        }
                        if (flag == true)
                        {
                            for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                            {
                                ClientProgram.ThreadsInAction[i].GetThreadState().Kill_hread();
                                ClientProgram.ThreadsInAction[i].GetThread().Join();
                                flag = false;;
                            }
                            ClientProgram.ThreadsInAction.Clear();
                        }
                        break;

                    case "add":
                        for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                        {
                            if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)     //Se está OK
                            {
                                //ClientProgram.ThreadsInAction[i].GetThreadState().Kill_hread();
                                //ClientProgram.ThreadsInAction[i].GetThread().Join();
                                //ClientProgram.ThreadsInAction.RemoveAt(i);


                                if (++NumOfAddReceived == ClientProgram.AllServers.Count)
                                {
                                    NumOfAddReceived = 0;
                                    for (int j = 0; j < ClientProgram.ThreadsInAction.Count; ++j)
                                    {
                                        ClientProgram.ThreadsInAction[j].GetThreadState().Kill_hread();
                                        ClientProgram.ThreadsInAction[j].GetThread().Join();
                                        flag = false;;
                                    }
                                    ClientProgram.ThreadsInAction.Clear();     //todos recebidos
                                }

                                if (AlreadyEvolvedFromAdd == false)
                                {
                                    flag = true;
                                }
                                break;
                            }
                        }
                        if (flag == true)
                        {
                            if (NumOfAddReceived >= (ClientProgram.AllServers.Count / 2 + 1))
                            {
                                AlreadyEvolvedFromAdd = true;
                                ClientProgram.Pending_SignalEvent.Set();     //Signal UpperLayer that it can evolve
                                Console.WriteLine("(ClientServices) ADD Success in the majority of replicas: ");
                                flag = false;

                                //Majority of ADD Acknowledge received
                            }
                        }
                        break;

                    case "refuse":
                        ++NumOfRefusedReceived;
                        if ((NumOfRefusedReceived + NumOfAcceptedReceived) == ClientProgram.AllServers.Count)
                        {
                            //At least One refused. Start al over again
                            NumOfRefusedReceived  = 0;
                            NumOfAcceptedReceived = 0;
                            ClientProgram.Pending_SignalEvent.Set();
                        }
                        break;

                    case "accept":
                        ++NumOfAcceptedReceived;
                        AcceptedReply.Add(mt);
                        if (NumOfAcceptedReceived == ClientProgram.AllServers.Count)
                        {
                            //All accpeted

                            HashSet <MyTuple> Intersection = (HashSet <MyTuple>)AcceptedReply[0].GetPayload();
                            for (int i = 1; i < AcceptedReply.Count; ++i)
                            {
                                HashSet <MyTuple> mySet2 = (HashSet <MyTuple>)AcceptedReply[i].GetPayload();
                                Intersection.Intersect(mySet2);
                            }

                            //Test if null
                            if (Intersection.Count == 0)
                            {
                                //Restart FAse 1
                                ClientProgram.Pending_SignalEvent.Set();
                            }
                            else
                            {
                                foreach (MyTuple i in Intersection)
                                {
                                    //Console.WriteLine("(ClientServices) TAKE Success: " + i.ToString());
                                    ClientProgram.FinnishTake();
                                    ClientProgram.Pending_SignalEvent.Set();



                                    //Console.WriteLine("Antes do Remove");



                                    //Console.WriteLine("Depois do Remove");
                                    break;
                                }
                            }
                        }
                        break;

                    case "ack":     //FASE 2
                        ++NumOfAckReceived;
                        if (NumOfAckReceived == ClientProgram.AllServers.Count)
                        {
                            //All received. Finnish
                            NumOfAckReceived = 0;
                            Console.WriteLine("(ClientServices) TAKE Success in all");
                            ClientProgram.FinnishTake();
                        }
                        ClientProgram.Pending_SignalEvent.Set();
                        break;
                    }
                }
            }
        }
Exemplo n.º 4
0
        public static void ProcessReceivedReplys_thread()
        {
            while (true)
            {
                Thread.Sleep(50);                 //Min time to check commands
                if (commLayer.GetQueueSize() > 0) //if there is commands
                {
                    Command mt = commLayer.RemoveFromCommandQueue();
                    //MyTuple payload = (MyTuple)mt.GetPayload();
                    Object tmp;

                    Console.WriteLine("=================" + mt.GetCommand());
                    switch (mt.GetCommand())
                    {
                    case "ack":
                        if (CommandInUse == "read" && mt.GetPrevCommand() == "read")
                        {
                            for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                            {
                                if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)
                                {
                                    ClientProgram.ThreadsInAction[i].GetThreadState().Kill_hread();
                                    ClientProgram.ThreadsInAction[i].GetThread().Join();
                                    ClientProgram.ThreadsInAction.RemoveAt(i);
                                    ClientProgram.Read_SignalEvent.Set();     //Read Ok. At least One received
                                    Console.WriteLine("Value: " + mt.GetPayload().ToString());
                                    flag = true;
                                    break;
                                }
                            }
                            if (flag == true)
                            {
                                for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                                {
                                    ClientProgram.ThreadsInAction[i].GetThreadState().Kill_hread();
                                    ClientProgram.ThreadsInAction[i].GetThread().Join();
                                    flag = false;;
                                }
                                ClientProgram.ThreadsInAction.Clear();
                            }
                        }
                        else
                        {
                            if (CommandInUse == "add" && mt.GetPrevCommand() == "add")     //===================================================
                            {
                                for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                                {
                                    if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)     //Se está OK
                                    {
                                        if (ServersInTheView.Contains(mt.GetUriFromSender()) == false)
                                        {
                                            ServersInTheView.Add(mt.GetUriFromSender());

                                            if (ServersInTheView.Count >= (currentView.Count / 2 + 1))
                                            {
                                                //Can progress
                                                for (int j = 0; j < ClientProgram.ThreadsInAction.Count; ++j)
                                                {
                                                    for (int k = 0; k < ServersInTheView.Count; ++k)
                                                    {
                                                        if (ClientProgram.ThreadsInAction[j].GetUri().Equals(ServersInTheView[k]))
                                                        {
                                                            ClientProgram.ThreadsInAction[j].GetThreadState().Kill_hread();
                                                            ClientProgram.ThreadsInAction[j].GetThread().Join();
                                                            ClientProgram.ThreadsInAction.RemoveAt(j);
                                                            j = -1;
                                                            break;
                                                        }
                                                    }
                                                }
                                                ClientProgram.Add_SignalEvent.Set();     //Signal UpperLayer that it can evolve
                                                Console.WriteLine("(ClientServices) ADD Success in the majority of replicas: ");
                                            }
                                        }
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                if (CommandInUse == "take" && mt.GetPrevCommand() == "take")     //===================================================
                                {
                                    for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                                    {
                                        if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)     //Se está OK
                                        {
                                            if (ServersInTheView.Contains(mt.GetUriFromSender()) == false)
                                            {
                                                ServersInTheView.Add(mt.GetUriFromSender());
                                                AcceptedReply.Add(mt);     //Accepted stored

                                                if (ServersInTheView.Count == currentView.Count)
                                                {
                                                    //Can progress

                                                    //Check intersection of the tuple space
                                                    HashSet <MyTuple> Intersection = (HashSet <MyTuple>)AcceptedReply[0].GetPayload();
                                                    for (int j = 1; j < AcceptedReply.Count; ++j)
                                                    {
                                                        HashSet <MyTuple> mySet2 = (HashSet <MyTuple>)AcceptedReply[i].GetPayload();
                                                        Intersection.Intersect(mySet2);
                                                    }
                                                    //Test if null
                                                    if (Intersection.Count == 0)
                                                    {
                                                        //Restart FAse 1
                                                        ServersInTheView.Clear();
                                                        AcceptedReply.Clear();
                                                        break;
                                                        //ClientProgram.Take_SignalEvent.Set();
                                                    }
                                                    else
                                                    {
                                                        foreach (MyTuple t in Intersection)
                                                        {
                                                            //Console.WriteLine("(ClientServices) TAKE Success: " + i.ToString());
                                                            //ClientProgram.FinnishTake();
                                                            //ClientProgram.Take_SignalEvent.Set();

                                                            //Vou ter que mandar REMOVE

                                                            //Limpar tudo
                                                            for (int j = 0; j < ClientProgram.ThreadsInAction.Count; ++j)
                                                            {
                                                                for (int k = 0; k < ServersInTheView.Count; ++k)
                                                                {
                                                                    if (ClientProgram.ThreadsInAction[j].GetUri().Equals(ServersInTheView[k]))
                                                                    {
                                                                        ClientProgram.ThreadsInAction[j].GetThreadState().Kill_hread();
                                                                        ClientProgram.ThreadsInAction[j].GetThread().Join();
                                                                        ClientProgram.ThreadsInAction.RemoveAt(j);
                                                                        j = -1;
                                                                        break;
                                                                    }
                                                                }
                                                            }

                                                            //===================================================== Preparar REMOVE
                                                            ClientProgram.SendToView(new Command("remove", t, ClientProgram.MyAddress, ClientProgram.SequenceNumber, null));
                                                            SetCurrentCommandAndView("remove", ClientProgram.GetView());
                                                            //Console.WriteLine("Depois do Remove");
                                                            break;
                                                        }
                                                    }



                                                    //ClientProgram.SendToView(new Command("remove", t, MyAddress, ++SequenceNumber, null));

                                                    //ClientProgram.Take_SignalEvent.Set(); //Signal UpperLayer that it can evolve

                                                    Console.WriteLine("(ClientServices) TAKE Success in all the replicas: ");
                                                }
                                            }
                                            break;
                                        }
                                    }
                                }
                                else
                                {
                                    if (CommandInUse == "remove" && mt.GetPrevCommand() == "remove")     //===================================================
                                    {
                                        for (int i = 0; i < ClientProgram.ThreadsInAction.Count; ++i)
                                        {
                                            if (ClientProgram.ThreadsInAction[i].Equals(new SenderPool(null, null, mt.GetUriFromSender(), mt)) == true)     //Se está OK
                                            {
                                                if (ServersInTheView.Contains(mt.GetUriFromSender()) == false)
                                                {
                                                    ServersInTheView.Add(mt.GetUriFromSender());

                                                    if (ServersInTheView.Count == currentView.Count)
                                                    {
                                                        //Can progress
                                                        //Limpar tudo
                                                        for (int j = 0; j < ClientProgram.ThreadsInAction.Count; ++j)
                                                        {
                                                            for (int k = 0; k < ServersInTheView.Count; ++k)
                                                            {
                                                                if (ClientProgram.ThreadsInAction[j].GetUri().Equals(ServersInTheView[k]))
                                                                {
                                                                    ClientProgram.ThreadsInAction[j].GetThreadState().Kill_hread();
                                                                    ClientProgram.ThreadsInAction[j].GetThread().Join();
                                                                    ClientProgram.ThreadsInAction.RemoveAt(j);
                                                                    j = -1;
                                                                    break;
                                                                }
                                                            }
                                                        }
                                                        ClientProgram.Take_SignalEvent.Set();
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        break;

                    case "refuse":
                        if (CommandInUse == "refuse" && mt.GetPrevCommand() == "read")
                        {
                        }
                        else
                        {
                            if (CommandInUse == "take" && mt.GetPrevCommand() == "refuse")
                            {
                                Thread.Sleep(250);
                            }
                            else
                            {
                                if (CommandInUse == "remove" && mt.GetPrevCommand() == "refuse")
                                {
                                }
                            }
                        }
                        break;
                    }
                }
            }
        }