From 9f058b2dcf7b7745f441540eb17fdd7245ad112a Mon Sep 17 00:00:00 2001 From: currantw Date: Thu, 30 Oct 2025 09:17:24 -0700 Subject: [PATCH 1/4] Add refresh topology to cluster configuration builder and request struct. Signed-off-by: currantw --- .../Valkey.Glide/ConnectionConfiguration.cs | 41 ++++++++++++++++++- sources/Valkey.Glide/Internals/FFI.structs.cs | 6 ++- .../ConnectionConfigurationTests.cs | 26 +++++++++++- 3 files changed, 70 insertions(+), 3 deletions(-) diff --git a/sources/Valkey.Glide/ConnectionConfiguration.cs b/sources/Valkey.Glide/ConnectionConfiguration.cs index be273100..96cd19d2 100644 --- a/sources/Valkey.Glide/ConnectionConfiguration.cs +++ b/sources/Valkey.Glide/ConnectionConfiguration.cs @@ -25,9 +25,24 @@ internal record ConnectionConfig public Protocol? Protocol; public string? ClientName; public bool LazyConnect; + public bool RefreshTopologyFromInitialNodes; internal FFI.ConnectionConfig ToFfi() => - new(Addresses, TlsMode, ClusterMode, (uint?)RequestTimeout?.TotalMilliseconds, (uint?)ConnectionTimeout?.TotalMilliseconds, ReadFrom, RetryStrategy, AuthenticationInfo, DatabaseId, Protocol, ClientName, LazyConnect); + new( + Addresses, + TlsMode, + ClusterMode, + (uint?)RequestTimeout?.TotalMilliseconds, + (uint?)ConnectionTimeout?.TotalMilliseconds, + ReadFrom, + RetryStrategy, + AuthenticationInfo, + DatabaseId, + Protocol, + ClientName, + LazyConnect, + RefreshTopologyFromInitialNodes + ); } /// @@ -640,6 +655,30 @@ public class ClusterClientConfigurationBuilder : ClientConfigurationBuilder public ClusterClientConfigurationBuilder() : base(true) { } + #region Refresh Topology + /// + /// Enables refreshing the cluster topology using only the initial nodes. + /// + /// When this option is enabled, all topology updates (both the periodic checks and on-demand + /// refreshes triggered by topology changes) will query only the initial nodes provided when + /// creating the client, rather than using the internal cluster view. + /// + /// If not set, defaults to false (uses internal cluster view for topology refresh). + /// + public bool RefreshTopologyFromInitialNodes + { + get => Config.RefreshTopologyFromInitialNodes; + set => Config.RefreshTopologyFromInitialNodes = value; + } + + /// + public ClusterClientConfigurationBuilder WithRefreshTopologyFromInitialNodes(bool refreshTopologyFromInitialNodes) + { + RefreshTopologyFromInitialNodes = refreshTopologyFromInitialNodes; + return this; + } + #endregion + /// /// Complete the configuration with given settings. /// diff --git a/sources/Valkey.Glide/Internals/FFI.structs.cs b/sources/Valkey.Glide/Internals/FFI.structs.cs index 9c1fee9a..0f684cf6 100644 --- a/sources/Valkey.Glide/Internals/FFI.structs.cs +++ b/sources/Valkey.Glide/Internals/FFI.structs.cs @@ -213,7 +213,8 @@ public ConnectionConfig( uint databaseId, ConnectionConfiguration.Protocol? protocol, string? clientName, - bool lazyConnect = false) + bool lazyConnect = false, + bool refreshTopologyFromInitialNodes = false) { _addresses = addresses; _request = new() @@ -237,6 +238,7 @@ public ConnectionConfig( Protocol = protocol ?? default, ClientName = clientName, LazyConnect = lazyConnect, + RefreshTopologyFromInitialNodes = refreshTopologyFromInitialNodes, }; } @@ -785,6 +787,8 @@ private struct ConnectionRequest public string? ClientName; [MarshalAs(UnmanagedType.U1)] public bool LazyConnect; + [MarshalAs(UnmanagedType.U1)] + public bool RefreshTopologyFromInitialNodes; // TODO more config params, see ffi.rs } diff --git a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs index bbcb04c2..4d17ca52 100644 --- a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs +++ b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs @@ -50,7 +50,7 @@ public void WithAuthentication_PasswordOnly() } [Fact] - public void WithAuthentication_UsernameIamAuthConfig_ConfiguresCorrectly() + public void WithAuthentication_UsernameIamAuthConfig() { var iamConfig = new IamAuthConfig(ClusterName, ServiceType.ElastiCache, Region, RefreshIntervalSeconds); var builder = new StandaloneClientConfigurationBuilder(); @@ -172,4 +172,28 @@ public void WithCredentials_MultipleCalls_LastWins() Assert.Equal(FFI.ServiceType.MemoryDB, iamCredentials.ServiceType); Assert.False(iamCredentials.HasRefreshIntervalSeconds); } + + [Fact] + public void RefreshTopologyFromInitialNodes() + { + ClusterClientConfigurationBuilder builder; + ClusterClientConfiguration config; + + // Default (false). + builder = new ClusterClientConfigurationBuilder(); + config = builder.Build(); + Assert.False(config.Request.RefreshTopologyFromInitialNodes); + + // Set to true. + builder = new ClusterClientConfigurationBuilder(); + builder.WithRefreshTopologyFromInitialNodes(true); + config = builder.Build(); + Assert.True(config.Request.RefreshTopologyFromInitialNodes); + + // Set to false. + builder = new ClusterClientConfigurationBuilder(); + builder.WithRefreshTopologyFromInitialNodes(false); + config = builder.Build(); + Assert.False(config.Request.RefreshTopologyFromInitialNodes); + } } From 3a60c6b17c8698c6d8fdaf3e1b07eeb876c834f8 Mon Sep 17 00:00:00 2001 From: currantw Date: Thu, 30 Oct 2025 09:30:09 -0700 Subject: [PATCH 2/4] Split up tests Signed-off-by: currantw --- .../ConnectionConfigurationTests.cs | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs index 4d17ca52..30514acb 100644 --- a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs +++ b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs @@ -174,26 +174,28 @@ public void WithCredentials_MultipleCalls_LastWins() } [Fact] - public void RefreshTopologyFromInitialNodes() + public void RefreshTopologyFromInitialNodes_Default() { - ClusterClientConfigurationBuilder builder; - ClusterClientConfiguration config; - - // Default (false). - builder = new ClusterClientConfigurationBuilder(); - config = builder.Build(); + var builder = new ClusterClientConfigurationBuilder(); + var config = builder.Build(); Assert.False(config.Request.RefreshTopologyFromInitialNodes); + } - // Set to true. - builder = new ClusterClientConfigurationBuilder(); + [Fact] + public void RefreshTopologyFromInitialNodes_True() + { + var builder = new ClusterClientConfigurationBuilder(); builder.WithRefreshTopologyFromInitialNodes(true); - config = builder.Build(); + var config = builder.Build(); Assert.True(config.Request.RefreshTopologyFromInitialNodes); + } - // Set to false. - builder = new ClusterClientConfigurationBuilder(); + [Fact] + public void RefreshTopologyFromInitialNodes_False() + { + var builder = new ClusterClientConfigurationBuilder(); builder.WithRefreshTopologyFromInitialNodes(false); - config = builder.Build(); + var config = builder.Build(); Assert.False(config.Request.RefreshTopologyFromInitialNodes); } } From 34caecc2130d97c77e46c533daa2f34ae657faac Mon Sep 17 00:00:00 2001 From: currantw Date: Thu, 30 Oct 2025 10:10:49 -0700 Subject: [PATCH 3/4] Remove unnecessary `using` directive. Signed-off-by: currantw --- tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs index 30514acb..25824ed8 100644 --- a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs +++ b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs @@ -1,7 +1,5 @@ // Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 -using Valkey.Glide.Internals; - using static Valkey.Glide.ConnectionConfiguration; namespace Valkey.Glide.UnitTests; From 6c940aa040fb1760c5c91f8acc9396441b171142 Mon Sep 17 00:00:00 2001 From: currantw Date: Thu, 6 Nov 2025 07:13:42 -0800 Subject: [PATCH 4/4] Fix linting error Signed-off-by: currantw --- tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs index 25824ed8..30514acb 100644 --- a/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs +++ b/tests/Valkey.Glide.UnitTests/ConnectionConfigurationTests.cs @@ -1,5 +1,7 @@ // Copyright Valkey GLIDE Project Contributors - SPDX Identifier: Apache-2.0 +using Valkey.Glide.Internals; + using static Valkey.Glide.ConnectionConfiguration; namespace Valkey.Glide.UnitTests;