Skip to content

Commit 54fa852

Browse files
committed
Address review feedback
1 parent 772c874 commit 54fa852

File tree

9 files changed

+38
-35
lines changed

9 files changed

+38
-35
lines changed

src/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns/DnsSrvServiceEndpointProviderFactory.cs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,20 +32,26 @@ public bool TryCreateProvider(ServiceEndpointQuery query, [NotNullWhen(true)] ou
3232
// Otherwise, the namespace can be read from /var/run/secrets/kubernetes.io/serviceaccount/namespace and combined with an assumed suffix of "svc.cluster.local".
3333
// The protocol is assumed to be "tcp".
3434
// The portName is the name of the port in the service definition. If the serviceName parses as a URI, we use the scheme as the port name, otherwise "default".
35-
if (optionsValue.GetQueryText == null && string.IsNullOrWhiteSpace(_querySuffix))
35+
if (optionsValue.ServiceDomainNameCallback == null && string.IsNullOrWhiteSpace(_querySuffix))
3636
{
3737
DnsServiceEndpointProviderBase.Log.NoDnsSuffixFound(logger, query.ToString()!);
3838
provider = default;
3939
return false;
4040
}
4141

42-
var srvQuery = optionsValue.GetQueryText != null
43-
? optionsValue.GetQueryText(query)
44-
: optionsValue.GetDefaultQueryText(query);
42+
var srvQuery = optionsValue.ServiceDomainNameCallback != null
43+
? optionsValue.ServiceDomainNameCallback(query)
44+
: DefaultServiceDomainNameCallback(query, optionsValue);
4545
provider = new DnsSrvServiceEndpointProvider(query, srvQuery, hostName: query.ServiceName, options, logger, resolver, timeProvider);
4646
return true;
4747
}
4848

49+
private static string DefaultServiceDomainNameCallback(ServiceEndpointQuery query, DnsSrvServiceEndpointProviderOptions options)
50+
{
51+
var portName = query.EndpointName ?? "default";
52+
return $"_{portName}._tcp.{query.ServiceName}.{options.QuerySuffix}";
53+
}
54+
4955
private static string? GetKubernetesHostDomain()
5056
{
5157
// Check that we are running in Kubernetes first.

src/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns/DnsSrvServiceEndpointProviderOptions.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ public class DnsSrvServiceEndpointProviderOptions
3131
public double RetryBackOffFactor { get; set; } = 2;
3232

3333
/// <summary>
34-
/// Gets or sets the options used to configure the resolver's behavior.
34+
/// Gets or sets the options used to configure the underlying DNS resolution behavior.
3535
/// </summary>
36-
public ResolverOptions ResolverOptions { get; set; } = new();
36+
public DnsResolverOptions DnsResolverOptions { get; set; } = new();
3737

3838
/// <summary>
3939
/// Gets or sets the default DNS query suffix for services resolved via this provider.
@@ -46,16 +46,10 @@ public class DnsSrvServiceEndpointProviderOptions
4646
/// <summary>
4747
/// Gets or sets a delegate that generates a DNS SRV query from a specified <see cref="ServiceEndpointQuery"/> instance.
4848
/// </summary>
49-
public Func<ServiceEndpointQuery, string>? GetQueryText { get; set; }
49+
public Func<ServiceEndpointQuery, string>? ServiceDomainNameCallback { get; set; }
5050

5151
/// <summary>
5252
/// Gets or sets a delegate used to determine whether to apply host name metadata to each resolved endpoint. Defaults to <c>false</c>.
5353
/// </summary>
5454
public Func<ServiceEndpoint, bool> ShouldApplyHostNameMetadata { get; set; } = _ => false;
55-
56-
internal string GetDefaultQueryText(ServiceEndpointQuery query)
57-
{
58-
var portName = query.EndpointName ?? "default";
59-
return $"_{portName}._tcp.{query.ServiceName}.{QuerySuffix}";
60-
}
6155
}

src/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns/Resolver/DnsResolver.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@ internal sealed partial class DnsResolver : IDnsResolver, IDisposable
2525
private static readonly TimeSpan s_maxTimeout = TimeSpan.FromMilliseconds(int.MaxValue);
2626

2727
private bool _disposed;
28-
private readonly ResolverOptions _options;
28+
private readonly DnsResolverOptions _options;
2929
private readonly CancellationTokenSource _pendingRequestsCts = new();
3030
private readonly TimeProvider _timeProvider;
3131
private readonly ILogger<DnsResolver> _logger;
3232

