@@ -29,21 +29,23 @@ func TestDynamicChannelScaling(t *testing.T) {
2929 dialFunc := func () (* BigtableConn , error ) { return dialBigtableserver (addr ) }
3030
3131 baseConfig := btopt.DynamicChannelPoolConfig {
32- Enabled : true ,
33- MinConns : 2 ,
34- MaxConns : 10 ,
35- AvgLoadHighThreshold : 10.0 , // Scale up if avg load >= 10
36- AvgLoadLowThreshold : 3.0 , // Scale down if avg load <= 3
37- MinScalingInterval : 0 , // Disable time throttling for most tests
38- CheckInterval : 10 * time .Second , // Not directly used by calling evaluateAndScale
39- MaxRemoveConns : 3 ,
32+ Enabled : true ,
33+ MinConns : 2 ,
34+ MaxConns : 10 ,
35+ AvgLoadHighThreshold : 10.0 , // Scale up if avg load >= 10
36+ AvgLoadLowThreshold : 3.0 , // Scale down if avg load <= 3
37+ MinScalingInterval : 0 , // Disable time throttling for most tests
38+ CheckInterval : 10 * time .Second , // Not directly used by calling evaluateAndScale
39+ MaxRemoveConns : 3 ,
40+ ContinuousDownscaleRunsThreshold : 3 ,
4041 }
4142 tests := []struct {
42- name string
43- initialSize int
44- configOpt func (* btopt.DynamicChannelPoolConfig )
45- setLoad func (conns []* connEntry )
46- wantSize int
43+ name string
44+ initialSize int
45+ configOpt func (* btopt.DynamicChannelPoolConfig )
46+ setLoad func (conns []* connEntry )
47+ wantSize int
48+ evaluateCalls int
4749 }{
4850 {
4951 name : "ScaleUp" ,
@@ -52,7 +54,8 @@ func TestDynamicChannelScaling(t *testing.T) {
5254 setConnLoads (conns , 12 , 0 ) // Avg load 12 > 10
5355 },
5456 // Total load = 3 * 12 = 36. Desired = ceil(36 / 6.5) = 6
55- wantSize : 6 ,
57+ wantSize : 6 ,
58+ evaluateCalls : 1 ,
5659 },
5760 {
5861 name : "ScaleUpCappedAtMax" ,
@@ -61,7 +64,8 @@ func TestDynamicChannelScaling(t *testing.T) {
6164 setConnLoads (conns , 20 , 0 ) // Avg load 20 > 10
6265 },
6366 // Total load = 8 * 20 = 160. Desired = ceil(160 / 6.5) = 25. Capped at MaxConns = 10
64- wantSize : 10 ,
67+ wantSize : 10 ,
68+ evaluateCalls : 1 ,
6569 },
6670 {
6771 name : "ScaleDown" ,
@@ -70,7 +74,8 @@ func TestDynamicChannelScaling(t *testing.T) {
7074 setConnLoads (conns , 1 , 0 ) // Avg load 1 < 3
7175 },
7276 // Total load = 9 * 1 = 9. Desired = ceil(9 / 6.5) = 2.
73- wantSize : 6 ,
77+ wantSize : 6 ,
78+ evaluateCalls : 3 ,
7479 },
7580 {
7681 name : "ScaleDownCappedAtMin" ,
@@ -79,7 +84,8 @@ func TestDynamicChannelScaling(t *testing.T) {
7984 setConnLoads (conns , 1 , 0 ) // Avg load 1 < 3
8085 },
8186 // Total load = 3 * 1 = 3. Desired = ceil(3 / 6.5) = 1. Capped at MinConns = 2
82- wantSize : 2 ,
87+ wantSize : 2 ,
88+ evaluateCalls : 3 ,
8389 },
8490 {
8591 name : "ScaleDownLimitedByMaxRemove" ,
@@ -91,23 +97,26 @@ func TestDynamicChannelScaling(t *testing.T) {
9197 setConnLoads (conns , 0 , 0 ) // Avg load 0 < 3
9298 },
9399 // Total load = 0. Desired = 2 (MinConns). removeCount = 10 - 2 = 8. Limited by MaxRemoveConns = 2.
94- wantSize : 10 - 2 ,
100+ wantSize : 10 - 2 ,
101+ evaluateCalls : 3 ,
95102 },
96103 {
97104 name : "NoScaleUp" ,
98105 initialSize : 5 ,
99106 setLoad : func (conns []* connEntry ) {
100107 setConnLoads (conns , 7 , 0 ) // 3 < Avg load 7 < 10
101108 },
102- wantSize : 5 ,
109+ wantSize : 5 ,
110+ evaluateCalls : 1 ,
103111 },
104112 {
105113 name : "NoScaleDown" ,
106114 initialSize : 5 ,
107115 setLoad : func (conns []* connEntry ) {
108116 setConnLoads (conns , 5 , 1 ) // Weighted load 5*1 + 1*2 = 7. 3 < 7 < 10
109117 },
110- wantSize : 5 ,
118+ wantSize : 5 ,
119+ evaluateCalls : 3 ,
111120 },
112121 {
113122 name : "ScaleUpAddAtLeastOne" ,
@@ -116,7 +125,17 @@ func TestDynamicChannelScaling(t *testing.T) {
116125 setConnLoads (conns , 10 , 0 ) // Avg load 10, right at threshold.
117126 },
118127 // Total load = 20. Desired = ceil(20 / 6.5) = 4. Add 2.
119- wantSize : 4 ,
128+ wantSize : 4 ,
129+ evaluateCalls : 1 ,
130+ },
131+ {
132+ name : "NoScaleDownWithEvaluations<ContinuousDownscaleRunsThreshold" ,
133+ initialSize : 6 ,
134+ setLoad : func (conns []* connEntry ) {
135+ setConnLoads (conns , 1 , 0 ) // Avg load 1 < 3 (Low load)
136+ },
137+ wantSize : 6 ,
138+ evaluateCalls : 2 ,
120139 },
121140 }
122141
@@ -139,7 +158,15 @@ func TestDynamicChannelScaling(t *testing.T) {
139158 tc .setLoad (pool .getConns ())
140159 }
141160
142- dsm .evaluateAndScale ()
161+ calls := tc .evaluateCalls
162+ if calls == 0 {
163+ calls = 1
164+ }
165+
166+ // Simulate the ticker calling evaluateAndScale
167+ for i := 0 ; i < calls ; i ++ {
168+ dsm .evaluateAndScale ()
169+ }
143170 time .Sleep (50 * time .Millisecond ) // Allow add/remove goroutines to potentially run
144171
145172 if gotSize := pool .Num (); gotSize != tc .wantSize {
0 commit comments