m/pkg/event/memory: simplify and fix implementation
The old implementation is very complicated and has multiple concurrency
bugs. One of these bugs is already described in a block comment. Another
bug is that if a watcher is closed while being updated, `update` will
try to send on the closed channel `deadletterSubmitC`, which panics.
This changes it to a much simpler implementation.
It could be further simplified it by dropping the Sync flag entirely,
which is currently unused. Or we could use the buffered channel also for
Sync values, and just skip dropping previous values. This still ensures
that all values are delivered, but changes the semantics slightly: Set
would no longer block until Get is called, if there is space in the
channel buffer.
Additionally, there is no longer a memory leak when a watcher is
repeatedly closed and readded, but Set never called. I added a test for
this.
Fixes #127
Change-Id: I2775a36cf2d097c5961a09a387428774a068e1f5
Reviewed-on: https://review.monogon.dev/c/monogon/+/2875
Reviewed-by: Serge Bazanski <serge@monogon.tech>
Vouch-Run-CI: Serge Bazanski <serge@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/pkg/event/event.go b/metropolis/pkg/event/event.go
index 0898eb5..cb8b9b5 100644
--- a/metropolis/pkg/event/event.go
+++ b/metropolis/pkg/event/event.go
@@ -163,7 +163,7 @@
Get(context.Context, ...GetOption[T]) (T, error)
// Close must be called if the Watcher is not going to be used anymore -
- // otherwise, a goroutine will leak.
+ // otherwise, it will not be garbage collected.
Close() error
}