Skip to content

Commit b4b42d0

Browse files
authored
Merge branch 'main' into marc/gcra-rename
2 parents 33e3684 + 244ee3f commit b4b42d0

6 files changed

Lines changed: 49 additions & 3 deletions

File tree

docs/ReleaseNotes.md

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

99
## Unreleased
1010

11+
- Detect server-mode correctly on Valkey 8+ instances ([#3050 by @wipiano](https://github.com/StackExchange/StackExchange.Redis/pull/3050))
1112
- Update experimental `GCRA` APIs and wire protocol terminology from "requests" to "tokens", to match server change ([#3051 by @mgravell](https://github.com/StackExchange/StackExchange.Redis/pull/3051))
1213

1314
## 2.12.14

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;

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)