rpc: fix scaling policy get index response when policy is found.

When GetPolicy is called within the scaling handler, the index
table was being used to populate the reply index irregardless of
whether the policy was found or not. This change fixes that
behaviour so that the policy modify index is used when the policy
lookup is successful.
This commit is contained in:
James Rasell
2021-11-26 10:40:27 +01:00
parent de85e58e36
commit 50c046e8e9
2 changed files with 17 additions and 13 deletions

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)
}