コード例 #1
0
        // Set the sucessor replica of the worker
        internal static void SetReplica(string worker_url, string sucessor, string predecessor)
        {
            IMasterWorker remote = (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                                      worker_url + "MasterWorker");

            remote.setReplica(sucessor, predecessor);
        }
コード例 #2
0
 // Status operation
 internal static void status()
 {
     foreach (String server_url in availableServers.Values)
     {
         if (!isFailedServer(server_url) || !isFreezedServer(server_url))
         {
             IMasterWorker worker = (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                                       server_url + "MasterWorker");
             worker.status();
         }
     }
 }
コード例 #3
0
ファイル: Program.cs プロジェクト: lianzeyang/demo_csharp
        public static void Main(string[] args)
        {
            try
            {
                IUnityContainer unityContainer = UnityHelper.RegisterUnityContainer();
                IMasterWorker   worker         = unityContainer.Resolve <IMasterWorker>(WORKER_ON_DUTY);
                worker.Do();
                Console.ReadKey();
            }
            catch (Exception e)
            {
                Console.Write(e.StackTrace);
            }

            Console.ReadKey();
        }
コード例 #4
0
        // Master tells the worker to freeze itself
        internal static bool freeze(string url)
        {
            if (isFailedServer(url) || isFreezedServer(url))
            {
                return(false);
            }

            IMasterWorker worker = (IMasterWorker)Activator.GetObject(
                typeof(IMasterWorker), url + "MasterWorker");

            int id = getAvailableID(url);

            freezedServers.Add(id, url);
            worker.freeze();

            return(true);
        }
コード例 #5
0
        internal static bool recover(string url)
        {
            if (isFailedServer(url))
            {
                int failed_id = getFailedID(url);
                failedServers.Remove(failed_id);

                // Sets the original URL
                availableServers[failed_id] = url;

                string failed_sucessorURL    = getWorkerSucessor(failed_id);
                string failed_predecessorURL = getWorkerPredecessor(failed_id);

                IMasterWorker failed_predecessor = (IMasterWorker)Activator.GetObject(
                    typeof(IMasterWorker), failed_predecessorURL + "MasterWorker");

                IMasterWorker datastore = (IMasterWorker)Activator.GetObject(
                    typeof(IMasterWorker), url + "MasterWorker");

                // Set sucessor of the failed predecessor to the recovered server
                failed_predecessor.setSucessor(url);

                // Fetch data from from failed predecessor to put in his list of updates
                datastore.fetch_data(failed_predecessorURL);

                // Fetch recover data to recovered server to fetch the primary data of his sucessor
                //  also sets his sucessor
                datastore.fetch_recover_data(failed_sucessorURL);
                return(true);
            }
            if (isFreezedServer(url))
            {
                int freeze_id = getFreezeID(url);
                freezedServers.Remove(freeze_id);
                availableServers[freeze_id] = url;
                IMasterWorker worker = (IMasterWorker)Activator.GetObject(typeof(IMasterWorker), url + "MasterWorker");
                worker.recover();
                return(true);
            }
            return(false);
        }
コード例 #6
0
        // Master tells the worker to fail itself and stabilizes the system
        internal static bool fail(string url)
        {
            if (isFailedServer(url))
            {
                return(false);
            }
            int id = getAvailableID(url);

            if (isFreezedServer(url))
            {
                freezedServers.Remove(id);
            }
            failedServers.Add(id, url);

            string failed_sucessorURL    = getWorkerSucessor(id);
            string failed_predecessorURL = getWorkerPredecessor(id);

            IMasterWorker failed_sucessor = (IMasterWorker)Activator.GetObject(
                typeof(IMasterWorker), failed_sucessorURL + "MasterWorker");
            IMasterWorker failed_predecessor = (IMasterWorker)Activator.GetObject(
                typeof(IMasterWorker), failed_predecessorURL + "MasterWorker");

            // Na posicao original dos available trocar o url pelo sucessor
            availableServers[id] = failed_sucessorURL;

            //Set sucessor of failed_predecessor to failed_sucessor -> Problema de concorrencia entre estas 2 operções?
            failed_predecessor.setSucessor(failed_sucessorURL);

            //Tell the sucessor to substitute the failed server
            failed_sucessor.substituteFailedServer();

            //Tell the sucessor to fetch the original data from the failed_predecessor and put it in his the list of updates
            failed_sucessor.fetch_data(failed_predecessorURL);

            IMasterWorker datastore = (IMasterWorker)Activator.GetObject(
                typeof(IMasterWorker), url + "MasterWorker");

            // Last thing to do is change the state, so that the library can continue working
            datastore.fail();
            return(true);
        }
コード例 #7
0
        // Sets the detected url to failed
        internal static string setFailedServer(string url)
        {
            // simple sanity check
            if (!failedServers.ContainsValue(url))
            {
                // if the server was available do the following
                if (availableServers.ContainsValue(url))
                {
                    lock (availableServers)
                    {
                        int id         = getAvailableID(url);
                        int sucessorID = id + 1;
                        if (sucessorID >= availableServers.Count)
                        {
                            sucessorID = 0;
                        }
                        int predecessorID = id - 1;
                        if (predecessorID < 0)
                        {
                            predecessorID = availableServers.Count;
                        }

                        string predecessorURL = availableServers[predecessorID];
                        string sucessorURL    = availableServers[sucessorID];
                        string failedURL      = availableServers[id];

                        IMasterWorker sucessor =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               sucessorURL + "MasterWorker");
                        IMasterWorker predecessor =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               predecessorURL + "MasterWorker");
                        IMasterWorker failed =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               failedURL + "MasterWorker");
                        availableServers[id] = sucessorURL; // same as availableServers[successorID]
                        sucessor.setPredecessor(predecessorURL);
                        predecessor.setSucessor(sucessorURL);
                        sucessor.substituteFailedServer();
                        failed.fail();
                        failedServers.Add(id, url);
                        return(sucessorURL);
                    }
                }
                else if (freezedServers.ContainsValue(url))
                {
                    lock (freezedServers)
                    {
                        int id         = getFreezeID(url);
                        int sucessorID = id + 1;
                        if (sucessorID >= freezedServers.Count)
                        {
                            sucessorID = 0;
                        }
                        int predecessorID = id - 1;
                        if (predecessorID < 0)
                        {
                            predecessorID = freezedServers.Count;
                        }

                        string predecessorURL = freezedServers[predecessorID];
                        string sucessorURL    = freezedServers[sucessorID];
                        string failedURL      = freezedServers[id];

                        IMasterWorker sucessor =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               sucessorURL + "MasterWorker");
                        IMasterWorker predecessor =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               predecessorURL + "MasterWorker");
                        IMasterWorker failed =
                            (IMasterWorker)Activator.GetObject(typeof(IMasterWorker),
                                                               failedURL + "MasterWorker");
                        // the server was both in available and freezed servers
                        availableServers[id] = sucessorURL;
                        sucessor.setPredecessor(predecessorURL);
                        predecessor.setSucessor(sucessorURL);
                        sucessor.substituteFailedServer();
                        failed.fail();
                        freezedServers.Remove(id);
                        failedServers.Add(id, url);
                        return(sucessorURL);
                    }
                }
            }
            return(null);
        }