예제 #1
0
 public Core(IRequestExecuter requestExecuter, ICoreRequestGenerator requestGenerator, Options options)
 {
     OAuth2 = new OAuth2(requestExecuter, requestGenerator.OAuth2, options);
     Accounts = new Accounts(requestExecuter, requestGenerator.Accounts);
     Metadata = new Metadata(requestExecuter, requestGenerator.Metadata, options);
     FileOperations = new FileOperations(requestExecuter, requestGenerator.FileOperations, options);
 }
예제 #2
0
 public Business(IRequestExecuter requestExecuter, IRequestGenerator requestGenerator, Options options)
 {
     Info = new Info(requestExecuter, requestGenerator.Business.TeamInfo, options);
     Members = new Members(requestExecuter, requestGenerator.Business.TeamMembers, options);
     Reports = new Reports(requestExecuter, requestGenerator.Business.Reports, options);
     AuditLog = new AuditLog(requestExecuter, requestGenerator.Business.AuditLog, options);
 }
예제 #3
0
 public Business(IRequestExecuter requestExecuter, IRequestGenerator requestGenerator)
 {
     Info = new Info(requestExecuter, requestGenerator.Business.TeamInfo);
     Members = new Members(requestExecuter, requestGenerator.Business.TeamMembers);
     Reports = new Reports(requestExecuter, requestGenerator.Business.Reports);
     AuditLog = new AuditLog(requestExecuter, requestGenerator.Business.AuditLog);
     Groups = new Groups(requestExecuter, requestGenerator.Business.Groups);
 }
예제 #4
0
 public Accounts(IRequestExecuter requestExecuter, IAccountsRequestGenerator requestGenerator)
 {
     _requestExecuter = requestExecuter;
     _requestGenerator = requestGenerator;
 }
예제 #5
0
 public Info(IRequestExecuter requestExecuter, ITeamInfoRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options = options;
     _requestExecuter = requestExecuter;
 }
예제 #6
0
        private IRequestExecuter GetRequestExecuterForDatabase(AsyncServerClient serverClient, string databaseName,
                                                               bool incrementStrippingBase)
        {
            var key = Url;

            if (string.IsNullOrEmpty(databaseName) == false)
            {
                key = MultiDatabase.GetRootDatabaseUrl(Url) + "/databases/" + databaseName;
            }

            var originalKey = MultiDatabase.GetRootDatabaseUrl(Url);

            IRequestExecuter requestExecuter;
            IRequestExecuter originalRequestExecuter = null;

            if (Conventions.FailoverBehavior == FailoverBehavior.ReadFromLeaderWriteToLeader ||
                Conventions.FailoverBehavior == FailoverBehavior.ReadFromLeaderWriteToLeaderWithFailovers ||
                Conventions.FailoverBehavior == FailoverBehavior.ReadFromAllWriteToLeader ||
                Conventions.FailoverBehavior == FailoverBehavior.ReadFromAllWriteToLeaderWithFailovers)
            {
                requestExecuter = clusterAwareRequestExecuters.GetOrAdd(key, url => new ClusterAwareRequestExecuter());
                if (originalKey != key)
                {
                    originalRequestExecuter = clusterAwareRequestExecuters.GetOrAdd(originalKey, url => new ClusterAwareRequestExecuter());
                }
            }
            else
            {
                requestExecuter = new ReplicationAwareRequestExecuter(replicationInformers.GetOrAdd(key, url => Conventions.ReplicationInformerFactory(url, jsonRequestFactory, GetRequestTimeMetricForUrl)));
                if (originalKey != key)
                {
                    originalRequestExecuter = new ReplicationAwareRequestExecuter(replicationInformers.GetOrAdd(originalKey, url => Conventions.ReplicationInformerFactory(url, jsonRequestFactory, GetRequestTimeMetricForUrl)));
                }
            }

            if (incrementStrippingBase || originalRequestExecuter == null)
            {
                requestExecuter.GetReadStripingBase(incrementStrippingBase);
            }
            else
            {
                requestExecuter.SetReadStripingBase(originalRequestExecuter.GetReadStripingBase(false));
            }

            if (FailoverServers == null)
            {
                return(requestExecuter);
            }

            if (databaseName == DefaultDatabase)
            {
                if (FailoverServers.IsSetForDefaultDatabase && requestExecuter.FailoverServers == null)
                {
                    requestExecuter.FailoverServers = FailoverServers.ForDefaultDatabase;
                }
            }
            else
            {
                if (FailoverServers.IsSetForDatabase(databaseName) && requestExecuter.FailoverServers == null)
                {
                    requestExecuter.FailoverServers = FailoverServers.GetForDatabase(databaseName);
                }
            }

            return(requestExecuter);
        }
