diff --git a/command/agent/check.go b/command/agent/check.go index 180f6db13..17e2fb5f0 100644 --- a/command/agent/check.go +++ b/command/agent/check.go @@ -93,7 +93,10 @@ func (c *CheckMonitor) Stop() { // run is invoked by a goroutine to run until Stop() is called func (c *CheckMonitor) run() { - next := time.After(0) + // Get the randomized initial pause time + initialPauseTime := randomStagger(c.Interval) + c.Logger.Printf("[DEBUG] agent: pausing %v before first invocation of %s", initialPauseTime, c.Script) + next := time.After(initialPauseTime) for { select { case <-next: diff --git a/command/agent/check_test.go b/command/agent/check_test.go index 19e087c67..6a6f80afc 100644 --- a/command/agent/check_test.go +++ b/command/agent/check_test.go @@ -65,6 +65,34 @@ func TestCheckMonitor_BadCmd(t *testing.T) { expectStatus(t, "foobarbaz", structs.HealthCritical) } +func TestCheckMonitor_RandomStagger(t *testing.T) { + mock := &MockNotify{ + state: make(map[string]string), + updates: make(map[string]int), + output: make(map[string]string), + } + check := &CheckMonitor{ + Notify: mock, + CheckID: "foo", + Script: "exit 0", + Interval: 25 * time.Millisecond, + Logger: log.New(os.Stderr, "", log.LstdFlags), + } + check.Start() + defer check.Stop() + + time.Sleep(50 * time.Millisecond) + + // Should have at least 1 update + if mock.updates["foo"] < 1 { + t.Fatalf("should have 1 or more updates %v", mock.updates) + } + + if mock.state["foo"] != structs.HealthPassing { + t.Fatalf("should be %v %v", structs.HealthPassing, mock.state) + } +} + func TestCheckMonitor_LimitOutput(t *testing.T) { mock := &MockNotify{ state: make(map[string]string),