Ejemplo n.º 1
0
        internal ReplyData RecieveViewChangeProposal(View proposedView)
        {
            Utils.Print("[o] Received View Change Proposal");
            View view           = viewManager.GetView();
            int  proposedViewId = proposedView.ViewId;

            Task irrelTask;

            if (ServerData.ServerUId.Equals(proposedView.ManagerUId) && view.ViewId < proposedView.ViewId)
            {
                viewManager.DisallowSelfPromotion();
                isWaitingForCommit = true;
                irrelTask          = WaitForViewChangeCommitTimeout(proposedViewId, 4000);
                return(new AcceptViewProposal(ServerData, view, mIdTable, tupleSpace));
            }

            if (view.ViewId >= proposedViewId)
            {
                return(new RejectViewProposal(ServerData, view));
            }

            lock (__acceptedViewLock)
            {
                int acceptedViewId = acceptedView.ViewId;
                if (acceptedViewId >= proposedView.ViewId)
                {
                    return(new RejectViewProposal(ServerData, view));
                }
                acceptedView = proposedView;
            }

            viewManager.DisallowSelfPromotion();
            isWaitingForCommit = true;
            // Starts a timer to timeout in case a Commit for this particular proposed View doesn't arrive in time.
            // Ignores return value to stop warning.
            irrelTask = WaitForViewChangeCommitTimeout(proposedViewId, 4000);
            return(new AcceptViewProposal(ServerData, view, mIdTable, tupleSpace));
        }