/// <summary> /// Handle the scenario when PersistTo == 1 /// </summary> public IObserveOperationResult HandleMasterPersistence(ICouchbaseServerPool pool) { try { var commandConfig = setupObserveOperation(pool); var node = commandConfig.Item2[0] as CouchbaseNode; IObserveOperationResult result = new ObserveOperationResult(); do { var are = new AutoResetEvent(false); var timer = new Timer(state => { result = node.ExecuteObserveOperation(commandConfig.Item3); if (log.IsDebugEnabled) log.Debug("Node: " + node.EndPoint + ", Result: " + result.KeyState + ", Cas: " + result.Cas + ", Key: " + _settings.Key); if (result.Success && result.Cas != _settings.Cas && result.Cas > 0) { result.Fail(ObserveOperationConstants.MESSAGE_MODIFIED); are.Set(); } else if (result.KeyState == ObserveKeyState.FoundPersisted) { result.Pass(); are.Set(); } }, are, 0, 500); if (!are.WaitOne(_settings.Timeout)) { timer.Change(-1, -1); result.Fail(ObserveOperationConstants.MESSAGE_TIMEOUT, new TimeoutException()); break; } timer.Change(-1, -1); } while (result.Message == string.Empty && result.KeyState != ObserveKeyState.FoundPersisted); return result; } catch (Exception ex) { return new ObserveOperationResult { Success = false, Exception = ex }; } }
public IObserveOperationResult ExecuteObserveOperation(IObserveOperation op) { var readResult = new ObserveOperationResult(); var result = this.Acquire(); if (result.Success && result.HasValue) { try { var socket = result.Value; var b = op.GetBuffer(); socket.Write(b); readResult = op.ReadResponse(socket) as ObserveOperationResult; if (readResult.Success) { readResult.Pass(); } else { readResult.InnerResult = result; readResult.Fail("Failed to read response, see inner result for details"); } return readResult; } catch (IOException e) { log.Error(e); readResult.StatusCode = StatusCode.UnspecifiedError; readResult.Fail("Exception reading response", e); return readResult; } finally { ((IDisposable)result.Value).Dispose(); } } else { result.Combine(readResult); return readResult; } }
private IObserveOperationResult performParallelObserve(ICouchbaseServerPool pool, ObserveKeyState persistedKeyState, ObserveKeyState replicatedKeyState) { var commandConfig = setupObserveOperation(pool); var observedNodes = commandConfig.Item2.Select(n => new ObservedNode { Node = n as CouchbaseNode, IsMaster = n == commandConfig.Item2[0] }).ToArray(); var replicaFoundCount = 0; var replicaPersistedCount = 0; var isKeyPersistedToMaster = false; IObserveOperationResult result = new ObserveOperationResult(); do { var are = new AutoResetEvent(false); var timer = new Timer(state => { result = checkNodesForKey(observedNodes, commandConfig.Item3, ref isKeyPersistedToMaster, ref replicaFoundCount, ref replicaPersistedCount, persistedKeyState, replicatedKeyState); if (result.Message == ObserveOperationConstants.MESSAGE_MODIFIED) { are.Set(); result.Fail(ObserveOperationConstants.MESSAGE_MODIFIED); } else if (isInExpectedState(replicaFoundCount, replicaPersistedCount, isKeyPersistedToMaster)) { result.Pass(); are.Set(); } }, are, 0, 500); if (!are.WaitOne(_settings.Timeout)) { timer.Change(-1, -1); result.Fail(ObserveOperationConstants.MESSAGE_TIMEOUT, new TimeoutException()); return result; } if (result.Success) { timer.Change(-1, -1); } } while (result.Message == string.Empty && !isInExpectedState(replicaFoundCount, replicaPersistedCount, isKeyPersistedToMaster)); return result; }
public IObserveOperationResult HandleMasterPersistence(ICouchbaseServerPool pool, ObserveKeyState passingState = ObserveKeyState.FoundPersisted) { try { var commandConfig = SetupObserveOperation(pool); var node = commandConfig.CouchbaseNodes[0]; IObserveOperationResult result = new ObserveOperationResult(); do { var are = new AutoResetEvent(false); var timer = new Timer(state => { result = node.ExecuteObserveOperation(commandConfig.Operation); if (Log.IsDebugEnabled) Log.Debug("Node: " + node.EndPoint + ", Result: " + result.KeyState + ", Cas: " + result.Cas + ", Key: " + _settings.Key); if (result.Success && result.Cas != _settings.Cas && result.Cas > 0 && passingState == ObserveKeyState.FoundPersisted) //don't check CAS for deleted items { result.Fail(ObserveOperationConstants.MESSAGE_MODIFIED); are.Set(); } else if (result.KeyState == passingState || (result.KeyState == ObserveKeyState.FoundPersisted && passingState == ObserveKeyState.FoundNotPersisted)) //if checking in memory, on disk should pass too { //though in memory checks are supported in this condition //a miss will require a timeout result.Pass(); are.Set(); } }, are, 0, 500); if (!are.WaitOne(_settings.Timeout)) { timer.Change(-1, -1); result.Fail(ObserveOperationConstants.MESSAGE_TIMEOUT, new TimeoutException()); break; } timer.Change(-1, -1); } while (result.Message == string.Empty && result.KeyState != passingState); return result; } catch (ObserveExpectationException ex) { return new ObserveOperationResult { Success = false, Message = ex.Message }; } catch (Exception ex) { return new ObserveOperationResult { Success = false, Exception = ex }; } }