Make configuration values injectable rather than hardcoded
Add config structs with sensible defaults for tunable parameters: - JetStreamConfig for stream retention (1 year) and replica count (1) - HashRingConfig for virtual nodes per physical node (150) - ShardConfig for shard count (1024) and replication factor (1) Each component gets a new WithConfig constructor that accepts custom configuration, while the original constructors continue to work with defaults. Zero values in configs fall back to defaults for backward compatibility. Closes #38 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit was merged in pull request #43.
This commit is contained in:
@@ -42,7 +42,7 @@ func TestAddNode(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify virtual nodes were added
|
||||
expectedVirtualNodes := VirtualNodes
|
||||
expectedVirtualNodes := DefaultVirtualNodes
|
||||
if len(ring.sortedHashes) != expectedVirtualNodes {
|
||||
t.Errorf("expected %d virtual nodes, got %d", expectedVirtualNodes, len(ring.sortedHashes))
|
||||
}
|
||||
@@ -86,7 +86,7 @@ func TestAddNode_MultipleNodes(t *testing.T) {
|
||||
t.Errorf("expected 3 nodes, got %d", len(nodes))
|
||||
}
|
||||
|
||||
expectedHashes := VirtualNodes * 3
|
||||
expectedHashes := DefaultVirtualNodes * 3
|
||||
if len(ring.sortedHashes) != expectedHashes {
|
||||
t.Errorf("expected %d virtual nodes, got %d", expectedHashes, len(ring.sortedHashes))
|
||||
}
|
||||
@@ -118,7 +118,7 @@ func TestRemoveNode(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify virtual nodes were removed
|
||||
expectedHashes := VirtualNodes
|
||||
expectedHashes := DefaultVirtualNodes
|
||||
if len(ring.sortedHashes) != expectedHashes {
|
||||
t.Errorf("expected %d virtual nodes, got %d", expectedHashes, len(ring.sortedHashes))
|
||||
}
|
||||
@@ -321,7 +321,7 @@ func TestRingBehavior_ManyNodes(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify virtual nodes count
|
||||
expectedHashes := numNodes * VirtualNodes
|
||||
expectedHashes := numNodes * DefaultVirtualNodes
|
||||
if len(ring.sortedHashes) != expectedHashes {
|
||||
t.Errorf("expected %d virtual nodes, got %d", expectedHashes, len(ring.sortedHashes))
|
||||
}
|
||||
@@ -355,7 +355,7 @@ func TestRingBehavior_ManyNodes(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestVirtualNodes_ImproveDistribution(t *testing.T) {
|
||||
func TestDefaultVirtualNodes_ImproveDistribution(t *testing.T) {
|
||||
// Test that virtual nodes actually improve distribution
|
||||
// by comparing with a theoretical single-hash-per-node scenario
|
||||
|
||||
@@ -386,7 +386,7 @@ func TestVirtualNodes_ImproveDistribution(t *testing.T) {
|
||||
stdDev := math.Sqrt(sumSquaredDiff / float64(numNodes))
|
||||
coefficientOfVariation := stdDev / expectedPerNode
|
||||
|
||||
// With VirtualNodes=150, we expect good distribution
|
||||
// With DefaultVirtualNodes=150, we expect good distribution
|
||||
// Coefficient of variation should be low (< 15%)
|
||||
if coefficientOfVariation > 0.15 {
|
||||
t.Errorf("distribution has high coefficient of variation: %.2f%% (expected < 15%%)",
|
||||
@@ -394,8 +394,8 @@ func TestVirtualNodes_ImproveDistribution(t *testing.T) {
|
||||
}
|
||||
|
||||
// Verify that the actual number of virtual nodes matches expected
|
||||
if len(ring.sortedHashes) != numNodes*VirtualNodes {
|
||||
t.Errorf("expected %d virtual node hashes, got %d", numNodes*VirtualNodes, len(ring.sortedHashes))
|
||||
if len(ring.sortedHashes) != numNodes*DefaultVirtualNodes {
|
||||
t.Errorf("expected %d virtual node hashes, got %d", numNodes*DefaultVirtualNodes, len(ring.sortedHashes))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user