예제 #7
0
 public Groups(IRequestExecuter requestExecuter, IGroupsRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter = requestExecuter;
 }
예제 #8
0
 public Reports(IRequestExecuter requestExecuter, IReportsRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options = options;
     _requestExecuter = requestExecuter;
 }
예제 #9
0
 public Info(IRequestExecuter requestExecuter, ITeamInfoRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter = requestExecuter;
 }
예제 #10
0
 public Reports(IRequestExecuter requestExecuter, IReportsRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options          = options;
     _requestExecuter  = requestExecuter;
 }
예제 #11
0
 public Reports(IRequestExecuter requestExecuter, IReportsRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter = requestExecuter;
 }
예제 #12
0
 public LogsReporter(IReporter testReporter, IClientService service, IExtensionManager extensionManager, IRequestExecuter requestExecuter, ILogRequestAmender logRequestAmender)
 {
     _reporter          = testReporter;
     _service           = service;
     _extensionManager  = extensionManager;
     _requestExecuter   = requestExecuter;
     _logRequestAmender = logRequestAmender;
 }
예제 #13
0
 public AuditLog(IRequestExecuter requestExecuter, IAuditLogRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options = options;
     _requestExecuter = requestExecuter;
 }
예제 #14
0
 public Reports(IRequestExecuter requestExecuter, IReportsRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter  = requestExecuter;
 }
예제 #15
0
 public FileOperations(IRequestExecuter requestExecuter, IFileOperationsRequestGenerator requestGenerator, Options options)
 {
     _requestExecuter = requestExecuter;
     _requestGenerator = requestGenerator;
     _options = options;
 }
예제 #16
0
 public Metadata(IRequestExecuter requestExecuter, IMetadataRequestGenerator requestGenerator, Options options)
 {
     _requestExecuter  = requestExecuter;
     _requestGenerator = requestGenerator;
     _options          = options;
 }