33-
public DnsResolver(TimeProvider timeProvider, ILogger<DnsResolver> logger, ResolverOptions options)
33+
public DnsResolver(TimeProvider timeProvider, ILogger<DnsResolver> logger, DnsResolverOptions options)
3434
{
3535
_timeProvider = timeProvider;
3636
_logger = logger;
@@ -58,23 +58,23 @@ public DnsResolver(TimeProvider timeProvider, ILogger<DnsResolver> logger, Resol
5858
}
5959
}
6060

61-
internal DnsResolver(ResolverOptions options) : this(TimeProvider.System, NullLogger<DnsResolver>.Instance, options)
61+
internal DnsResolver(DnsResolverOptions options) : this(TimeProvider.System, NullLogger<DnsResolver>.Instance, options)
6262
{
6363
}
6464

65-
internal DnsResolver(IEnumerable<IPEndPoint> servers) : this(new ResolverOptions { Servers = servers.ToArray() })
65+
internal DnsResolver(IEnumerable<IPEndPoint> servers) : this(new DnsResolverOptions { Servers = servers.ToArray() })
6666
{
6767
}
6868

69-
internal DnsResolver(IPEndPoint server) : this(new ResolverOptions { Servers = [server] })
69+
internal DnsResolver(IPEndPoint server) : this(new DnsResolverOptions { Servers = [server] })
7070
{
7171
}
7272

