/// <summary> /// Observes a set of keys at a specified interval and timeout. /// </summary> /// <param name="observe">The func to call at the specific interval</param> /// <param name="observeParams">The parameters to pass in.</param> /// <param name="interval">The interval to check.</param> /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use to terminate the observation at the specified timeout.</param> /// <returns>True if the durability requirements specified by <see cref="PersistTo"/> and <see cref="ReplicateTo"/> have been satisfied.</returns> static async Task <bool> ObserveEvery(Func <ObserveParams, Task <bool> > observe, ObserveParams observeParams, int interval, ObserveSeqno op, CancellationToken cancellationToken) { while (true) { var result = await observe(observeParams).ContinueOnAnyContext(); if (result) { return(true); } var task = Task.Delay(interval, cancellationToken).ContinueOnAnyContext(); try { await task; } catch (TaskCanceledException) { return(false); } //prepare for a second attempt op = (ObserveSeqno)op.Clone(); observeParams.Reset(); } }
static Task <bool> CheckReplicaAsync(ObserveParams observeParams, ObserveSeqno op, int replicaId) { var cloned = (ObserveSeqno)op.Clone(); var replica = observeParams.VBucket.LocateReplica(replicaId); var result = replica.Send(cloned); observeParams.CheckMutationLost(result.Value); observeParams.CheckPersisted(result.Value); observeParams.CheckReplicated(result.Value); return(Task.FromResult(observeParams.IsDurabilityMet())); }
/// <summary> /// Checks a replica for durability constraints. /// </summary> /// <param name="observeParams">The observe parameters.</param> /// <param name="op">The op.</param> /// <param name="replicaId">The replica identifier.</param> /// <returns></returns> private bool CheckReplica(ObserveParams observeParams, ObserveSeqno op, int replicaId) { var cloned = (ObserveSeqno)op.Clone(); var replica = observeParams.VBucket.LocateReplica(replicaId); var result = replica.Send(cloned); observeParams.CheckMutationLost(result); observeParams.CheckPersisted(result); observeParams.CheckReplicated(result); return(observeParams.IsDurabilityMet()); }
/// <summary> /// Observes the specified key using the Seqno. /// </summary> /// <param name="key">The key.</param> /// <param name="token">The token.</param> /// <param name="replicateTo">The replicate to.</param> /// <param name="persistTo">The persist to.</param> /// <returns>True if durability constraints were matched.</returns> /// <exception cref="DocumentMutationLostException">Thrown if the observed document was lost during /// a hard failover because the document did not reach the replica in time.</exception> /// <exception cref="ReplicaNotConfiguredException">Thrown if the number of replicas requested /// in the ReplicateTo parameter does not match the # of replicas configured on the server.</exception> public bool Observe(MutationToken token, ReplicateTo replicateTo, PersistTo persistTo) { var keyMapper = (VBucketKeyMapper)_configInfo.GetKeyMapper(); var p = new ObserveParams { ReplicateTo = replicateTo, PersistTo = persistTo, Token = token, VBucket = keyMapper[token.VBucketId] }; p.CheckConfiguredReplicas(); var op = new ObserveSeqno(p.Token, _transcoder, _timeout); do { var master = p.VBucket.LocatePrimary(); var result = master.Send(op); var osr = result.Value; p.CheckMutationLost(osr); p.CheckPersisted(osr); if (p.IsDurabilityMet()) { return(true); } if (CheckReplicas(p, op)) { return(true); } //prepare for another attempt op = (ObserveSeqno)op.Clone(); p.Reset(); } while (!op.TimedOut()); return(false); }
static Task<bool> CheckReplicaAsync(ObserveParams observeParams, ObserveSeqno op, int replicaId) { var cloned = (ObserveSeqno)op.Clone(); var replica = observeParams.VBucket.LocateReplica(replicaId); var result = replica.Send(cloned); observeParams.CheckMutationLost(result.Value); observeParams.CheckPersisted(result.Value); observeParams.CheckReplicated(result.Value); return Task.FromResult(observeParams.IsDurabilityMet()); }
/// <summary> /// Observes the specified key using the Seqno. /// </summary> /// <param name="key">The key.</param> /// <param name="token">The token.</param> /// <param name="replicateTo">The replicate to.</param> /// <param name="persistTo">The persist to.</param> /// <returns>True if durability constraints were matched.</returns> /// <exception cref="DocumentMutationLostException">Thrown if the observed document was lost during /// a hard failover because the document did not reach the replica in time.</exception> /// <exception cref="ReplicaNotConfiguredException">Thrown if the number of replicas requested /// in the ReplicateTo parameter does not match the # of replicas configured on the server.</exception> public bool Observe(MutationToken token, ReplicateTo replicateTo, PersistTo persistTo) { var keyMapper = (VBucketKeyMapper)_configInfo.GetKeyMapper(); var p = new ObserveParams { ReplicateTo = replicateTo, PersistTo = persistTo, Token = token, VBucket = keyMapper[token.VBucketId] }; p.CheckConfiguredReplicas(); var op = new ObserveSeqno(p.Token, _transcoder, _timeout); do { var master = p.VBucket.LocatePrimary(); var result = master.Send(op); var osr = result.Value; p.CheckMutationLost(osr); p.CheckPersisted(osr); if (p.IsDurabilityMet()) { return true; } if (CheckReplicas(p, op)) { return true; } //prepare for another attempt op = (ObserveSeqno)op.Clone(); p.Reset(); } while (!op.TimedOut()); return false; }
/// <summary> /// Observes a set of keys at a specified interval and timeout. /// </summary> /// <param name="observe">The func to call at the specific interval</param> /// <param name="observeParams">The parameters to pass in.</param> /// <param name="interval">The interval to check.</param> /// <param name="cancellationToken">The <see cref="CancellationToken"/> to use to terminate the observation at the specified timeout.</param> /// <returns>True if the durability requirements specified by <see cref="PersistTo"/> and <see cref="ReplicateTo"/> have been satisfied.</returns> static async Task<bool> ObserveEvery(Func<ObserveParams, Task<bool>> observe, ObserveParams observeParams, int interval, ObserveSeqno op, CancellationToken cancellationToken) { while (true) { var result = await observe(observeParams).ContinueOnAnyContext(); if (result) { return true; } var task = Task.Delay(interval, cancellationToken).ContinueOnAnyContext(); try { await task; } catch (TaskCanceledException) { return false; } //prepare for a second attempt op = (ObserveSeqno)op.Clone(); observeParams.Reset(); } }
/// <summary> /// Checks a replica for durability constraints. /// </summary> /// <param name="observeParams">The observe parameters.</param> /// <param name="op">The op.</param> /// <param name="replicaId">The replica identifier.</param> /// <returns></returns> private bool CheckReplica(ObserveParams observeParams, ObserveSeqno op, int replicaId) { var cloned = (ObserveSeqno)op.Clone(); var replica = observeParams.VBucket.LocateReplica(replicaId); var result = replica.Send(cloned); observeParams.CheckMutationLost(result); observeParams.CheckPersisted(result); observeParams.CheckReplicated(result); return observeParams.IsDurabilityMet(); }