public async Task InitializeAsync() { // DNS-SRV if (ClusterOptions.IsValidDnsSrv()) { try { var dnsResolver = ServiceProvider.GetRequiredService <IDnsResolver>(); var bootstrapUri = ClusterOptions.ConnectionStringValue.GetDnsBootStrapUri(); var servers = (await dnsResolver.GetDnsSrvEntriesAsync(bootstrapUri)).ToList(); if (servers.Any()) { _logger.LogInformation($"Successfully retrieved DNS SRV entries: [{string.Join(",", servers)}]"); ClusterOptions.Servers(servers); } } catch (Exception exception) { _logger.LogInformation(exception, "Error trying to retrieve DNS SRV entries."); } } foreach (var server in ClusterOptions.ServersValue) { var bsEndpoint = server.GetIpEndPoint(ClusterOptions.KvPort, ClusterOptions.EnableIPV6Addressing); var node = await _clusterNodeFactory.CreateAndConnectAsync(bsEndpoint); node.BootstrapUri = server; GlobalConfig = await node.GetClusterMap(); if (GlobalConfig == null) //TODO NCBC-1966 xerror info is being hidden, so on failure this will not be null { AddNode(node); //GCCCP is not supported - pre-6.5 server fall back to CCCP like SDK 2 } else { GlobalConfig.IsGlobal = true; foreach (var nodeAdapter in GlobalConfig.GetNodes()) //Initialize cluster nodes for global services { if (server.Host.Equals(nodeAdapter.Hostname)) //this is the bootstrap node so update { node.BootstrapUri = server; node.NodesAdapter = nodeAdapter; node.BuildServiceUris(); SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(node); } else { var endpoint = nodeAdapter.GetIpEndPoint(ClusterOptions.EnableTls); if (endpoint.Port == 0) { endpoint.Port = 11210; } var newNode = await _clusterNodeFactory.CreateAndConnectAsync(endpoint); newNode.BootstrapUri = server; newNode.NodesAdapter = nodeAdapter; newNode.BuildServiceUris(); SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(newNode); } } } } }
public async Task BootstrapGlobalAsync() { if (ClusterOptions.ConnectionStringValue == null) { throw new InvalidOperationException("ConnectionString has not been set."); } if (ClusterOptions.ConnectionStringValue.IsValidDnsSrv()) { try { // Always try to use DNS SRV to bootstrap if connection string is valid // It can be disabled by returning an empty URI list from IDnsResolver var dnsResolver = ServiceProvider.GetRequiredService <IDnsResolver>(); var bootstrapUri = ClusterOptions.ConnectionStringValue.GetDnsBootStrapUri(); var servers = (await dnsResolver.GetDnsSrvEntriesAsync(bootstrapUri, CancellationToken).ConfigureAwait(false)).ToList(); if (servers.Any()) { _logger.LogInformation( $"Successfully retrieved DNS SRV entries: [{_redactor.SystemData(string.Join(",", servers))}]"); ClusterOptions.ConnectionStringValue = new ConnectionString(ClusterOptions.ConnectionStringValue, servers); } } catch (Exception exception) { _logger.LogInformation(exception, "Error trying to retrieve DNS SRV entries."); } } //Try to bootstrap each node in the servers list - either from DNS-SRV lookup or from client configuration foreach (var server in ClusterOptions.ConnectionStringValue.GetBootstrapEndpoints(ClusterOptions.EnableTls)) { _logger.LogDebug("Bootstrapping with node {server}", server.Host); var node = await _clusterNodeFactory. CreateAndConnectAsync(server, BucketType.Couchbase, CancellationToken). ConfigureAwait(false); try { GlobalConfig = await node.GetClusterMap().ConfigureAwait(false); } catch (CouchbaseException e) { if (e.Context is KeyValueErrorContext ctx) { if (ctx.Status == ResponseStatus.BucketNotConnected) { AddNode(node); //GCCCP is not supported - pre-6.5 server fall back to CCCP like SDK 2 return; } } } try { //Server is 6.5 and greater and supports GC3P so loop through the global config and //create the nodes that are not associated with any buckets via Select Bucket. GlobalConfig.IsGlobal = true; GlobalConfig.NetworkResolution = ClusterOptions.NetworkResolution; foreach (var nodeAdapter in GlobalConfig.GetNodes()) //Initialize cluster nodes for global services { //log any alternate address mapping _logger.LogInformation(nodeAdapter.ToString()); if (server.Host.Equals(nodeAdapter.Hostname)) //this is the bootstrap node so update { node.NodesAdapter = nodeAdapter; SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(node); } else { var hostEndpoint = HostEndpoint.Create(nodeAdapter, ClusterOptions); var newNode = await _clusterNodeFactory .CreateAndConnectAsync(hostEndpoint, BucketType.Couchbase, nodeAdapter, CancellationToken).ConfigureAwait(false); SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(newNode); } } } catch (Exception e) { _logger.LogDebug("Attempted bootstrapping on endpoint {endpoint} has failed.", e, server); } } }
public async Task BootstrapGlobalAsync() { if (ClusterOptions.ConnectionStringValue == null) { throw new InvalidOperationException("ConnectionString has not been set."); } if (ClusterOptions.ConnectionStringValue.IsValidDnsSrv()) { try { // Always try to use DNS SRV to bootstrap if connection string is valid // It can be disabled by returning an empty URI list from IDnsResolver var dnsResolver = ServiceProvider.GetRequiredService <IDnsResolver>(); var bootstrapUri = ClusterOptions.ConnectionStringValue.GetDnsBootStrapUri(); var servers = (await dnsResolver.GetDnsSrvEntriesAsync(bootstrapUri, CancellationToken).ConfigureAwait(false)).ToList(); if (servers.Any()) { _logger.LogInformation( $"Successfully retrieved DNS SRV entries: [{_redactor.SystemData(string.Join(",", servers))}]"); ClusterOptions.ConnectionStringValue = new ConnectionString(ClusterOptions.ConnectionStringValue, servers); } } catch (Exception exception) { _logger.LogInformation(exception, "Error trying to retrieve DNS SRV entries."); } } foreach (var server in ClusterOptions.ConnectionStringValue.GetBootstrapEndpoints(ClusterOptions.EnableTls)) { var node = await _clusterNodeFactory.CreateAndConnectAsync(server, CancellationToken).ConfigureAwait(false); GlobalConfig = await node.GetClusterMap().ConfigureAwait(false); if (GlobalConfig == null) { AddNode(node); //GCCCP is not supported - pre-6.5 server fall back to CCCP like SDK 2 } else { GlobalConfig.IsGlobal = true; foreach (var nodeAdapter in GlobalConfig.GetNodes()) //Initialize cluster nodes for global services { if (server.Host.Equals(nodeAdapter.Hostname)) //this is the bootstrap node so update { node.NodesAdapter = nodeAdapter; SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(node); } else { var hostEndpoint = HostEndpoint.Create(nodeAdapter, ClusterOptions); var newNode = await _clusterNodeFactory.CreateAndConnectAsync(hostEndpoint, CancellationToken).ConfigureAwait(false); newNode.NodesAdapter = nodeAdapter; SupportsCollections = node.Supports(ServerFeatures.Collections); AddNode(newNode); } } } } }