@@ -96,7 +96,7 @@ func DurationWithPositiveJitter(input time.Duration, variancePerc float64) time.
96
96
return input + time .Duration (jitter )
97
97
}
98
98
99
- // PositiveJitter returns random duration from "input " to "input*variance" interval.
99
+ // PositiveJitter returns random duration from "0 " to "input*variance" interval.
100
100
func PositiveJitter (input time.Duration , variancePerc float64 ) time.Duration {
101
101
// No duration? No jitter.
102
102
if input == 0 {
@@ -208,14 +208,19 @@ func (t *SlottedTicker) Stop() {
208
208
}
209
209
210
210
func (t * SlottedTicker ) nextInterval () time.Duration {
211
- slot := time .UnixMilli ((time .Now ().UnixMilli () / t .d .Milliseconds ()) * t .d .Milliseconds ())
212
211
slitIndex , totalSlots := t .sf ()
212
+
213
+ // Discover what time the last iteration started
214
+ lastStartTime := time .UnixMilli ((time .Now ().UnixMilli () / t .d .Milliseconds ()) * t .d .Milliseconds ())
213
215
slotSize := t .d / time .Duration (totalSlots )
214
216
offset := time .Duration ((float64 (slitIndex ) / float64 (totalSlots )) * float64 (t .d ))
215
- slot = slot .Add (offset )
216
- for slot .Before (time .Now ()) {
217
- slot = slot .Add (t .d )
217
+ // Lets offset the time of the iteration
218
+ lastStartTime = lastStartTime .Add (offset )
219
+
220
+ // Keep adding the ticker duration until we pass time.now
221
+ for lastStartTime .Before (time .Now ()) {
222
+ lastStartTime = lastStartTime .Add (t .d )
218
223
}
219
- i := time . Until ( slot )
220
- return i + PositiveJitter (slotSize , 1 )
224
+
225
+ return time . Until ( lastStartTime ) + PositiveJitter (slotSize , 1 )
221
226
}
0 commit comments