Skip to content

Commit 244ee3f

Browse files
wipianomgravell
andauthored
interpreting server_mode field (to support Valkey 8+ cluster) (#3050)
* interpreting server_mode field (to support Valkey 8+ cluster) * add valkey server_mode unit test * release notes --------- Co-authored-by: mgravell <marc.gravell@gmail.com>
1 parent 0c58866 commit 244ee3f

File tree

7 files changed

+50
-4
lines changed

7 files changed

+50
-4
lines changed

docs/ReleaseNotes.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Current package versions:
88

99
## Unreleased
1010

11-
- (none)
11+
- Detect server-mode correctly on Valkey 8+ instances ([#3050 by @wipiano](https://github.com/StackExchange/StackExchange.Redis/pull/3050))
1212

1313
## 2.12.14
1414

src/StackExchange.Redis/AutoConfigureInfoField.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ internal enum AutoConfigureInfoField
3737

3838
[AsciiHash("valkey_version")]
3939
ValkeyVersion,
40+
41+
[AsciiHash("server_mode")]
42+
ServerMode,
4043
}
4144

4245
/// <summary>

src/StackExchange.Redis/ResultProcessor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -920,6 +920,7 @@ protected override bool SetResultCore(PhysicalConnection connection, Message mes
920920
}
921921
break;
922922
case AutoConfigureInfoField.RedisMode:
923+
case AutoConfigureInfoField.ServerMode:
923924
if (ServerTypeMetadata.TryParse(valSpan, out var serverType))
924925
{
925926
server.ServerType = serverType;

src/StackExchange.Redis/VectorSetAddMessage.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Runtime.InteropServices;
3+
using System.Threading;
34

45
namespace StackExchange.Redis;
56

tests/StackExchange.Redis.Tests/AutoConfigureInfoFieldUnitTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class AutoConfigureInfoFieldUnitTests
1414
[InlineData("run_id", (int)AutoConfigureInfoField.RunId)]
1515
[InlineData("garnet_version", (int)AutoConfigureInfoField.GarnetVersion)]
1616
[InlineData("valkey_version", (int)AutoConfigureInfoField.ValkeyVersion)]
17+
[InlineData("server_mode", (int)AutoConfigureInfoField.ServerMode)]
1718
public void TryParse_CharSpan_KnownFields(string value, int expected)
1819
{
1920
Assert.True(AutoConfigureInfoFieldMetadata.TryParse(value.AsSpan(), out var actual));
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Text;
2+
using System.Threading.Tasks;
3+
using Xunit;
4+
5+
namespace StackExchange.Redis.Tests;
6+
7+
public class ValkeyUnitTests(ITestOutputHelper log)
8+
{
9+
[Theory]
10+
[InlineData(ServerType.Standalone)]
11+
[InlineData(ServerType.Cluster)]
12+
public async Task IdentifyValkeyCluster(ServerType type)
13+
{
14+
using InProcessValkeyLikeServer server = new(log) { ServerType = type };
15+
await using var client = await server.ConnectAsync();
16+
var serverApi = client.GetServer(server.DefaultEndPoint);
17+
Assert.Equal(type, serverApi.ServerType);
18+
Assert.Equal(ProductVariant.Valkey, serverApi.GetProductVariant(out var version));
19+
Assert.Equal("8.1", version);
20+
}
21+
22+
private sealed class InProcessValkeyLikeServer(ITestOutputHelper log) : InProcessTestServer(log)
23+
{
24+
// see https://github.com/StackExchange/StackExchange.Redis/pull/3050
25+
protected override string ServerModeKey => "server_mode";
26+
27+
protected override void Info(StringBuilder sb, string section)
28+
{
29+
base.Info(sb, section);
30+
if (section is "Server")
31+
{
32+
sb.AppendLine("valkey_version:8.1")
33+
.AppendLine("server_name:valkey");
34+
}
35+
}
36+
}
37+
}

toys/StackExchange.Redis.Server/RedisServer.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ protected virtual TypedRedisValue Hello(RedisClient client, in RedisRequest requ
275275
span[6] = TypedRedisValue.BulkString("id");
276276
span[7] = TypedRedisValue.Integer(client.Id);
277277
span[8] = TypedRedisValue.BulkString("mode");
278-
span[9] = TypedRedisValue.BulkString(ModeString);
278+
span[9] = TypedRedisValue.BulkString(ServerModeValue);
279279
span[10] = TypedRedisValue.BulkString("role");
280280
span[11] = TypedRedisValue.BulkString("master");
281281
span[12] = TypedRedisValue.BulkString("modules");
@@ -1138,12 +1138,15 @@ public Version RedisVersion
11381138
public DateTime StartTime { get; set; } = DateTime.UtcNow;
11391139
public ServerType ServerType { get; set; } = ServerType.Standalone;
11401140

1141-
private string ModeString => ServerType switch
1141+
private string ServerModeValue => ServerType switch
11421142
{
11431143
ServerType.Cluster => "cluster",
11441144
ServerType.Sentinel => "sentinel",
11451145
_ => "standalone",
11461146
};
1147+
1148+
protected virtual string ServerModeKey => "redis_mode";
1149+
11471150
protected virtual void Info(StringBuilder sb, string section)
11481151
{
11491152
StringBuilder AddHeader()
@@ -1156,7 +1159,7 @@ StringBuilder AddHeader()
11561159
{
11571160
case "Server":
11581161
AddHeader().Append("redis_version:").AppendLine(VersionString)
1159-
.Append("redis_mode:").Append(ModeString).AppendLine()
1162+
.Append(ServerModeKey).Append(':').Append(ServerModeValue).AppendLine()
11601163
.Append("os:").Append(Environment.OSVersion).AppendLine()
11611164
.Append("arch_bits:x").Append(IntPtr.Size * 8).AppendLine();
11621165
using (var process = Process.GetCurrentProcess())

0 commit comments

Comments
 (0)