예제 #17
0
 public Accounts(IRequestExecuter requestExecuter, IAccountsRequestGenerator requestGenerator)
 {
     _requestExecuter  = requestExecuter;
     _requestGenerator = requestGenerator;
 }
        public static Func <SocketAsyncState, Task> CompletedFuncWithRetryForMemcached <T>(IRequestExecuter executer,
                                                                                           ConcurrentDictionary <uint, IOperation> pending, IClusterController controller,
                                                                                           TaskCompletionSource <IOperationResult <T> > tcs, CancellationToken cancellationToken)
        {
            Func <SocketAsyncState, Task> func = async s =>
            {
                var header = CreateHeader(s, out var errorCode, out var serverDuration);

                IOperation op;
                if (pending.TryRemove(s.Opaque, out op))
                {
                    var actual = (IOperation <T>)op;
                    try
                    {
                        //check if an error occurred earlier
                        if (s.Exception != null)
                        {
                            actual.Exception = s.Exception;
                            actual.HandleClientError(s.Exception.Message, s.Status);
                            tcs.SetResult(actual.GetResultWithValue());
                            return;
                        }

                        var response = s.Data.ToArray();
                        await op.ReadAsync(response, header, errorCode).ContinueOnAnyContext();

                        var result = actual.GetResultWithValue(controller.Configuration.Tracer, executer.ConfigInfo.BucketName);
                        if (result.Success)
                        {
                            tcs.SetResult(result);
                        }
                        else
                        {
                            if (result.IsNmv())
                            {
                                var config = op.GetConfig(controller.ServerConfigTranscoder);
                                if (config != null)
                                {
                                    controller.NotifyConfigPublished(config);
                                }
                            }
                            if (result.IsNmv() || (op.CanRetry() && result.ShouldRetry()))
                            {
                                var retryResult = await executer.RetryOperationEveryAsync((o, c) =>
                                {
                                    var retryTcs = new TaskCompletionSource <IOperationResult <T> >();

                                    var cloned       = o.Clone();
                                    cloned.Completed = CompletedFuncForRetry(pending, controller, retryTcs);
                                    pending.TryAdd(cloned.Opaque, cloned);

                                    var keyMapper  = c.GetKeyMapper();
                                    var mappedNode = keyMapper.MapKey(cloned.Key);

                                    IServer server;
                                    var attempts = 0;
                                    while ((server = mappedNode.LocatePrimary()) == null)
                                    {
                                        if (attempts++ > 10)
                                        {
                                            throw new TimeoutException("Could not acquire a server.");
                                        }
                                        Thread.Sleep((int)Math.Pow(2, attempts));
                                    }
                                    server.SendAsync(o).ContinueOnAnyContext();

                                    return(retryTcs.Task);
                                }, actual, executer.ConfigInfo, cancellationToken).ContinueOnAnyContext();

                                tcs.SetResult(retryResult);
                            }
                            else
                            {
                                ((OperationResult)result).SetException();
                                tcs.SetResult(result);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        op.Exception = e;
                        op.HandleClientError(e.Message, ResponseStatus.ClientFailure);
                        tcs.SetResult(actual.GetResultWithValue());
                    }
                    finally
                    {
                        s.Dispose();
                    }
                }
                else
                {
                    s.Dispose();
                    const string msg = "Cannot find callback object for operation: {0}";
                    tcs.SetException(new InvalidOperationException(string.Format(msg, s.Opaque)));

                    var context = CreateOperationContext(s, serverDuration, executer.ConfigInfo.BucketName);
                    controller.Configuration.OrphanedResponseLogger.Add(context);
                }
            };

            return(func);
        }
예제 #19
0
 public Groups(IRequestExecuter requestExecuter, IGroupsRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter  = requestExecuter;
 }
예제 #20
0
 public Info(IRequestExecuter requestExecuter, ITeamInfoRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options          = options;
     _requestExecuter  = requestExecuter;
 }
예제 #21
0
 public Members(IRequestExecuter requestExecuter, ITeamMembersRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter = requestExecuter;
 }
예제 #22
0
 public AuditLog(IRequestExecuter requestExecuter, IAuditLogRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter = requestExecuter;
 }
예제 #23
0
 public OAuth2(IRequestExecuter requestExecuter, IOAuth2RequestGenerator requestGenerator, Options options)
 {
     _requestExecuter  = requestExecuter;
     _requestGenerator = requestGenerator;
     _options          = options;
 }
예제 #24
0
 public Members(IRequestExecuter requestExecuter, ITeamMembersRequestGenerator requestGenerator, Options options)
 {
     _requestGenerator = requestGenerator;
     _options = options;
     _requestExecuter = requestExecuter;
 }
예제 #25
0
 public Members(IRequestExecuter requestExecuter, ITeamMembersRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter  = requestExecuter;
 }
예제 #26
0
 public Metadata(IRequestExecuter requestExecuter, IMetadataRequestGenerator requestGenerator, Options options)
 {
     _requestExecuter = requestExecuter;
     _requestGenerator = requestGenerator;
     _options = options;
 }
        public static Func <SocketAsyncState, Task> CompletedFuncWithRetryForCouchbase(IRequestExecuter executer,
                                                                                       ConcurrentDictionary <uint, IOperation> pending, IClusterController controller,
                                                                                       TaskCompletionSource <IOperationResult> tcs, CancellationToken cancellationToken)
        {
            Func <SocketAsyncState, Task> func = async s =>
            {
                IOperation op;
                if (pending.TryRemove(s.Opaque, out op))
                {
                    try
                    {
                        if (s.Status == ResponseStatus.TransportFailure)
                        {
                            controller.CheckConfigUpdate(op.BucketName, s.EndPoint);
                        }

                        //check if an error occurred earlier
                        if (s.Exception != null)
                        {
                            op.Exception = s.Exception;
                            op.HandleClientError(s.Exception.Message, s.Status);
                            tcs.SetResult(op.GetResult());
                            return;
                        }

                        var response = s.Data.ToArray();
                        await op.ReadAsync(response).ContinueOnAnyContext();

                        var result = op.GetResult();
                        if (result.Success)
                        {
                            tcs.SetResult(result);
                        }
                        else
                        {
                            if (result.IsNmv())
                            {
                                var config = op.GetConfig(controller.ServerConfigTranscoder);
                                if (config != null)
                                {
                                    controller.NotifyConfigPublished(config);
                                }
                            }
                            if (result.IsNmv() || (op.CanRetry() && result.ShouldRetry()))
                            {
                                Log.Trace("Retry {0} on {1}: {2}", op.Opaque, op.CurrentHost, result.Status);
                                var retryResult = await executer.RetryOperationEveryAsync((o, c) =>
                                {
                                    var retryTcs = new TaskCompletionSource <IOperationResult>();

                                    var cloned       = o.Clone();
                                    cloned.Completed = CompletedFuncForRetry(pending, controller, retryTcs);
                                    pending.TryAdd(cloned.Opaque, cloned);

                                    var keyMapper = c.GetKeyMapper();
                                    var vBucket   = (IVBucket)keyMapper.MapKey(cloned.Key, cloned.LastConfigRevisionTried);
                                    cloned.LastConfigRevisionTried = vBucket.Rev;
                                    cloned.VBucket = vBucket;

                                    IServer server;
                                    var attempts = 0;
                                    while ((server = vBucket.LocatePrimary()) == null)
                                    {
                                        if (attempts++ > 10)
                                        {
                                            throw new TimeoutException("Could not acquire a server.");
                                        }
                                        Thread.Sleep((int)Math.Pow(2, attempts));
                                    }
                                    server.SendAsync(o).ContinueOnAnyContext();

                                    return(retryTcs.Task);
                                }, op, executer.ConfigInfo, cancellationToken).ContinueOnAnyContext();

                                tcs.SetResult(retryResult);
                            }
                            else
                            {
                                ((OperationResult)result).SetException();
                                tcs.SetResult(result);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        op.Exception = e;
                        op.HandleClientError(e.Message, ResponseStatus.ClientFailure);
                        tcs.SetResult(op.GetResult());
                    }
                    finally
                    {
                        s.Dispose();
                    }
                }
                else
                {
                    s.Dispose();
                    const string msg = "Cannot find callback object for operation: {0}";
                    tcs.TrySetException(new InvalidOperationException(string.Format(msg, s.Opaque)));
                }
            };

            return(func);
        }
예제 #28
0
 public OAuth2(IRequestExecuter requestExecuter, IOAuth2RequestGenerator requestGenerator, Options options)
 {
     _requestExecuter = requestExecuter;
     _requestGenerator = requestGenerator;
     _options = options;
 }
예제 #29
0
 public Info(IRequestExecuter requestExecuter, ITeamInfoRequestGenerator requestGenerator)
 {
     _requestGenerator = requestGenerator;
     _requestExecuter  = requestExecuter;
 }