Exemple #1
0
        //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);
                }
            }
        }
Exemple #2
0
        internal static void notifyPredecessor(string predecessor, string myURL)
        {
            IWorkerReplica replica = (IWorkerReplica)Activator.GetObject(
                typeof(IWorkerReplica), predecessor + "WorkerReplica");

            worker_serverObjects = replica.setSucessor(myURL);
        }
Exemple #3
0
        internal static void notifySucessor(string sucessor, string myURL)
        {
            IWorkerReplica replica = (IWorkerReplica)Activator.GetObject(
                typeof(IWorkerReplica), sucessor + "WorkerReplica");

            replica.setPredecessor(myURL);
        }
Exemple #4
0
        // 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;
        }
Exemple #5
0
        // 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;
        }
Exemple #6
0
        // 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");
        }
Exemple #7
0
        // 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);
            }
        }