Skip to content

Commit 0dfa58f

Browse files
authored
DefaultOptionsProvider: allow overriding LibName (#2453)
If a wrapper package is generally in use in a deployment, it may want to override what we set as the library name in `CLIENT SETINFO lib-name <name>`. This allows doing so via the `DefaultOptionsProvider` (intentionally not on `ConfigurationOptions` directly as version isn't either). Note that this does NOT upgrade the test suite to 7.2.0 RC1. I did test and this works, but there are other breaks we need to evaluate - I'll open another PR separately to demonstrate.
1 parent 9fda7c5 commit 0dfa58f

File tree

8 files changed

+48
-7
lines changed

8 files changed

+48
-7
lines changed

docs/ReleaseNotes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ Current package versions:
1313
- Fix [#2449](https://github.com/StackExchange/StackExchange.Redis/issues/2449): Resolve AOT trim warnings in `TryGetAzureRoleInstanceIdNoThrow` ([#2451 by eerhardt](https://github.com/StackExchange/StackExchange.Redis/pull/2451))
1414
- Adds: Support for `HTTP/1.1 200 Connection established` in HTTP Tunnel ([#2448 by flobernd](https://github.com/StackExchange/StackExchange.Redis/pull/2448))
1515
- Adds: Timeout duration to backlog timeout error messages ([#2452 by NickCraver](https://github.com/StackExchange/StackExchange.Redis/pull/2452))
16+
- Adds: `DefaultOptionsProvider.LibraryName` for specifying lib-name passed to `CLIENT SETINFO` in Redis 7.2+ ([#2453 by NickCraver](https://github.com/StackExchange/StackExchange.Redis/pull/2453))
1617

1718
## 2.6.104
1819

src/StackExchange.Redis/Configuration/DefaultOptionsProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,12 @@ protected virtual string GetDefaultClientName() =>
197197
?? ComputerName
198198
?? "StackExchange.Redis") + "(SE.Redis-v" + LibraryVersion + ")";
199199

200+
/// <summary>
201+
/// Gets the library name to use for CLIENT SETINFO lib-name calls to Redis during handshake.
202+
/// Defaults to "SE.Redis".
203+
/// </summary>
204+
public virtual string LibraryName => "SE.Redis";
205+
200206
/// <summary>
201207
/// String version of the StackExchange.Redis library, for use in any options.
202208
/// </summary>

src/StackExchange.Redis/PublicAPI/PublicAPI.Shipped.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,6 +1788,7 @@ virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.IncludeDetailIn
17881788
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.IncludePerformanceCountersInExceptions.get -> bool
17891789
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.IsMatch(System.Net.EndPoint! endpoint) -> bool
17901790
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.KeepAliveInterval.get -> System.TimeSpan
1791+
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.LibraryName.get -> string!
17911792
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.Password.get -> string?
17921793
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.Proxy.get -> StackExchange.Redis.Proxy
17931794
virtual StackExchange.Redis.Configuration.DefaultOptionsProvider.ReconnectRetryPolicy.get -> StackExchange.Redis.IReconnectRetryPolicy?

src/StackExchange.Redis/RedisFeatures.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public readonly struct RedisFeatures
3939
v6_0_0 = new Version(6, 0, 0),
4040
v6_0_6 = new Version(6, 0, 6),
4141
v6_2_0 = new Version(6, 2, 0),
42-
v7_0_0_rc1 = new Version(6, 9, 240); // 7.0 RC1 is version 6.9.240
42+
v7_0_0_rc1 = new Version(6, 9, 240), // 7.0 RC1 is version 6.9.240
43+
v7_2_0_rc1 = new Version(7, 1, 240); // 7.2 RC1 is version 7.1.240
4344

4445
private readonly Version version;
4546

src/StackExchange.Redis/RedisLiterals.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ public static readonly RedisValue
120120
REWRITE = "REWRITE",
121121
RIGHT = "RIGHT",
122122
SAVE = "SAVE",
123-
SE_Redis = "SE.Redis",
124123
SEGFAULT = "SEGFAULT",
125124
SET = "SET",
126125
SETINFO = "SETINFO",

src/StackExchange.Redis/ServerEndPoint.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -935,10 +935,14 @@ private async Task HandshakeAsync(PhysicalConnection connection, LogProxy? log)
935935
// server version, so we will use this speculatively and hope for the best
936936
log?.WriteLine($"{Format.ToString(this)}: Setting client lib/ver");
937937

938-
msg = Message.Create(-1, CommandFlags.FireAndForget, RedisCommand.CLIENT,
939-
RedisLiterals.SETINFO, RedisLiterals.lib_name, RedisLiterals.SE_Redis);
940-
msg.SetInternalCall();
941-
await WriteDirectOrQueueFireAndForgetAsync(connection, msg, ResultProcessor.DemandOK).ForAwait();
938+
var libName = Multiplexer.RawConfig.Defaults.LibraryName;
939+
if (!string.IsNullOrWhiteSpace(libName))
940+
{
941+
msg = Message.Create(-1, CommandFlags.FireAndForget, RedisCommand.CLIENT,
942+
RedisLiterals.SETINFO, RedisLiterals.lib_name, libName);
943+
msg.SetInternalCall();
944+
await WriteDirectOrQueueFireAndForgetAsync(connection, msg, ResultProcessor.DemandOK).ForAwait();
945+
}
942946

943947
var version = Utils.GetLibVersion();
944948
if (!string.IsNullOrWhiteSpace(version))

tests/StackExchange.Redis.Tests/DefaultOptionsTests.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Linq;
34
using System.Net;
45
using System.Threading;
56
using System.Threading.Tasks;
@@ -158,4 +159,32 @@ public async Task ClientNameExplicitWins()
158159
Assert.True(conn.IsConnected);
159160
Assert.Equal("FooBar", conn.ClientName);
160161
}
162+
163+
public class TestLibraryNameOptionsProvider : DefaultOptionsProvider
164+
{
165+
public string Id { get; } = Guid.NewGuid().ToString();
166+
public override string LibraryName => Id;
167+
}
168+
169+
[Fact]
170+
public async Task LibraryNameOverride()
171+
{
172+
var options = ConfigurationOptions.Parse(GetConfiguration());
173+
var defaults = new TestLibraryNameOptionsProvider();
174+
options.AllowAdmin = true;
175+
options.Defaults = defaults;
176+
177+
using var conn = await ConnectionMultiplexer.ConnectAsync(options, Writer);
178+
// CLIENT SETINFO is in 7.2.0+
179+
ThrowIfBelowMinVersion(conn, RedisFeatures.v7_2_0_rc1);
180+
181+
var clients = await GetServer(conn).ClientListAsync();
182+
foreach (var client in clients)
183+
{
184+
Log("Library name: " + client.LibraryName);
185+
}
186+
187+
Assert.True(conn.IsConnected);
188+
Assert.True(clients.Any(c => c.LibraryName == defaults.LibraryName), "Did not find client with name: " + defaults.Id);
189+
}
161190
}

tests/StackExchange.Redis.Tests/TestBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ internal virtual IInternalConnectionMultiplexer Create(
315315
return conn;
316316
}
317317

318-
private void ThrowIfBelowMinVersion(IInternalConnectionMultiplexer conn, Version? requiredVersion)
318+
protected void ThrowIfBelowMinVersion(IConnectionMultiplexer conn, Version? requiredVersion)
319319
{
320320
if (requiredVersion is null)
321321
{

0 commit comments

Comments
 (0)