Skip to content

Commit

Permalink
core: document why InstantTimer is required
Browse files Browse the repository at this point in the history
originally explained by @MarcoPolo here: #2260 (comment)
  • Loading branch information
sukunrt committed Jun 12, 2023
1 parent 1b0df37 commit e84d912
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions core/test/mockclock.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ func NewMockClock() *MockClock {
return &MockClock{now: time.Unix(0, 0), advanceBySem: make(chan struct{}, 1)}
}

// InstantTimer implements a timer that triggers at a fixed instant in time as opposed to after a
// fixed duration from the moment of creation/reset.
//
// In test environments, when using a Timer which fires after a duration, there is a race between
// the goroutine moving time forward using `clock.Advanceby` and the goroutine resetting the
// timer by doing `timer.Reset(desiredInstant.Sub(time.Now()))`. The value of
// `desiredInstance.sub(time.Now())` is different depending on whether `clock.AdvanceBy` finishes
// before or after the timer reset.
func (c *MockClock) InstantTimer(when time.Time) *mockInstantTimer {
c.mu.Lock()
defer c.mu.Unlock()
Expand Down

0 comments on commit e84d912

Please sign in to comment.