Skip to content

Commit

Permalink
Merge pull request #14935 from hashicorp/fix/alias-leak
Browse files Browse the repository at this point in the history
  • Loading branch information
freddygv committed Oct 13, 2022
2 parents 2c5f6a4 + da68ed7 commit ee4cdc4
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 22 deletions.
3 changes: 3 additions & 0 deletions .changelog/14935.txt
@@ -0,0 +1,3 @@
```release-note:bug
agent: avoid leaking the alias check runner goroutine when the check is de-registered
```
5 changes: 4 additions & 1 deletion agent/agent.go
Expand Up @@ -3267,7 +3267,10 @@ func (a *Agent) cancelCheckMonitors(checkID structs.CheckID) {
check.Stop()
delete(a.checkH2PINGs, checkID)
}

if check, ok := a.checkAliases[checkID]; ok {
check.Stop()
delete(a.checkAliases, checkID)
}
}

// updateTTLCheck is used to update the status of a TTL check via the Agent API.
Expand Down
52 changes: 31 additions & 21 deletions agent/agent_test.go
Expand Up @@ -1912,7 +1912,7 @@ node_name = "` + a.Config.NodeName + `"
}
}

func TestAgent_AddCheck_Alias(t *testing.T) {
func TestAgent_Alias_AddRemove(t *testing.T) {
if testing.Short() {
t.Skip("too slow for testing.Short")
}
Expand All @@ -1922,29 +1922,39 @@ func TestAgent_AddCheck_Alias(t *testing.T) {
a := NewTestAgent(t, "")
defer a.Shutdown()

health := &structs.HealthCheck{
Node: "foo",
CheckID: "aliashealth",
Name: "Alias health check",
Status: api.HealthCritical,
}
chk := &structs.CheckType{
AliasService: "foo",
}
err := a.AddCheck(health, chk, false, "", ConfigSourceLocal)
require.NoError(t, err)
cid := structs.NewCheckID("aliashealth", nil)

// Ensure we have a check mapping
sChk := requireCheckExists(t, a, "aliashealth")
require.Equal(t, api.HealthCritical, sChk.Status)
testutil.RunStep(t, "add check", func(t *testing.T) {
health := &structs.HealthCheck{
Node: "foo",
CheckID: cid.ID,
Name: "Alias health check",
Status: api.HealthCritical,
}
chk := &structs.CheckType{
AliasService: "foo",
}
err := a.AddCheck(health, chk, false, "", ConfigSourceLocal)
require.NoError(t, err)

chkImpl, ok := a.checkAliases[structs.NewCheckID("aliashealth", nil)]
require.True(t, ok, "missing aliashealth check")
require.Equal(t, "", chkImpl.RPCReq.Token)
sChk := requireCheckExists(t, a, cid.ID)
require.Equal(t, api.HealthCritical, sChk.Status)

cs := a.State.CheckState(structs.NewCheckID("aliashealth", nil))
require.NotNil(t, cs)
require.Equal(t, "", cs.Token)
chkImpl, ok := a.checkAliases[cid]
require.True(t, ok, "missing aliashealth check")
require.Equal(t, "", chkImpl.RPCReq.Token)

cs := a.State.CheckState(cid)
require.NotNil(t, cs)
require.Equal(t, "", cs.Token)
})

testutil.RunStep(t, "remove check", func(t *testing.T) {
require.NoError(t, a.RemoveCheck(cid, false))

requireCheckMissing(t, a, cid.ID)
requireCheckMissingMap(t, a.checkAliases, cid.ID)
})
}

func TestAgent_AddCheck_Alias_setToken(t *testing.T) {
Expand Down

0 comments on commit ee4cdc4

Please sign in to comment.