7373
internal static DnsResolver Create(IServiceProvider serviceProvider)
7474
{
7575
ArgumentNullException.ThrowIfNull(serviceProvider);
7676

77-
var resolverOptions = serviceProvider.GetRequiredService<IOptions<DnsSrvServiceEndpointProviderOptions>>().Value.ResolverOptions;
77+
var resolverOptions = serviceProvider.GetRequiredService<IOptions<DnsSrvServiceEndpointProviderOptions>>().Value.DnsResolverOptions;
7878
var timeProvider = serviceProvider.GetRequiredService<TimeProvider>();
7979
var logger = serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<DnsResolver>();
8080
return new DnsResolver(timeProvider, logger, resolverOptions);
@@ -387,7 +387,7 @@ internal struct SendQueryResult
387387
{
388388
IPEndPoint serverEndPoint = _options.Servers[index];
389389

390-
for (int attempt = 1; attempt <= _options.Attempts; attempt++)
390+
for (int attempt = 1; attempt <= _options.MaxAttempts; attempt++)
391391
{
392392
DnsResponse response = default;
393393
try

src/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns/Resolver/ResolverOptions.cs renamed to src/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns/Resolver/DnsResolverOptions.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,24 @@ namespace Microsoft.Extensions.ServiceDiscovery.Dns.Resolver;
88
/// <summary>
99
/// Provides configuration options for DNS resolution, including server endpoints, retry attempts, and timeout settings.
1010
/// </summary>
11-
public class ResolverOptions
11+
public class DnsResolverOptions
1212
{
1313
/// <summary>
1414
/// Gets or sets the collection of server endpoints used for network connections.
1515
/// </summary>
1616
public IList<IPEndPoint> Servers { get; set; } = new List<IPEndPoint>();
1717

1818
/// <summary>
19-
/// Gets or sets the number of allowed attempts for the operation.
19+
/// Gets or sets the maximum number of attempts per server.
2020
/// </summary>
21-
public int Attempts { get; set; } = 2;
21+
public int MaxAttempts { get; set; } = 2;
2222

2323
/// <summary>
24-
/// Gets or sets the maximum duration to wait for an operation to complete before timing out.
24+
/// Gets or sets the maximum duration per attempt to wait before timing out.
2525
/// </summary>
26+
/// <remarks>
27+
/// The maximum time for resolving a query is <see cref="MaxAttempts"/> * <see cref="Servers"/> count * <see cref="Timeout"/>.
28+
/// </remarks>
2629
public TimeSpan Timeout { get; set; } = TimeSpan.FromSeconds(3);
2730

2831
// override for testing purposes

test/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns.Tests.Fuzzing/Fuzzers/DnsResponseFuzzer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ public void FuzzTarget(ReadOnlySpan<byte> data)
1919
if (_resolver == null)
2020
{
2121
_buffer = new byte[4096];
22-
_resolver = new DnsResolver(new ResolverOptions
22+
_resolver = new DnsResolver(new DnsResolverOptions
2323
{
2424
Servers = [new IPEndPoint(IPAddress.Loopback, 53)],
2525
Timeout = TimeSpan.FromSeconds(5),
26-
Attempts = 1,
26+
MaxAttempts = 1,
2727
_transportOverride = (buffer, length) =>
2828
{
2929
// the first two bytes are the random transaction ID, so we keep that

test/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns.Tests/Resolver/LoopbackDnsTestBase.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public abstract class LoopbackDnsTestBase : IDisposable
1818
internal LoopbackDnsServer DnsServer { get; }
1919
private readonly Lazy<DnsResolver> _resolverLazy;
2020
internal DnsResolver Resolver => _resolverLazy.Value;
21-
internal ResolverOptions Options { get; }
21+
internal DnsResolverOptions Options { get; }
2222
protected readonly FakeTimeProvider TimeProvider;
2323

2424
public LoopbackDnsTestBase(ITestOutputHelper output)
@@ -30,7 +30,7 @@ public LoopbackDnsTestBase(ITestOutputHelper output)
3030
{
3131
Servers = [DnsServer.DnsEndPoint],
3232
Timeout = TimeSpan.FromSeconds(5),
33-
Attempts = 1,
33+
MaxAttempts = 1,
3434
};
3535
_resolverLazy = new(InitializeResolver);
3636
}
@@ -40,7 +40,7 @@ DnsResolver InitializeResolver()
4040
ServiceCollection services = new();
4141
services.AddXunitLogging(Output);
4242

43-
// construct DnsResolver manually via internal constructor which accepts ResolverOptions
43+
// construct DnsResolver manually via internal constructor which accepts DnsResolverOptions
4444
var resolver = new DnsResolver(TimeProvider, services.BuildServiceProvider().GetRequiredService<ILogger<DnsResolver>>(), Options);
4545
return resolver;
4646
}

test/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns.Tests/Resolver/RetryTests.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class RetryTests : LoopbackDnsTestBase
1111
{
1212
public RetryTests(ITestOutputHelper output) : base(output)
1313
{
14-
Options.Attempts = 3;
14+
Options.MaxAttempts = 3;
1515
}
1616

1717
private Task SetupUdpProcessFunction(LoopbackDnsServer server, Func<LoopbackDnsResponseBuilder, Task> func)
@@ -49,7 +49,7 @@ public async Task Retry_Simple_Success()
4949
Task t = SetupUdpProcessFunction(builder =>
5050
{
5151
attempt++;
52-
if (attempt == Options.Attempts)
52+
if (attempt == Options.MaxAttempts)
5353
{
5454
builder.Answers.AddAddress(hostName, 3600, address);
5555
}
@@ -214,7 +214,7 @@ public async Task ExhaustedRetries_FailoverToNextServer()
214214
return Task.CompletedTask;
215215
});
216216

217-
Assert.Equal(Options.Attempts, primaryAttempt);
217+
Assert.Equal(Options.MaxAttempts, primaryAttempt);
218218
Assert.Equal(1, secondaryAttempt);
219219

220220
AddressResult res = Assert.Single(results);

test/Libraries/Microsoft.Extensions.ServiceDiscovery.Dns.Tests/Resolver/TcpFailoverTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public async Task TcpFailover_Simple_Success()
4242
public async Task TcpFailover_ServerClosesWithoutData_EmptyResult()
4343
{
4444
string hostName = "tcp-server-closes.test";
45-
Options.Attempts = 1;
45+
Options.MaxAttempts = 1;
4646
Options.Timeout = TimeSpan.FromSeconds(60);
4747

4848
_ = DnsServer.ProcessUdpRequest(builder =>
@@ -66,7 +66,7 @@ public async Task TcpFailover_ServerClosesWithoutData_EmptyResult()
6666
public async Task TcpFailover_TcpNotAvailable_EmptyResult()
6767
{
6868
string hostName = "tcp-not-available.test";
69-
Options.Attempts = 1;
69+
Options.MaxAttempts = 1;
7070
Options.Timeout = TimeSpan.FromMilliseconds(100000);
7171

7272
_ = DnsServer.ProcessUdpRequest(builder =>

test/Libraries/Microsoft.Extensions.ServiceDiscovery.Yarp.Tests/YarpServiceDiscoveryTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ public async Task ServiceDiscoveryDestinationResolverTests_Configuration_Disallo
232232
[Fact]
233233
public async Task ServiceDiscoveryDestinationResolverTests_Dns()
234234
{
235-
DnsResolver resolver = new DnsResolver(TimeProvider.System, NullLogger<DnsResolver>.Instance, new ResolverOptions());
235+
DnsResolver resolver = new DnsResolver(TimeProvider.System, NullLogger<DnsResolver>.Instance, new DnsResolverOptions());
236236

237237
await using var services = new ServiceCollection()
238238
.AddSingleton<IDnsResolver>(resolver)

0 commit comments

Comments
 (0)