/// <summary> /// Sends an operation to the server while observing it's durability requirements /// </summary> /// <param name="operation">A binary memcached operation - must be a mutation operation.</param> /// <param name="deletion">True if mutation is a deletion.</param> /// <param name="replicateTo">The durability requirement for replication.</param> /// <param name="persistTo">The durability requirement for persistence.</param> /// <returns>The <see cref="IOperationResult"/> with it's <see cref="Durability"/> status.</returns> public override IOperationResult SendWithDurability(IOperation operation, bool deletion, ReplicateTo replicateTo, PersistTo persistTo) { //Is the cluster configured for Data services? if (!ConfigInfo.IsDataCapable) { throw new ServiceNotSupportedException("The cluster does not support Data services."); } var result = SendWithRetry(operation); if (result.Success) { var config = ConfigInfo.ClientConfig.BucketConfigs[BucketName]; var observer = new KeyObserver(ConfigInfo, ClusterController.Transcoder, config.ObserveInterval, config.ObserveTimeout); var observed = observer.Observe(operation.Key, result.Cas, deletion, replicateTo, persistTo); result.Durability = observed ? Durability.Satisfied : Durability.NotSatisfied; } else { result.Durability = Durability.NotSatisfied; } return(result); }
/// <summary> /// Sends an operation to the server while observing it's durability requirements /// </summary> /// <typeparam name="T">The value for T.</typeparam> /// <param name="operation">A binary memcached operation - must be a mutation operation.</param> /// <param name="deletion">True if mutation is a deletion.</param> /// <param name="replicateTo">The durability requirement for replication.</param> /// <param name="persistTo">The durability requirement for persistence.</param> /// <returns>The <see cref="IOperationResult{T}"/> with it's <see cref="Durability"/> status.</returns> public override IOperationResult <T> SendWithDurability <T>(IOperation <T> operation, bool deletion, ReplicateTo replicateTo, PersistTo persistTo) { var result = SendWithRetry(operation); if (result.Success) { var config = ConfigInfo.ClientConfig.BucketConfigs[BucketName]; var observer = new KeyObserver(ConfigInfo, ClusterController.Transcoder, config.ObserveInterval, config.ObserveTimeout); var observed = observer.Observe(operation.Key, result.Cas, deletion, replicateTo, persistTo); result.Durability = observed ? Durability.Satisfied : Durability.NotSatisfied; } else { result.Durability = Durability.NotSatisfied; } return(result); }
/// <summary> /// Sends an operation to the server while observing it's durability requirements /// </summary> /// <param name="operation">A binary memcached operation - must be a mutation operation.</param> /// <param name="deletion">True if mutation is a deletion.</param> /// <param name="replicateTo">The durability requirement for replication.</param> /// <param name="persistTo">The durability requirement for persistence.</param> /// <returns>The <see cref="IOperationResult"/> with it's <see cref="Durability"/> status.</returns> /// <exception cref="ServiceNotSupportedException">The cluster does not support Data services.</exception> public override IOperationResult SendWithDurability(IOperation operation, bool deletion, ReplicateTo replicateTo, PersistTo persistTo) { //Is the cluster configured for Data services? if (!ConfigInfo.IsDataCapable) { throw new ServiceNotSupportedException("The cluster does not support Data services."); } IOperationResult result; try { result = SendWithRetry(operation); if (result.Success) { var config = ConfigInfo.ClientConfig.BucketConfigs[BucketName]; if (ConfigInfo.SupportsEnhancedDurability) { var seqnoObserver = new KeySeqnoObserver(ConfigInfo, ClusterController.Transcoder, config.ObserveInterval, (uint)config.ObserveTimeout); var observed = seqnoObserver.Observe(result.Token, replicateTo, persistTo); result.Durability = observed ? Durability.Satisfied : Durability.NotSatisfied; } else { var observer = new KeyObserver(ConfigInfo, ClusterController.Transcoder, config.ObserveInterval, config.ObserveTimeout); var observed = observer.Observe(operation.Key, result.Cas, deletion, replicateTo, persistTo); result.Durability = observed ? Durability.Satisfied : Durability.NotSatisfied; } } else { result.Durability = Durability.NotSatisfied; } } catch (ReplicaNotConfiguredException e) { result = new OperationResult { Exception = e, Status = ResponseStatus.NoReplicasFound, Durability = Durability.NotSatisfied }; } catch (DocumentMutationLostException e) { result = new OperationResult { Exception = e, Status = ResponseStatus.DocumentMutationLost, Durability = Durability.NotSatisfied }; } catch (Exception e) { result = new OperationResult { Exception = e, Status = ResponseStatus.ClientFailure }; } return(result); }