Skip to content

Commit d73bf49

Browse files
bgwinesclaude
andcommitted
Review cleanup: remove redundant nGranted, internalize test helpers
- Remove nGranted field; len(holders) is the single source of truth - Move IsLocked/NGranted to test-only helpers (isIdle/nGranted) - Refactor lockedAdvanceFirstWaiting to accept elem param, absorbing the equality guard from all 4 callers - Rename inFlightAfterCancel → nGrantedAfterCancel in race test AI disclosure: Claude Code assisted with development. Every line of code was either written by or carefully reviewed by me :) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Brett Wines <bwines@slack-corp.com>
1 parent 0de8af7 commit d73bf49

7 files changed

Lines changed: 72 additions & 89 deletions

File tree

go/vt/vttablet/tabletserver/loadshed/codelq.go

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -194,9 +194,7 @@ func (q *CoDelQueue) lockedPeek() *Request {
194194
if req.signaledValue == nil || req.signaledValue == grantSentinel {
195195
return req
196196
}
197-
if q.firstWaiting == front {
198-
q.lockedAdvanceFirstWaiting()
199-
}
197+
q.lockedAdvanceFirstWaiting(front)
200198
q.queue.Remove(front)
201199
req.codelqElem = nil
202200
if req.isDroppable() {
@@ -217,9 +215,7 @@ func (q *CoDelQueue) lockedPeek() *Request {
217215
// updating dropping state if appropriate.
218216
func (q *CoDelQueue) lockedPopElem(elem *list.Element, err error) *Request {
219217
req := elem.Value.(*Request)
220-
if q.firstWaiting == elem {
221-
q.lockedAdvanceFirstWaiting()
222-
}
218+
q.lockedAdvanceFirstWaiting(elem)
223219
q.queue.Remove(elem)
224220
req.codelqElem = nil
225221

@@ -242,9 +238,7 @@ func (q *CoDelQueue) lockedRemove(r *Request) {
242238
if r.codelqElem == nil {
243239
return
244240
}
245-
if q.firstWaiting == r.codelqElem {
246-
q.lockedAdvanceFirstWaiting()
247-
}
241+
q.lockedAdvanceFirstWaiting(r.codelqElem)
248242
q.queue.Remove(r.codelqElem)
249243
r.codelqElem = nil
250244

@@ -264,18 +258,17 @@ func (q *CoDelQueue) lockedOnGrant(r *Request) {
264258
q.dropping = false
265259
}
266260
}
267-
if q.firstWaiting == r.codelqElem {
268-
q.lockedAdvanceFirstWaiting()
269-
}
261+
q.lockedAdvanceFirstWaiting(r.codelqElem)
270262
}
271263

272-
// lockedAdvanceFirstWaiting moves the firstWaiting pointer to the next
273-
// unsignaled request in the queue, or nil if none remain.
274-
func (q *CoDelQueue) lockedAdvanceFirstWaiting() {
275-
if q.firstWaiting == nil {
264+
// lockedAdvanceFirstWaiting advances the firstWaiting pointer past elem if
265+
// elem is the current firstWaiting. elem is a queue entry that is no longer
266+
// waiting — either because it was granted, removed, or dropped.
267+
func (q *CoDelQueue) lockedAdvanceFirstWaiting(elem *list.Element) {
268+
if q.firstWaiting != elem {
276269
return
277270
}
278-
for e := q.firstWaiting.Next(); e != nil; e = e.Next() {
271+
for e := elem.Next(); e != nil; e = e.Next() {
279272
if e.Value.(*Request).signaledValue == nil {
280273
q.firstWaiting = e
281274
return

go/vt/vttablet/tabletserver/loadshed/snake.go

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ type (
4646
mu sync.Mutex
4747

4848
q *SelfContentionAwareCoDelQueue
49-
nGranted int
5049
holders map[*Request]struct{}
5150
maxAgeTimers map[*Request]*time.Timer
5251
dropTimer *time.Timer
@@ -91,7 +90,7 @@ func (s *Snake) capacity() int {
9190
}
9291

9392
func (s *Snake) hasCapacity() bool {
94-
return s.nGranted < s.capacity()
93+
return len(s.holders) < s.capacity()
9594
}
9695

9796
// Acquire acquires a slot. It blocks until a slot is granted, the request
@@ -147,20 +146,6 @@ func (s *Snake) Acquire(ctx context.Context, valveID string) (*SafeUnlock, error
147146
}
148147
}
149148

150-
// IsLocked reports whether any slot is currently held.
151-
func (s *Snake) IsLocked() bool {
152-
s.mu.Lock()
153-
defer s.mu.Unlock()
154-
return s.nGranted > 0
155-
}
156-
157-
// InFlight reports the number of currently held slots.
158-
func (s *Snake) InFlight() int {
159-
s.mu.Lock()
160-
defer s.mu.Unlock()
161-
return s.nGranted
162-
}
163-
164149
// IsHealthy reports whether the CoDel queue is healthy.
165150
func (s *Snake) IsHealthy() bool {
166151
s.mu.Lock()
@@ -193,7 +178,6 @@ func (s *Snake) release(req *Request, excValue error) error {
193178
s.lockedStopMaxAgeTimer(req)
194179
delete(s.holders, req)
195180
s.q.lockedComplete(req)
196-
s.nGranted--
197181
s.lockedTryGrantOne()
198182
s.mu.Unlock()
199183

@@ -206,13 +190,11 @@ func (s *Snake) releaseOnCancel(req *Request) {
206190
s.lockedStopMaxAgeTimer(req)
207191
delete(s.holders, req)
208192
s.q.lockedComplete(req)
209-
s.nGranted--
210193
s.lockedTryGrantOne()
211194
s.mu.Unlock()
212195
}
213196

214197
func (s *Snake) lockedGrant(req *Request) {
215-
s.nGranted++
216198
s.holders[req] = struct{}{}
217199
s.q.lockedOnGrant(req)
218200
s.lockedStartMaxAgeTimer(req)

go/vt/vttablet/tabletserver/loadshed/snake_nholder_test.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,12 @@ func TestSnake_NHolder_ConcurrentGrants(t *testing.T) {
4444
unlocks[i] = u
4545
}
4646

47-
assert.Equal(t, cap, s.InFlight())
47+
assert.Equal(t, cap, s.nGranted())
4848

4949
for _, u := range unlocks {
5050
u.Release()
5151
}
52-
assert.Equal(t, 0, s.InFlight())
52+
assert.Equal(t, 0, s.nGranted())
5353
})
5454
}
5555
}
@@ -116,7 +116,7 @@ func TestSnake_NHolder_ParallelThroughput(t *testing.T) {
116116
if err != nil {
117117
continue
118118
}
119-
cur := int64(s.InFlight())
119+
cur := int64(s.nGranted())
120120
for {
121121
old := maxConcurrent.Load()
122122
if cur <= old || maxConcurrent.CompareAndSwap(old, cur) {
@@ -191,7 +191,7 @@ func TestSnake_NHolder_DynamicCapacityDecrease(t *testing.T) {
191191
}
192192

193193
cap.Store(2)
194-
assert.Equal(t, 4, s.InFlight(), "existing holders are not evicted")
194+
assert.Equal(t, 4, s.nGranted(), "existing holders are not evicted")
195195

196196
acquired := make(chan struct{})
197197
go func() {
@@ -235,7 +235,7 @@ func TestSnake_NHolder_ValveSerialization(t *testing.T) {
235235
require.NoError(t, err)
236236
u3, err := s.Acquire(t.Context(), "valve-c")
237237
require.NoError(t, err)
238-
assert.Equal(t, 3, s.InFlight())
238+
assert.Equal(t, 3, s.nGranted())
239239

240240
results := make(chan string, 6)
241241
var wg sync.WaitGroup
@@ -266,12 +266,12 @@ func TestSnake_NHolder_ValveSerialization(t *testing.T) {
266266
count++
267267
}
268268
assert.Equal(t, 6, count, "all valve-serialized requests should complete")
269-
assert.Equal(t, 0, s.InFlight())
269+
assert.Equal(t, 0, s.nGranted())
270270
}
271271

272-
// --- N-holder: InFlight accuracy under concurrency ---
272+
// --- N-holder: NGranted accuracy under concurrency ---
273273

274-
func TestSnake_NHolder_InFlightAccuracy(t *testing.T) {
274+
func TestSnake_NHolder_NGrantedAccuracy(t *testing.T) {
275275
const capacity = 5
276276
cfg := defaultSnakeConfig()
277277
cfg.Capacity = func() int { return capacity }
@@ -288,16 +288,16 @@ func TestSnake_NHolder_InFlightAccuracy(t *testing.T) {
288288
if err != nil {
289289
return
290290
}
291-
if s.InFlight() > capacity {
291+
if s.nGranted() > capacity {
292292
violations.Add(1)
293293
}
294294
u.Release()
295295
}()
296296
}
297297

298298
wg.Wait()
299-
assert.Zero(t, violations.Load(), "InFlight must never exceed capacity")
300-
assert.Equal(t, 0, s.InFlight())
299+
assert.Zero(t, violations.Load(), "NGranted must never exceed capacity")
300+
assert.Equal(t, 0, s.nGranted())
301301
}
302302

303303
// --- N-holder: context cancel frees slot for waiter ---
@@ -369,7 +369,7 @@ func TestSnake_NHolder_MaxAge_MultipleHolders(t *testing.T) {
369369
u2.Release()
370370

371371
assert.Eventually(t, func() bool {
372-
return s.InFlight() == 0
372+
return s.nGranted() == 0
373373
}, 1*time.Second, 5*time.Millisecond)
374374
}
375375

@@ -419,7 +419,6 @@ func TestSnake_NHolder_MemoryCleanup(t *testing.T) {
419419

420420
s.mu.Lock()
421421
defer s.mu.Unlock()
422-
assert.Equal(t, 0, s.nGranted)
423422
assert.Empty(t, s.holders)
424423
assert.Equal(t, 0, s.q.lockedLen())
425424
assert.Empty(t, s.q.pendingRequests)

go/vt/vttablet/tabletserver/loadshed/snake_overload_test.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func TestSnake_Overload_MassCancel(t *testing.T) {
140140

141141
// Release original holder
142142
unlock.Release()
143-
assert.False(t, s.IsLocked())
143+
assert.True(t, s.isIdle())
144144

145145
// Verify the lock is still usable
146146
u, err := s.Acquire(t.Context(), "mass-cancel")
@@ -376,7 +376,6 @@ func TestSnake_Memory_CleanBaseline(t *testing.T) {
376376
s.mu.Lock()
377377
defer s.mu.Unlock()
378378

379-
assert.Equal(t, 0, s.nGranted, "nGranted should be 0 after all releases")
380379
assert.Empty(t, s.holders, "holders map should be empty after all releases")
381380
assert.Equal(t, 0, s.q.lockedLen(), "queue should be empty")
382381
assert.Empty(t, s.q.pendingRequests, "pendingRequests map should be empty")
@@ -475,7 +474,7 @@ func TestSnake_MaxAge_VsContextCancel_Race(t *testing.T) {
475474
cancel()
476475
}
477476

478-
assert.False(t, s.IsLocked(), "lock must not be stuck after max-age/cancel races")
477+
assert.True(t, s.isIdle(), "lock must not be stuck after max-age/cancel races")
479478
}
480479

481480
// --- Double-signal panic invariant ---
@@ -506,5 +505,5 @@ func TestSnake_NoPanicOnConcurrentCancel(t *testing.T) {
506505
unlock.Release()
507506
wg.Wait()
508507

509-
assert.False(t, s.IsLocked())
508+
assert.True(t, s.isIdle())
510509
}

go/vt/vttablet/tabletserver/loadshed/snake_race_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,10 @@ func TestSnake_CancelVsGrant_Race(t *testing.T) {
7474
if acquireErr != nil {
7575
// B was cancelled. Verify the lock isn't stuck.
7676
s.mu.Lock()
77-
inFlightAfterCancel := s.nGranted
77+
nGrantedAfterCancel := len(s.holders)
7878
s.mu.Unlock()
7979

80-
if inFlightAfterCancel > 0 {
80+
if nGrantedAfterCancel > 0 {
8181
leaked.Add(1)
8282
}
8383

0 commit comments

Comments
 (0)