mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-09 23:24:05 -08:00
Make rules Manager Update method no-op after Close
This has to be done because Close and Update methods are accessed concurrently. Signed-off-by: Raphael Silva <rapphil@gmail.com>
This commit is contained in:
parent
9290d1308d
commit
cd5a7b5020
|
@ -190,10 +190,18 @@ func (m *Manager) Stop() {
|
|||
|
||||
// Update the rule manager's state as the config requires. If
|
||||
// loading the new rules failed the old rule set is restored.
|
||||
// This method will no-op in case the manager is already stopped
|
||||
func (m *Manager) Update(interval time.Duration, files []string, externalLabels labels.Labels, externalURL string, groupEvalIterationFunc GroupEvalIterationFunc) error {
|
||||
m.mtx.Lock()
|
||||
defer m.mtx.Unlock()
|
||||
|
||||
// We cannot update a stopped manager
|
||||
select {
|
||||
case <-m.done:
|
||||
return nil
|
||||
default:
|
||||
}
|
||||
|
||||
groups, errs := m.LoadGroups(interval, externalLabels, externalURL, groupEvalIterationFunc, files...)
|
||||
|
||||
if errs != nil {
|
||||
|
|
|
@ -2099,6 +2099,23 @@ func TestBoundedRuleEvalConcurrency(t *testing.T) {
|
|||
require.EqualValues(t, maxInflight.Load(), int32(maxConcurrency)+int32(groupCount))
|
||||
}
|
||||
|
||||
func TestUpdateWhenStopped(t *testing.T) {
|
||||
files := []string{"fixtures/rules.yaml"}
|
||||
ruleManager := NewManager(&ManagerOptions{
|
||||
Context: context.Background(),
|
||||
Logger: log.NewNopLogger(),
|
||||
})
|
||||
ruleManager.start()
|
||||
err := ruleManager.Update(10*time.Second, files, labels.EmptyLabels(), "", nil)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, ruleManager.groups)
|
||||
|
||||
ruleManager.Stop()
|
||||
// Updates following a stop are no-op
|
||||
err = ruleManager.Update(10*time.Second, []string{}, labels.EmptyLabels(), "", nil)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
const artificialDelay = 250 * time.Millisecond
|
||||
|
||||
func optsFactory(storage storage.Storage, maxInflight, inflightQueries *atomic.Int32, maxConcurrent int64) *ManagerOptions {
|
||||
|
|
Loading…
Reference in a new issue