Example #1
0
 public IResponse VisitGetAndLock(GetAndLockRequest getAndLockRequest)
 {
     return(ExecuteRequest(getAndLockRequest, new GetAndLockExecutor(getAndLockRequest)));
 }
Example #2
0
 public IResponse VisitGetAndLock(GetAndLockRequest getAndLockRequest)
 {
     return(this.WaitNormalState(getAndLockRequest));
 }
Example #3
0
        private IResponse[] GetAndLock(Take take)
        {
            while (true)
            {
                int getAndLockRequestNumber         = this.client.GetRequestNumber();
                int unlockRequestNumber             = 0;
                GetAndLockRequest getAndLockRequest = new GetAndLockRequest(
                    this.client.ViewNumber,
                    this.client.Id,
                    getAndLockRequestNumber,
                    take.Tuple);
                IResponse[] responses = { };

                while (this.client.ViewServers.Length != responses.Length)
                {
                    int   numberOfLockedRequests = this.client.ViewServers.Length;
                    Uri[] servers = this.client.ViewServers;
                    responses = this.messageServiceClient.RequestMulticast(
                        getAndLockRequest,
                        servers,
                        numberOfLockedRequests,
                        Timeout.TIMEOUT_XL_CLIENT,
                        true).ToArray();

                    if (responses.Length != this.client.ViewServers.Length)
                    {
                        this.client.DoHandShake();
                        getAndLockRequest.ViewNumber = this.client.ViewNumber;
                    }

                    if (responses.Length == 0)
                    {
                        continue;
                    }

                    // Check if refused
                    // No-one refused
                    if (responses.Length == numberOfLockedRequests)
                    {
                        return(responses);
                    }

                    // Some refused but the majority locked
                    if (responses.Length >= (numberOfLockedRequests / 2) + 1)
                    {
                        continue;
                    }

                    if (this.client.RequestNumber == getAndLockRequestNumber)
                    {
                        unlockRequestNumber = this.client.GetRequestNumber();
                    }
                    // The majority didn't lock so it's needed to unlock
                    UnlockRequest unlockRequest = new UnlockRequest(
                        this.client.ViewNumber,
                        this.client.Id,
                        unlockRequestNumber);

                    // Unlock
                    this.messageServiceClient.RequestMulticast(
                        unlockRequest,
                        servers,
                        numberOfLockedRequests,
                        -1,
                        false);
                    break;
                }

                return(responses);
            }
        }