diff --git a/rules/group.go b/rules/group.go index 4398d9211d..9ad9aab093 100644 --- a/rules/group.go +++ b/rules/group.go @@ -302,11 +302,19 @@ func (g *Group) run(ctx context.Context) { } } -func (g *Group) stop() { +func (g *Group) stopAsync() { close(g.done) +} + +func (g *Group) waitStopped() { <-g.terminated } +func (g *Group) stop() { + g.stopAsync() + g.waitStopped() +} + func (g *Group) hash() uint64 { l := labels.New( labels.Label{Name: "name", Value: g.name}, diff --git a/rules/manager.go b/rules/manager.go index 50b2a7e99d..b1d3e8e3d6 100644 --- a/rules/manager.go +++ b/rules/manager.go @@ -188,8 +188,14 @@ func (m *Manager) Stop() { m.logger.Info("Stopping rule manager...") + // Stop all groups asynchronously, then wait for them to finish. + // This is faster than stopping and waiting for each group in sequence. for _, eg := range m.groups { - eg.stop() + eg.stopAsync() + } + + for _, eg := range m.groups { + eg.waitStopped() } // Shut down the groups waiting multiple evaluation intervals to write