public IResponse VisitGetAndLock(GetAndLockRequest getAndLockRequest) { return(ExecuteRequest(getAndLockRequest, new GetAndLockExecutor(getAndLockRequest))); }
public IResponse VisitGetAndLock(GetAndLockRequest getAndLockRequest) { return(this.WaitNormalState(getAndLockRequest)); }
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); } }