Пример #1
0
        ///////////////////////////////////////////////// Input //////////////////////////////////////////////
        /// <summary>
        /// Remote Requests: Aqui recebo os pedidos remotos
        /// </summary>
        /// <param name="msg"></param>
        /// <returns></returns>
        public ViewMsg BullyRequestsRetrival(ViewMsg msg)
        {
            switch (msg.Type)
            {
            case ViewMsgType.NewRowdy:
                Console.WriteLine("Retrieve: New Rowdy from: " + msg.Source);
                UpdateViewServerState(ServerStatus.New, msg.Source, null);
                return(ServerViewState.NewRowdyMsgRequest(msg.Source));

            case ViewMsgType.StatusUpdate:
                Console.WriteLine("Retrieve: Status Update from: " + msg.Source + " : " + msg.Status);
                UpdateViewServerState(msg.Status, msg.Source, msg.StateVector);
                ServerViewState.ViewStatusChanged();
                return(new ViewMsg(ViewMsgType.StatusUpdate, GetStatus(ThisMetaserverId), ThisMetaserverId, MetadataServer.GetQueueStateVector( )));

            case ViewMsgType.ServerBetray:
                int betrayed = msg.Betrayed;
                Console.WriteLine("Server betray: " + betrayed);
                if (betrayed == ThisMetaserverId)
                {
                    // Detecta que alguem me está a expulsar e eu estou ligado
                    Console.WriteLine("Server " + msg.Source + " is cheating on me!!!! I will go to new");
                    ToNew(true);
                }
                ServerBetray(msg.Betrayed, msg.Source);
                return(null);

            default:
                Console.WriteLine("Invalide Request type:" + msg.Type + " from " + msg.Source);
                throw new Exception("Invalid Request msg: " + msg.Type);
            }
        }
Пример #2
0
        public void MulticastMsg(ViewMsg msg)
        {
            msg.Source = ThisMetaserverId;
            msg.Status = GetStatus(ThisMetaserverId);

            ViewElementsMutex.WaitOne( );
            //Contact other servers
            for (int id = 0; id < ViewElements.Length; id++)
            {
                if (id == ThisMetaserverId)
                {
                    continue;
                }
                // if ( GetStatus( id ) == ServerStatus.Off )
                //   continue;
                msg.Destination = id;
                log.Debug(DateTime.Now.Ticks + " [M] Multicast View: " + msg.Status);
                IMetaToMeta   server    = MetadataServer.ConnectToMetaserver(id);
                BullyDel      invokeDel = new BullyDel(server.BullyRequestsRetrival);
                AsyncCallback callback  = new AsyncCallback(BullyResponse);
                try
                {
                    Console.WriteLine("Multicast: " + msg + " to " + msg.Destination);
                    invokeDel.BeginInvoke(msg, callback, null);
                }
                catch (SocketException)
                {
                    UpdateViewServerState(ServerStatus.Off, id, null);
                }
            }
            ViewElementsMutex.ReleaseMutex( );
        }
Пример #3
0
        /// <summary>
        /// Aqui recebo as respostas
        /// </summary>
        /// <param name="ar"></param>
        private void BullyResponse(IAsyncResult ar)
        {
            BullyDel del = (BullyDel)((AsyncResult)ar).AsyncDelegate;
            ViewMsg  msg = del.EndInvoke(ar);

            new ProcessResponseDel(ProcessResponse).Invoke(msg);
        }
Пример #4
0
        /// <summary>
        /// Deunnciar que existe um servidor que falhou
        /// </summary>
        /// <param name="betrayedServer"></param>
        /// <param name="knownFrom">Quem o avisou</param>
        public void ServerBetray(int betrayedServer, int knownFrom)
        {
            //Anunciar aos restantes da view que este falhou.
            ViewMsg msg = new ViewMsg(ViewMsgType.ServerBetray, GetStatus(ThisMetaserverId), ThisMetaserverId, MetadataServer.GetQueueStateVector( ));

            msg.Source   = ThisMetaserverId;
            msg.Status   = GetStatus(ThisMetaserverId);
            msg.Betrayed = betrayedServer;

            ViewElementsMutex.WaitOne( );
            //Contact other servers
            for (int id = 0; id < ViewElements.Length; id++)
            {
                if (id == ThisMetaserverId || id == knownFrom)
                {
                    continue;
                }

                if (ViewElements[id] == ServerStatus.Off)
                {
                    Console.WriteLine("Already betrayed" + id);
                    continue;
                }

                msg.Destination = id;
                try
                {
                    Console.WriteLine("Betray: " + betrayedServer + " to " + msg.Destination);
                    MetadataServer.ConnectToMetaserver(id).BullyRequestsRetrival(msg);
                }
                catch (SocketException) {
                    UpdateViewServerState(ServerStatus.Off, id, null);
                    if (id != betrayedServer && !(ViewElements[id].Equals(ServerStatus.Off)))
                    {
                        ServerBetray(id, ThisMetaserverId);
                    }
                }
            }
            //Retirar este servidor da minha view
            Console.WriteLine("Remove betrayed: " + betrayedServer);
            RemoveServerFromView(betrayedServer);
            ViewElementsMutex.ReleaseMutex( );
        }
Пример #5
0
        private void ProcessResponse(ViewMsg msg)
        {
            if (msg == null)
            {
                return;
            }
            switch (msg.Type)
            {
            case ViewMsgType.StatusUpdate:
                Console.WriteLine("Retrieve: Status Update from: " + msg.Source + " : " + msg.Status);
                UpdateViewServerState(msg.Status, msg.Source, msg.StateVector);
                ServerViewState.ViewStatusChanged();
                break;

            default:
                Console.WriteLine("Invalide Response type:" + msg.Type + " from " + msg.Source);
                throw new Exception("Invalid msg type received:" + msg.Type);
            }
        }
Пример #6
0
 public ViewMsg BullyRequestsRetrival(ViewMsg msg)
 {
     return(ViewManager.BullyRequestsRetrival(msg));
 }