///////////////////////////////////////////////// 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); } }
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( ); }
/// <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); }
/// <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( ); }
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); } }
public ViewMsg BullyRequestsRetrival(ViewMsg msg) { return(ViewManager.BullyRequestsRetrival(msg)); }