From 3bdd5a50c3b8fa0a885dc58a3d0ec64880f95619 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 15 Sep 2026 13:51:47 +0200 Subject: fix: delete the timer entry on natural expiry --- internal/notify/service.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'internal/notify/service.go') diff --git a/internal/notify/service.go b/internal/notify/service.go index d775aa6..22d7830 100644 --- a/internal/notify/service.go +++ b/internal/notify/service.go @@ -115,9 +115,21 @@ func (s *Service) arm(id uint32, ms int64) { if ms <= 0 { return } - s.timers[id] = time.AfterFunc(time.Duration(ms)*time.Millisecond, func() { - s.store.Expire(id) + var t *time.Timer + t = time.AfterFunc(time.Duration(ms)*time.Millisecond, func() { + s.mu.Lock() + current := s.timers[id] == t + if current { + delete(s.timers, id) + } + s.mu.Unlock() + // Only the current timer may expire the id: a timer left over from a + // replaced notification must not close its successor. + if current { + s.store.Expire(id) + } }) + s.timers[id] = t } func (s *Service) stopTimer(id uint32) { -- cgit v1.2.3