private static MetaserverResponse Create(MetaRequest request) { RequestCreate createRequest = (RequestCreate)request; MetaserverResponse response; //Invoca o servidor try { MetadataEntry entry = core.Create(createRequest.FileName, createRequest.NbDataServer, createRequest.ReadQuorum, createRequest.WriteQuorum, request.ClientId); response = new MetaserverResponse(ResponseStatus.Success, request, ThisMetaserverId); response.MetaEntry = entry; } catch (Exception ex) { response = new MetaserverResponse(ResponseStatus.Exception, request, ThisMetaserverId); response.Exception = new PadiException(PadiExceptiontType.CreateFile, ex.Message); } return(response); }
public void ReceiveResponse(MetaserverResponse response) { Console.WriteLine("Received Response "); log.Debug(DateTime.Now.Ticks + " ReceiveResponse: " + response); response.KnownByThisServersList.Add(ThisMetaserverId); //TODO check threads waiting for this request //TODO Retirar a thread pendente int previous = ThisMetaserverId; while (true) { Boolean iAmLast = false; previous = ViewManager.GetPreviousServerInView(previous, response.KnownByThisServersList, out iAmLast); if (iAmLast) { Console.WriteLine("Source received the ack"); return; } { try { //Tentar enviar ao seguinte //TODO Se ele responder que desconhece, fico à espera do ack. Se ao fim de x tempo nao receber, enviar outra vez log.Debug(DateTime.Now.Ticks + " [M] Response Sent: " + response.OriginalRequest.FileName); ConnectToMetaserver(previous).ReceiveResponse(response); return; } catch (SocketException e) { //Actualizar a view, esta mensagem tem de ser entregue mas a view tem de ser actualizada, //O serializer pode ter morrido. //TODO INVOKE UPDATE VIEW Console.WriteLine("Previous server fail"); ViewManager.ServerBetray(previous, ThisMetaserverId); } } } }
//////////////////////////////////// CLient Interface ////////////////////////////////// public String Create(String filename, int nbDataServers, int readQuorum, int writeQuorum) { log.Debug(DateTime.Now.Ticks + " Create: " + filename); Console.WriteLine("#CREATE Create file: " + filename + " nbDataServer: " + nbDataServers + " readQuorum: " + readQuorum + " writeQuorum: " + writeQuorum); RequestCreate createRequest = new RequestCreate(filename, nbDataServers, readQuorum, writeQuorum); log.Debug(DateTime.Now.Ticks + " [M] Send Create: " + filename); MetaserverResponse response = MetaserverClient.SendRequestToMetaserver(createRequest); //Processar a resposta MetadataEntry metaEntry = response.MetaEntry; if (metaEntry != null) { Console.WriteLine("#CREATE Create Successeful"); log.Debug(DateTime.Now.Ticks + " Create Done: " + filename); return(metaEntry.ToString( )); } else { throw new PadiException(PadiExceptiontType.CreateFile, "Response without entry"); } }
private static MetaserverResponse Balancing(MetaRequest request) { Console.WriteLine("New balancing message"); if (!LoadBalancer.Enabled) { Console.WriteLine("Load balance not enable"); return(new MetaserverResponse(ResponseStatus.Success, request, ThisMetaserverId)); } Console.WriteLine("Load balance enable"); RequestBalancing balancingRequest = (RequestBalancing)request; MetaserverResponse response; try { core.Balancing(balancingRequest); response = new MetaserverResponse(ResponseStatus.Success, request, ThisMetaserverId); } catch (Exception ex) { response = new MetaserverResponse(ResponseStatus.Exception, request, ThisMetaserverId); response.Exception = new PadiException(PadiExceptiontType.Balancing, ex.Message); } return(response); }
public Boolean ReceiveMetaserverResponse(MetaserverResponse response) { return(MetaserverClient.ReceiveMetaserverResponse(response)); }