//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); } } }
internal static void notifyPredecessor(string predecessor, string myURL) { IWorkerReplica replica = (IWorkerReplica)Activator.GetObject( typeof(IWorkerReplica), predecessor + "WorkerReplica"); worker_serverObjects = replica.setSucessor(myURL); }
internal static void notifySucessor(string sucessor, string myURL) { IWorkerReplica replica = (IWorkerReplica)Activator.GetObject( typeof(IWorkerReplica), sucessor + "WorkerReplica"); replica.setPredecessor(myURL); }
// This server will fetch all primary data of sucessor and add it in his list of updates public void fetch_data(string predecessor_url) { IWorkerReplica predecessor = (IWorkerReplica)Activator.GetObject( typeof(IWorkerReplica), predecessor_url + "WorkerReplica"); List <ServerObject> fetched_data = predecessor.fetchData(); Replica.WORKERSERVEROBJECTS = fetched_data; }
// WARNING: This function is obsolete // The worker has a new predecessor (receives updates from a new one) public void setPredecessor(string predecessorURL) { IWorkerReplica predecessor = (IWorkerReplica)Activator.GetObject(typeof(IWorkerReplica), predecessorURL + "WorkerReplica"); List <ServerObject> backupObjects = predecessor.fetchData(); Replica.update(backupObjects); Console.WriteLine("AFTER SERVER FAILED MY PREDECESSOR IS = " + predecessor); Replica.PREDECESSOR = predecessorURL; }
// This server will fetch all primary data of sucessor and replace its own primary data public void fetch_recover_data(string sucessor_url) { IWorkerReplica sucessor = (IWorkerReplica)Activator.GetObject( typeof(IWorkerReplica), sucessor_url + "WorkerReplica"); List <ServerObject> recovered_data = sucessor.fetchRecoverData(); Replica.SUCESSOR = sucessor_url; Datastore.SERVEROBJECTS = recovered_data; Datastore.STATE = State.NORMAL; Console.WriteLine("Datastore Recovered"); }
// 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); } }