@@ -21,35 +21,72 @@ import (
2121 "github.com/stretchr/testify/require"
2222
2323 "github.com/tikv/pd/pkg/mcs/utils/constant"
24+ "github.com/tikv/pd/pkg/storage"
2425)
2526
2627func TestNewServiceLimiter (t * testing.T ) {
2728 re := require .New (t )
2829
2930 // Test creating a service limiter with positive limit
30- limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 )
31+ limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
3132 re .NotNil (limiter )
3233 re .Equal (100.0 , limiter .ServiceLimit )
3334 re .Equal (0.0 , limiter .AvailableTokens )
3435
3536 // Test creating a service limiter with zero limit
36- limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 )
37+ limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 , nil )
3738 re .NotNil (limiter )
3839 re .Equal (0.0 , limiter .ServiceLimit )
3940 re .Equal (0.0 , limiter .AvailableTokens )
4041
4142 // Test creating a service limiter with negative limit
42- limiter = newServiceLimiter (constant .NullKeyspaceID , - 10.0 )
43+ limiter = newServiceLimiter (constant .NullKeyspaceID , - 10.0 , nil )
4344 re .NotNil (limiter )
4445 re .Equal (0.0 , limiter .ServiceLimit )
4546 re .Equal (0.0 , limiter .AvailableTokens )
4647}
4748
49+ func TestServiceLimiterPersistence (t * testing.T ) {
50+ re := require .New (t )
51+
52+ // Create a storage backend for testing
53+ storage := storage .NewStorageWithMemoryBackend ()
54+
55+ // Test persisting service limit
56+ limiter := newServiceLimiter (1 , 0.0 , storage )
57+ limiter .setServiceLimit (100.5 )
58+
59+ // Verify the service limit was persisted
60+ loadedLimit , err := storage .LoadServiceLimit (1 )
61+ re .NoError (err )
62+ re .Equal (100.5 , loadedLimit )
63+
64+ // Test updating the service limit
65+ limiter .setServiceLimit (200.5 )
66+ loadedLimit , err = storage .LoadServiceLimit (1 )
67+ re .NoError (err )
68+ re .Equal (200.5 , loadedLimit )
69+
70+ // Test loading non-existent service limit
71+ loadedLimit , err = storage .LoadServiceLimit (999 )
72+ re .NoError (err ) // No error should be returned for non-existent limit
73+ re .Equal (0.0 , loadedLimit ) // Should return 0 for non-existent limit
74+
75+ // Test loading service limits from storage
76+ for _ , keyspaceID := range []uint32 {1 , 2 , 3 } {
77+ storage .SaveServiceLimit (keyspaceID , float64 (keyspaceID )* 100.0 )
78+ }
79+ err = storage .LoadServiceLimits (func (keyspaceID uint32 , serviceLimit float64 ) {
80+ re .Equal (float64 (keyspaceID )* 100.0 , serviceLimit )
81+ })
82+ re .NoError (err )
83+ }
84+
4885func TestRefillTokensLocked (t * testing.T ) {
4986 re := require .New (t )
5087
5188 // Test refill with positive service limit
52- limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 )
89+ limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
5390 baseTime := time .Now ()
5491 limiter .LastUpdate = baseTime
5592 limiter .AvailableTokens = 50.0
@@ -101,29 +138,29 @@ func TestApplyServiceLimit(t *testing.T) {
101138 re .Equal (50.0 , tokens )
102139
103140 // Test with zero service limit (no limit)
104- limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 )
141+ limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 , nil )
105142 now := time .Now ()
106143 tokens = limiter .applyServiceLimit (now , 50.0 )
107144 re .Equal (50.0 , tokens )
108145
109146 // Test request within available tokens (need to set available tokens first)
110- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
147+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
111148 limiter .AvailableTokens = 100.0 // Manually set available tokens
112149 limiter .LastUpdate = now
113150 tokens = limiter .applyServiceLimit (now , 50.0 )
114151 re .Equal (50.0 , tokens )
115152 re .Equal (50.0 , limiter .AvailableTokens ) // 100 - 50 = 50
116153
117154 // Test request exactly equal to available tokens
118- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
155+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
119156 limiter .AvailableTokens = 100.0 // Manually set available tokens
120157 limiter .LastUpdate = now
121158 tokens = limiter .applyServiceLimit (now , 100.0 )
122159 re .Equal (100.0 , tokens )
123160 re .Equal (0.0 , limiter .AvailableTokens )
124161
125162 // Test request exceeding available tokens
126- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
163+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
127164 limiter .LastUpdate = now
128165 limiter .AvailableTokens = 30.0
129166 tokens = limiter .applyServiceLimit (now , 80.0 )
@@ -135,7 +172,7 @@ func TestApplyServiceLimitWithRefill(t *testing.T) {
135172 re := require .New (t )
136173
137174 // Test that refill happens before applying limit
138- limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 )
175+ limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
139176 baseTime := time .Now ()
140177 limiter .LastUpdate = baseTime
141178 limiter .AvailableTokens = 20.0
@@ -148,7 +185,7 @@ func TestApplyServiceLimitWithRefill(t *testing.T) {
148185 re .Equal (futureTime , limiter .LastUpdate )
149186
150187 // Test partial refill scenario
151- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
188+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
152189 limiter .LastUpdate = baseTime
153190 limiter .AvailableTokens = 10.0
154191
@@ -163,28 +200,28 @@ func TestServiceLimiterEdgeCases(t *testing.T) {
163200 re := require .New (t )
164201
165202 // Test with very small service limit
166- limiter := newServiceLimiter (constant .NullKeyspaceID , 0.1 )
203+ limiter := newServiceLimiter (constant .NullKeyspaceID , 0.1 , nil )
167204 limiter .AvailableTokens = 0.1 // Manually set available tokens
168205 limiter .LastUpdate = time .Now () // Set LastUpdate to current time to avoid refill
169206 now := time .Now ()
170207 tokens := limiter .applyServiceLimit (now , 1.0 )
171208 re .InDelta (0.1 , tokens , 0.001 ) // Use InDelta to handle floating point precision
172209
173210 // Test with very large service limit
174- limiter = newServiceLimiter (constant .NullKeyspaceID , 1000000.0 )
211+ limiter = newServiceLimiter (constant .NullKeyspaceID , 1000000.0 , nil )
175212 limiter .AvailableTokens = 1000000.0 // Manually set available tokens
176213 tokens = limiter .applyServiceLimit (now , 500000.0 )
177214 re .Equal (500000.0 , tokens )
178215
179216 // Test with zero requested tokens
180- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
217+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
181218 limiter .AvailableTokens = 100.0 // Manually set available tokens
182219 tokens = limiter .applyServiceLimit (now , 0.0 )
183220 re .Equal (0.0 , tokens )
184221 re .Equal (100.0 , limiter .AvailableTokens ) // Should remain unchanged
185222
186223 // Test with fractional tokens
187- limiter = newServiceLimiter (constant .NullKeyspaceID , 10.5 )
224+ limiter = newServiceLimiter (constant .NullKeyspaceID , 10.5 , nil )
188225 limiter .LastUpdate = now
189226 limiter .AvailableTokens = 5.25
190227 tokens = limiter .applyServiceLimit (now , 7.75 )
@@ -195,7 +232,7 @@ func TestSetServiceLimit(t *testing.T) {
195232 re := require .New (t )
196233
197234 // Test setting the same service limit (should be no-op)
198- limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 )
235+ limiter := newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
199236 originalTokens := limiter .AvailableTokens
200237 originalUpdate := limiter .LastUpdate
201238
@@ -205,7 +242,7 @@ func TestSetServiceLimit(t *testing.T) {
205242 re .Equal (originalUpdate , limiter .LastUpdate ) // Should remain unchanged
206243
207244 // Test increasing service limit
208- limiter = newServiceLimiter (constant .NullKeyspaceID , 50.0 )
245+ limiter = newServiceLimiter (constant .NullKeyspaceID , 50.0 , nil )
209246 baseTime := time .Now ()
210247 limiter .LastUpdate = baseTime
211248 limiter .AvailableTokens = 30.0
@@ -216,7 +253,7 @@ func TestSetServiceLimit(t *testing.T) {
216253 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
217254
218255 // Test decreasing service limit with available tokens exceeding new limit
219- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
256+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
220257 baseTime = time .Now ()
221258 limiter .LastUpdate = baseTime
222259 limiter .AvailableTokens = 80.0
@@ -231,7 +268,7 @@ func TestSetServiceLimit(t *testing.T) {
231268 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
232269
233270 // Test decreasing service limit with available tokens below new limit
234- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
271+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
235272 baseTime = time .Now ()
236273 limiter .LastUpdate = baseTime
237274 limiter .AvailableTokens = 30.0
@@ -242,7 +279,7 @@ func TestSetServiceLimit(t *testing.T) {
242279 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
243280
244281 // Test setting service limit to zero
245- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
282+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
246283 baseTime = time .Now ()
247284 limiter .LastUpdate = baseTime
248285 limiter .AvailableTokens = 50.0
@@ -253,7 +290,7 @@ func TestSetServiceLimit(t *testing.T) {
253290 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
254291
255292 // Test setting service limit from zero to positive (should NOT initialize available tokens)
256- limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 )
293+ limiter = newServiceLimiter (constant .NullKeyspaceID , 0.0 , nil )
257294 baseTime = time .Now ()
258295 limiter .LastUpdate = baseTime
259296 limiter .AvailableTokens = 0.0
@@ -264,7 +301,7 @@ func TestSetServiceLimit(t *testing.T) {
264301 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
265302
266303 // Test setting negative service limit (should be treated as zero)
267- limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 )
304+ limiter = newServiceLimiter (constant .NullKeyspaceID , 100.0 , nil )
268305 baseTime = time .Now ()
269306 limiter .LastUpdate = baseTime
270307 limiter .AvailableTokens = 50.0
@@ -275,7 +312,7 @@ func TestSetServiceLimit(t *testing.T) {
275312 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
276313
277314 // Test setting service limit with time elapsed (should trigger refill)
278- limiter = newServiceLimiter (constant .NullKeyspaceID , 50.0 )
315+ limiter = newServiceLimiter (constant .NullKeyspaceID , 50.0 , nil )
279316 baseTime = time .Now ()
280317 limiter .LastUpdate = baseTime
281318 limiter .AvailableTokens = 20.0
@@ -290,7 +327,7 @@ func TestSetServiceLimit(t *testing.T) {
290327 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
291328
292329 // Test setting a smaller service limit
293- limiter = newServiceLimiter (constant .NullKeyspaceID , 1000.0 )
330+ limiter = newServiceLimiter (constant .NullKeyspaceID , 1000.0 , nil )
294331 baseTime = time .Now ()
295332 limiter .LastUpdate = baseTime
296333 limiter .AvailableTokens = 500.0
@@ -302,7 +339,7 @@ func TestSetServiceLimit(t *testing.T) {
302339 re .True (limiter .LastUpdate .After (baseTime )) // Should update time
303340
304341 // Test setting a larger service limit
305- limiter = newServiceLimiter (constant .NullKeyspaceID , 10.0 )
342+ limiter = newServiceLimiter (constant .NullKeyspaceID , 10.0 , nil )
306343 baseTime = time .Now ()
307344 limiter .LastUpdate = baseTime
308345 limiter .AvailableTokens = 5.0
0 commit comments