mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user