Merge pull request #11579 from hashicorp/b-getscalingpolicy-rpc-index-response

rpc: fix scaling policy get index response when policy is found.
This commit is contained in:
Michael Schurter
2021-11-30 10:43:20 -08:00
committed by GitHub
3 changed files with 20 additions and 13 deletions

3
.changelog/11579.txt Normal file
View File

@@ -0,0 +1,3 @@
```release-note:bug
rpc: Fixed scaling policy get index response when the policy is found
```

View File

@@ -120,18 +120,18 @@ func (p *Scaling) GetPolicy(args *structs.ScalingPolicySpecificRequest,
reply.Policy = p
// Use the last index that affected the policy table
index, err := state.Index("scaling_policy")
if err != nil {
return err
// If the state lookup returned a policy object, use the modify
// index for the response. Otherwise, use the index table to supply
// this, ensuring a non-zero value.
if p != nil {
reply.Index = p.ModifyIndex
} else {
index, err := state.Index("scaling_policy")
if err != nil {
return err
}
reply.Index = helper.Uint64Max(1, index)
}
// Ensure we never set the index to zero, otherwise a blocking query cannot be used.
// We floor the index at one, since realistically the first write must have a higher index.
if index == 0 {
index = 1
}
reply.Index = index
return nil
}}
return p.srv.blockingRPC(&opts)

View File

@@ -36,7 +36,11 @@ func TestScalingEndpoint_GetPolicy(t *testing.T) {
p2 := mock.ScalingPolicy()
s1.fsm.State().UpsertScalingPolicies(1000, []*structs.ScalingPolicy{p1, p2})
// Lookup the policy
// Add another policy at a higher index.
p3 := mock.ScalingPolicy()
require.NoError(s1.fsm.State().UpsertScalingPolicies(2000, []*structs.ScalingPolicy{p3}))
// Lookup the first policy and perform assertions.
get := &structs.ScalingPolicySpecificRequest{
ID: p1.ID,
QueryOptions: structs.QueryOptions{
@@ -54,7 +58,7 @@ func TestScalingEndpoint_GetPolicy(t *testing.T) {
resp = structs.SingleScalingPolicyResponse{}
err = msgpackrpc.CallWithCodec(codec, "Scaling.GetPolicy", get, &resp)
require.NoError(err)
require.EqualValues(1000, resp.Index)
require.EqualValues(2000, resp.Index)
require.Nil(resp.Policy)
}