//start receiving requests from the failed server public void substituteFailedServer() { lock (Datastore.SERVEROBJECTS) { List <ServerObject> replaceList = Replica.WORKERSERVEROBJECTS; //Send replaceList to sucessor, the data must always be in two place // WARNING: Verificar se o sucessor é ele próprio IWorkerReplica sucessor = (IWorkerReplica)Activator.GetObject( typeof(IWorkerReplica), Replica.SUCESSOR + "WorkerReplica"); Datastore.SERVEROBJECTS.AddRange(replaceList); //sucessor.update(replaceList); // Instead of sending only the replace list, it is send all primary objects just to be sure sucessor.update(Datastore.SERVEROBJECTS); // debug info Console.WriteLine("Printing worker main server objects:"); foreach (ServerObject o in Datastore.SERVEROBJECTS) { Console.WriteLine("\t UID= " + o.UID + " VALUE=" + o.VALUE); } } }
// Update function called by the workers, receives list of server objects // from a given server. If worker_url does not exist in worker_serverObjects // it means that it is a new server //Send updated to sucessor, if sucessor died return false -> transaction abort //call master to stabalize the system internal static UpdateState updateSucessor(List <ServerObject> writtenObjects) { try { IWorkerReplica sucessor = (IWorkerReplica)Activator.GetObject(typeof(IWorkerReplica), Replica.SUCESSOR + "WorkerReplica"); sucessor.update(writtenObjects); return(UpdateState.COMMIT); } catch (SocketException) { // manageFailedServer(Replica.SUCESSOR); //updateSucessor(writtenObjects); return(UpdateState.ABORT); } catch (System.IO.IOException) { //manageFailedServer(Replica.SUCESSOR); //updateSucessor(writtenObjects); return(UpdateState.ABORT); } }