Skip to content

Complete AZ Affinity and ReadFrom Strategy Support in ConfigurationOptions #26

@jbrinkman

Description

@jbrinkman

Complete AZ Affinity and ReadFrom Strategy Support in ConfigurationOptions

Overview

This issue tracks the completion of AZ (Availability Zone) Affinity and ReadFrom strategy support in the C# Valkey GLIDE client. While the underlying infrastructure exists in ConnectionConfiguration.cs with the ReadFrom struct and ReadFromStrategy enum, the parsing and serialization logic in ConfigurationOptions.cs is incomplete.

Problem Statement

Currently, the C# client has:

  • ✅ Complete ReadFrom struct and ReadFromStrategy enum in ConnectionConfiguration.cs
  • ✅ Proper FFI marshaling support for ReadFrom configurations
  • ✅ ConnectionMultiplexer mapping from ConfigurationOptions to ClientConfigurationBuilder
  • ❌ Missing connection string parsing for readFrom and az parameters
  • ❌ Missing serialization support in ConfigurationOptions.ToString()
  • ❌ Incomplete validation for ReadFrom configurations

This prevents users from configuring AZ affinity through connection strings or programmatically through ConfigurationOptions.

Expected Behavior

Connection String Support

// Should work - AZ affinity strategies
var config = ConfigurationOptions.Parse("server=localhost,readFrom=AzAffinity,az=us-east-1a");
var config = ConfigurationOptions.Parse("server=localhost,readFrom=AzAffinityReplicasAndPrimary,az=eu-west-1b");

// Should work - Non-AZ strategies  
var config = ConfigurationOptions.Parse("server=localhost,readFrom=Primary");
var config = ConfigurationOptions.Parse("server=localhost,readFrom=PreferReplica");

Programmatic Configuration

var config = new ConfigurationOptions();
config.ReadFrom = new ReadFrom(ReadFromStrategy.AzAffinity, "us-east-1a");
config.ReadFrom = new ReadFrom(ReadFromStrategy.Primary);

Serialization Support

var config = new ConfigurationOptions { ReadFrom = new ReadFrom(ReadFromStrategy.AzAffinity, "us-east-1a") };
var connectionString = config.ToString(); // Should include "readFrom=AzAffinity,az=us-east-1a"

Implementation Requirements

1. Connection String Parsing

  • Add readFrom parameter parsing in ConfigurationOptions.DoParse()
  • Add az parameter parsing in ConfigurationOptions.DoParse()
  • Implement ParseReadFromStrategy() method to convert string to enum
  • Add validation for ReadFrom/AZ parameter combinations
  • Support case-insensitive parsing

2. Serialization Support

  • Extend ConfigurationOptions.ToString() to include ReadFrom values
  • Implement FormatReadFrom() method for string conversion
  • Ensure backward compatibility with existing ToString format
  • Support round-trip parsing (Parse → ToString → Parse)

3. Validation and Error Handling

  • Validate AZ is required for AZ affinity strategies
  • Validate AZ is not provided for non-AZ strategies
  • Provide clear error messages for invalid combinations
  • Handle null/empty AZ values appropriately

4. Testing

  • Unit tests for connection string parsing
  • Unit tests for serialization/deserialization
  • Unit tests for validation scenarios
  • Integration tests for end-to-end configuration flow
  • Backward compatibility tests

Supported ReadFrom Strategies

Strategy AZ Required Description
Primary No Always read from primary nodes
PreferReplica No Prefer replica nodes, fallback to primary
AzAffinity Yes Prefer replicas in same AZ, fallback to other replicas/primary
AzAffinityReplicasAndPrimary Yes Prefer nodes (replicas + primary) in same AZ, fallback to any node

Current Code Status

The following components are already implemented:

  • ReadFrom struct in ConnectionConfiguration.cs
  • ReadFromStrategy enum with all strategies ✅
  • FFI marshaling support ✅
  • ConnectionMultiplexer mapping ✅

Missing components:

  • ConfigurationOptions parsing logic ❌
  • ConfigurationOptions serialization logic ❌
  • Comprehensive validation ❌
  • Unit tests ❌

Acceptance Criteria

  • Connection strings with ReadFrom parameters parse correctly
  • All ReadFromStrategy values are supported
  • AZ validation works for all strategy combinations
  • ToString() includes ReadFrom configuration
  • Round-trip parsing works (Parse → ToString → Parse)
  • Comprehensive error messages for invalid configurations
  • Backward compatibility maintained
  • Full test coverage for all scenarios

Related Files

  • sources/Valkey.Glide/Abstract/ConfigurationOptions.cs - Main implementation needed
  • sources/Valkey.Glide/Abstract/ConnectionMultiplexer.cs - Verify mapping works
  • sources/Valkey.Glide/ConnectionConfiguration.cs - Existing ReadFrom infrastructure
  • tests/Valkey.Glide.UnitTests/ - Add comprehensive tests

Labels

  • enhancement
  • c#
  • configuration
  • az-affinity

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions