mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
fix: fix TestPendingUpdatesMetric flaky assertion (#14534)
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"golang.org/x/xerrors"
|
||||
|
||||
"cdr.dev/slog"
|
||||
"github.com/coder/quartz"
|
||||
|
||||
"github.com/coder/coder/v2/coderd/database"
|
||||
"github.com/coder/coder/v2/coderd/notifications/dispatch"
|
||||
@@ -54,13 +55,25 @@ type Manager struct {
|
||||
stopOnce sync.Once
|
||||
stop chan any
|
||||
done chan any
|
||||
|
||||
// clock is for testing only
|
||||
clock quartz.Clock
|
||||
}
|
||||
|
||||
type ManagerOption func(*Manager)
|
||||
|
||||
// WithTestClock is used in testing to set the quartz clock on the manager
|
||||
func WithTestClock(clock quartz.Clock) ManagerOption {
|
||||
return func(m *Manager) {
|
||||
m.clock = clock
|
||||
}
|
||||
}
|
||||
|
||||
// NewManager instantiates a new Manager instance which coordinates notification enqueuing and delivery.
|
||||
//
|
||||
// helpers is a map of template helpers which are used to customize notification messages to use global settings like
|
||||
// access URL etc.
|
||||
func NewManager(cfg codersdk.NotificationsConfig, store Store, helpers template.FuncMap, metrics *Metrics, log slog.Logger) (*Manager, error) {
|
||||
func NewManager(cfg codersdk.NotificationsConfig, store Store, helpers template.FuncMap, metrics *Metrics, log slog.Logger, opts ...ManagerOption) (*Manager, error) {
|
||||
// TODO(dannyk): add the ability to use multiple notification methods.
|
||||
var method database.NotificationMethod
|
||||
if err := method.Scan(cfg.Method.String()); err != nil {
|
||||
@@ -74,7 +87,7 @@ func NewManager(cfg codersdk.NotificationsConfig, store Store, helpers template.
|
||||
return nil, ErrInvalidDispatchTimeout
|
||||
}
|
||||
|
||||
return &Manager{
|
||||
m := &Manager{
|
||||
log: log,
|
||||
cfg: cfg,
|
||||
store: store,
|
||||
@@ -95,7 +108,13 @@ func NewManager(cfg codersdk.NotificationsConfig, store Store, helpers template.
|
||||
done: make(chan any),
|
||||
|
||||
handlers: defaultHandlers(cfg, helpers, log),
|
||||
}, nil
|
||||
|
||||
clock: quartz.NewReal(),
|
||||
}
|
||||
for _, o := range opts {
|
||||
o(m)
|
||||
}
|
||||
return m, nil
|
||||
}
|
||||
|
||||
// defaultHandlers builds a set of known handlers; panics if any error occurs as these handlers should be valid at compile time.
|
||||
@@ -150,7 +169,7 @@ func (m *Manager) loop(ctx context.Context) error {
|
||||
var eg errgroup.Group
|
||||
|
||||
// Create a notifier to run concurrently, which will handle dequeueing and dispatching notifications.
|
||||
m.notifier = newNotifier(m.cfg, uuid.New(), m.log, m.store, m.handlers, m.metrics)
|
||||
m.notifier = newNotifier(m.cfg, uuid.New(), m.log, m.store, m.handlers, m.metrics, m.clock)
|
||||
eg.Go(func() error {
|
||||
return m.notifier.run(ctx, m.success, m.failure)
|
||||
})
|
||||
@@ -158,7 +177,7 @@ func (m *Manager) loop(ctx context.Context) error {
|
||||
// Periodically flush notification state changes to the store.
|
||||
eg.Go(func() error {
|
||||
// Every interval, collect the messages in the channels and bulk update them in the store.
|
||||
tick := time.NewTicker(m.cfg.StoreSyncInterval.Value())
|
||||
tick := m.clock.NewTicker(m.cfg.StoreSyncInterval.Value(), "Manager", "storeSync")
|
||||
defer tick.Stop()
|
||||
for {
|
||||
select {
|
||||
|
||||
Reference in New Issue
Block a user