/// <exception cref="CouchbaseBootstrapException">Condition.</exception>
        public override void LoadConfig()
        {
            Lock.EnterWriteLock();
            try
            {
                Log.Info("o3-Creating the Servers list using rev#{0}", BucketConfig.Rev);
                var clientBucketConfig = ClientConfig.BucketConfigs[BucketConfig.Name];
                var searchUris         = new ConcurrentBag <FailureCountingUri>();
                var queryUris          = new ConcurrentBag <FailureCountingUri>();
                var analyticsUris      = new ConcurrentBag <FailureCountingUri>();
                var servers            = new Dictionary <IPEndPoint, IServer>();
                var nodes = BucketConfig.GetNodes();
                foreach (var adapter in nodes)
                {
                    var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);

                    try
                    {
                        IServer server;
                        if (adapter.IsSearchNode)
                        {
                            var uri = UrlUtil.GetFailureCountinSearchBaseUri(adapter, clientBucketConfig);
                            searchUris.Add(uri);
                        }
                        if (adapter.IsQueryNode)
                        {
                            var uri = UrlUtil.GetFailureCountingBaseUri(adapter, clientBucketConfig);
                            queryUris.Add(uri);
                        }
                        if (adapter.IsAnalyticsNode)
                        {
                            var uri = UrlUtil.GetFailureCountingAnalyticsUri(adapter, clientBucketConfig);
                            analyticsUris.Add(uri);
                        }
                        if (adapter.IsDataNode) //a data node so create a connection pool
                        {
                            var uri = UrlUtil.GetBaseUri(adapter, clientBucketConfig);
                            var poolConfiguration = ClientConfig.BucketConfigs[BucketConfig.Name].ClonePoolConfiguration(uri);

                            var newIoService = CreateIOService(poolConfiguration, endpoint);

                            server = new Core.Server(newIoService, adapter, Transcoder, QueryCache, this);

                            SupportsEnhancedDurability     = newIoService.SupportsEnhancedDurability;
                            SupportsSubdocXAttributes      = newIoService.SupportsSubdocXAttributes;
                            SupportsEnhancedAuthentication = newIoService.SupportsEnhancedAuthentication;
                            SupportsKvErrorMap             = newIoService.SupportsKvErrorMap;
                        }
                        else
                        {
                            server = new Core.Server(null, adapter, Transcoder, QueryCache, this);
                        }
                        servers.Add(endpoint, server);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Could not add server {0}. Exception: {1}", endpoint, e);
                    }
                }

                UpdateServices(servers);

                //for caching uri's
                Interlocked.Exchange(ref QueryUris, queryUris);
                Interlocked.Exchange(ref SearchUris, searchUris);
                Interlocked.Exchange(ref AnalyticsUris, analyticsUris);

                SwapServers(servers);

                var vBucketKeyMapper = new VBucketKeyMapper(Servers,
                                                            BucketConfig.GetBucketServerMap(clientBucketConfig.UseSsl),
                                                            BucketConfig.Rev,
                                                            BucketConfig.Name);

                Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }
        /// <exception cref="CouchbaseBootstrapException">Condition.</exception>
        public void LoadConfig(IIOService ioService)
        {
            try
            {
                Lock.EnterWriteLock();
                Log.Info("o2-Creating the Servers list using rev#{0}", BucketConfig.Rev);

                var searchUris         = new ConcurrentBag <FailureCountingUri>();
                var queryUris          = new ConcurrentBag <FailureCountingUri>();
                var analyticsUris      = new ConcurrentBag <FailureCountingUri>();
                var clientBucketConfig = ClientConfig.BucketConfigs[BucketConfig.Name];
                var servers            = new Dictionary <IPEndPoint, IServer>();
                var nodes = BucketConfig.GetNodes();
                foreach (var adapter in nodes)
                {
                    var endpoint = adapter.GetIPEndPoint(clientBucketConfig.UseSsl);
                    try
                    {
                        IServer server = null;

                        //The node does not have to be created or swapped out so reuse the existing mode
                        if (Servers.TryGetValue(endpoint, out IServer cachedServer))
                        {
                            Log.Info("Reusing node {0} for rev#{1}", endpoint, BucketConfig.Rev);
                            servers.Add(endpoint, cachedServer);
                        }
                        else
                        {
                            Log.Info("Creating node {0} for rev#{1}", endpoint, BucketConfig.Rev);
                            if (Equals(ioService.EndPoint, endpoint) || nodes.Count == 1)
                            {
                                server = new Core.Server(ioService, adapter, Transcoder, QueryCache, this);
                                SupportsEnhancedDurability     = ioService.SupportsEnhancedDurability;
                                SupportsSubdocXAttributes      = ioService.SupportsSubdocXAttributes;
                                SupportsEnhancedAuthentication = ioService.SupportsEnhancedAuthentication;
                                SupportsKvErrorMap             = ioService.SupportsKvErrorMap;
                            }
                            else
                            {
                                if (adapter.IsDataNode) //a data node so create a connection pool
                                {
                                    var uri = UrlUtil.GetBaseUri(adapter, clientBucketConfig);
                                    var poolConfiguration = ClientConfig.BucketConfigs[BucketConfig.Name]
                                                            .ClonePoolConfiguration(uri);

                                    var newIoService = CreateIOService(poolConfiguration, endpoint);

                                    server = new Core.Server(newIoService, adapter, Transcoder, QueryCache, this);

                                    //Note: "ioService has" already made a HELO command to check what features
                                    //the cluster supports (eg enhanced durability) so we are reusing the flag
                                    //instead of having "newIoService" do it again, later.
                                    SupportsEnhancedDurability     = ioService.SupportsEnhancedDurability;
                                    SupportsSubdocXAttributes      = ioService.SupportsSubdocXAttributes;
                                    SupportsEnhancedAuthentication = ioService.SupportsEnhancedAuthentication;
                                    SupportsKvErrorMap             = ioService.SupportsKvErrorMap;
                                }
                                else
                                {
                                    server = new Core.Server(null, adapter, Transcoder, QueryCache, this);
                                }
                            }
                        }

                        if (adapter.IsQueryNode)
                        {
                            var uri = UrlUtil.GetFailureCountingBaseUri(adapter, clientBucketConfig);
                            queryUris.Add(uri);
                        }
                        if (adapter.IsSearchNode)
                        {
                            var uri = UrlUtil.GetFailureCountinSearchBaseUri(adapter, clientBucketConfig);
                            searchUris.Add(uri);
                        }
                        if (adapter.IsAnalyticsNode)
                        {
                            var uri = UrlUtil.GetFailureCountingAnalyticsUri(adapter, clientBucketConfig);
                            analyticsUris.Add(uri);
                        }

                        servers.Add(endpoint, server);
                    }
                    catch (Exception e)
                    {
                        Log.Error("Could not add server {0}. Exception: {1}", endpoint, e);
                    }
                }

                UpdateServices(servers);

                //for caching uri's
                Interlocked.Exchange(ref QueryUris, queryUris);
                Interlocked.Exchange(ref SearchUris, searchUris);
                Interlocked.Exchange(ref AnalyticsUris, analyticsUris);

                SwapServers(servers);

                Log.Info("Creating the KeyMapper list using rev#{0}", BucketConfig.Rev);
                var vBucketKeyMapper = new VBucketKeyMapper(Servers,
                                                            BucketConfig.GetBucketServerMap(clientBucketConfig.UseSsl),
                                                            BucketConfig.Rev,
                                                            BucketConfig.Name);

                Interlocked.Exchange(ref KeyMapper, vBucketKeyMapper);
            }
            finally
            {
                Lock.ExitWriteLock();
            }
        }