diff --git a/.changelog/11579.txt b/.changelog/11579.txt new file mode 100644 index 000000000000..bf878ae1987b --- /dev/null +++ b/.changelog/11579.txt @@ -0,0 +1,3 @@ +```release-note:bug +rpc: Fixed scaling policy get index response when the policy is found +``` diff --git a/nomad/scaling_endpoint.go b/nomad/scaling_endpoint.go index c3363e45a92b..bb87769a234b 100644 --- a/nomad/scaling_endpoint.go +++ b/nomad/scaling_endpoint.go @@ -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 - } - - // 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 + // 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) } - reply.Index = index return nil }} return p.srv.blockingRPC(&opts) diff --git a/nomad/scaling_endpoint_test.go b/nomad/scaling_endpoint_test.go index 73311b1f6c1d..6dabf3087534 100644 --- a/nomad/scaling_endpoint_test.go +++ b/nomad/scaling_endpoint_test.go @@ -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) }