/// <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(); } }