Exemplo n.º 1
0
        private IRequestExecuter GetRequestExecuterForDatabase(AsyncServerClient serverClient, string databaseName, ClusterBehavior clusterBehavior, bool incrementStrippingBase)
        {
            var key = Url;

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

            IRequestExecuter requestExecuter;

            if (clusterBehavior == ClusterBehavior.None)
            {
                requestExecuter = new ReplicationAwareRequestExecuter(replicationInformers.GetOrAdd(key, url => Conventions.ReplicationInformerFactory(url, jsonRequestFactory)), GetRequestTimeMetricForDatabase(databaseName));
            }
            else
            {
                requestExecuter = clusterAwareRequestExecuters.GetOrAdd(key, url => new ClusterAwareRequestExecuter());
            }

            requestExecuter.GetReadStripingBase(incrementStrippingBase);

            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);
        }
Exemplo n.º 2
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);
        }