Skip to content

Commit fd81e7c

Browse files
committed
Mark Snake timer transitions as parent-locked
AI assisted with development. Every line of code was either written by or carefully reviewed by me :) Signed-off-by: Brett Wines <bwines@slack-corp.com>
1 parent 9db7b7e commit fd81e7c

5 files changed

Lines changed: 19 additions & 8 deletions

File tree

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,16 +158,18 @@ type (
158158
cfg CoDelConfig
159159
nowNs func() int64
160160
scheduleDropTimer func(delayNs int64)
161+
stopDropTimer func()
161162
}
162163
)
163164

164-
func newCoDelQueue[T any](cfg CoDelConfig, nowNs func() int64, scheduleDropTimer func(delayNs int64)) *CoDelQueue[T] {
165+
func newCoDelQueue[T any](cfg CoDelConfig, nowNs func() int64, scheduleDropTimer func(delayNs int64), stopDropTimer func()) *CoDelQueue[T] {
165166
q := &CoDelQueue[T]{
166167
queue: list.New(),
167168
count: 1,
168169
cfg: cfg,
169170
nowNs: nowNs,
170171
scheduleDropTimer: scheduleDropTimer,
172+
stopDropTimer: stopDropTimer,
171173
}
172174
q.droppable.init()
173175
return q

go/vt/vttablet/tabletserver/loadshed/codelq_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ func (r *testDropTimerRecorder) schedule(delayNs int64) {
7070
r.delayNs = delayNs
7171
}
7272

73+
func (r *testDropTimerRecorder) stop() {
74+
r.armed = false
75+
r.scheduled = false
76+
}
77+
7378
// reset models a timer fire in tests: clears both the armed flag and the
7479
// scheduled observability flag, so the next schedule() call is detected.
7580
func (r *testDropTimerRecorder) reset() {
@@ -79,7 +84,7 @@ func (r *testDropTimerRecorder) reset() {
7984

8085
func newTestQueue(cfg CoDelConfig, clock *testClock) (*testCoDelQueue, *testDropTimerRecorder) {
8186
rec := &testDropTimerRecorder{}
82-
q := newCoDelQueue[struct{}](cfg, clock.nowFunc, rec.schedule)
87+
q := newCoDelQueue[struct{}](cfg, clock.nowFunc, rec.schedule, rec.stop)
8388
return q, rec
8489
}
8590

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ func NewSnake[T any](cfg SnakeConfig) *Snake[T] {
9292
timerLag: stats.NewHistogram("", "", loadshedBucketCutoffs),
9393
valveDepth: stats.NewHistogram("", "", lengthBucketCutoffs),
9494
}
95-
s.q = newValvedCoDelQueue[T](cfg.CoDel, defaultClock, s.lockedScheduleDropTimer)
95+
s.q = newValvedCoDelQueue[T](cfg.CoDel, defaultClock, s.lockedScheduleDropTimer, s.lockedStopDropTimer)
9696
return s
9797
}
9898

@@ -252,15 +252,19 @@ func (s *Snake[T]) lockedScheduleDropTimer(delayNs int64) {
252252
s.dropTimerExpectedNs = s.clockFunc() + delayNs
253253
}
254254

255-
func (s *Snake[T]) TimerUpdate() (time.Duration, bool) {
255+
func (s *Snake[T]) lockedStopDropTimer() {
256+
s.dropTimerArmed = false
257+
}
258+
259+
func (s *Snake[T]) LockedTimerUpdate() (time.Duration, bool) {
256260
if !s.dropTimerChanged {
257261
return 0, false
258262
}
259263
s.dropTimerChanged = false
260264
return time.Duration(s.dropTimerDelayNs) * time.Nanosecond, true
261265
}
262266

263-
func (s *Snake[T]) DropTimerFired() []T {
267+
func (s *Snake[T]) LockedDropTimerFired() []T {
264268
if !s.dropTimerArmed {
265269
return nil
266270
}

go/vt/vttablet/tabletserver/loadshed/valved_codelq.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,12 +100,12 @@ type (
100100
}
101101
)
102102

103-
func newValvedCoDelQueue[T any](cfg CoDelConfig, nowNs func() int64, scheduleDropTimer func(delayNs int64)) *ValvedCoDelQueue[T] {
103+
func newValvedCoDelQueue[T any](cfg CoDelConfig, nowNs func() int64, scheduleDropTimer func(delayNs int64), stopDropTimer func()) *ValvedCoDelQueue[T] {
104104
q := &ValvedCoDelQueue[T]{
105105
valves: make(map[string][]*Request[T]),
106106
droppablePerValve: make(map[string]*Request[T]),
107107
}
108-
q.codelq = newCoDelQueue[T](cfg, nowNs, scheduleDropTimer)
108+
q.codelq = newCoDelQueue[T](cfg, nowNs, scheduleDropTimer, stopDropTimer)
109109
return q
110110
}
111111

go/vt/vttablet/tabletserver/loadshed/valved_codelq_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ type testValvedCoDelQueue = ValvedCoDelQueue[struct{}]
2727

2828
func newValvedQueue(clock *testClock) (*testValvedCoDelQueue, *testDropTimerRecorder) {
2929
rec := &testDropTimerRecorder{}
30-
q := newValvedCoDelQueue[struct{}](defaultTestConfig(), clock.nowFunc, rec.schedule)
30+
q := newValvedCoDelQueue[struct{}](defaultTestConfig(), clock.nowFunc, rec.schedule, rec.stop)
3131
return q, rec
3232
}
3333

0 commit comments

Comments
 (0)