diff --git a/nomad/fsm.go b/nomad/fsm.go index dee8420ff..71b4c07bd 100644 --- a/nomad/fsm.go +++ b/nomad/fsm.go @@ -1004,14 +1004,14 @@ func (n *nomadFSM) applySchedulerConfigUpdate(buf []byte, index uint64) interfac if err := structs.Decode(buf, &req); err != nil { panic(fmt.Errorf("failed to decode request: %v", err)) } - defer metrics.MeasureSince([]string{"nomad", "fsm", "scheduler-config"}, time.Now()) + defer metrics.MeasureSince([]string{"nomad", "fsm", "apply_scheduler_config"}, time.Now()) if req.CAS { - act, err := n.state.SchedulerCASConfig(index, req.Config.ModifyIndex, &req.Config) + applied, err := n.state.SchedulerCASConfig(index, req.Config.ModifyIndex, &req.Config) if err != nil { return err } - return act + return applied } return n.state.SchedulerSetConfig(index, &req.Config) } diff --git a/nomad/fsm_test.go b/nomad/fsm_test.go index dcb3b9170..ebe62189d 100644 --- a/nomad/fsm_test.go +++ b/nomad/fsm_test.go @@ -1664,7 +1664,7 @@ func TestFSM_DeregisterVaultAccessor(t *testing.T) { func TestFSM_ApplyPlanResults(t *testing.T) { t.Parallel() fsm := testFSM(t) - + fsm.evalBroker.SetEnabled(true) // Create the request and create a deployment alloc := mock.Alloc() alloc.Resources = &structs.Resources{} // COMPAT(0.11): Remove in 0.11, used to bypass resource creation in state store @@ -1683,13 +1683,39 @@ func TestFSM_ApplyPlanResults(t *testing.T) { fsm.State().UpsertEvals(1, []*structs.Evaluation{eval}) fsm.State().UpsertJobSummary(1, mock.JobSummary(alloc.JobID)) + + // set up preempted jobs and allocs + job1 := mock.Job() + job2 := mock.Job() + + alloc1 := mock.Alloc() + alloc1.Job = job1 + alloc1.JobID = job1.ID + alloc1.PreemptedByAllocation = alloc.ID + + alloc2 := mock.Alloc() + alloc2.Job = job2 + alloc2.JobID = job2.ID + alloc2.PreemptedByAllocation = alloc.ID + + fsm.State().UpsertAllocs(1, []*structs.Allocation{alloc1, alloc2}) + + // evals for preempted jobs + eval1 := mock.Eval() + eval1.JobID = job1.ID + + eval2 := mock.Eval() + eval2.JobID = job2.ID + req := structs.ApplyPlanResultsRequest{ AllocUpdateRequest: structs.AllocUpdateRequest{ Job: job, Alloc: []*structs.Allocation{alloc}, }, - Deployment: d, - EvalID: eval.ID, + Deployment: d, + EvalID: eval.ID, + NodePreemptions: []*structs.Allocation{alloc1, alloc2}, + PreemptionEvals: []*structs.Evaluation{eval1, eval2}, } buf, err := structs.Encode(structs.ApplyPlanResultsRequestType, req) if err != nil { @@ -1714,6 +1740,23 @@ func TestFSM_ApplyPlanResults(t *testing.T) { alloc.Job = job assert.Equal(alloc, out) + // Verify that evals for preempted jobs have been created + e1, err := fsm.State().EvalByID(ws, eval1.ID) + require := require.New(t) + require.Nil(err) + require.NotNil(e1) + + e2, err := fsm.State().EvalByID(ws, eval2.ID) + require.Nil(err) + require.NotNil(e2) + + // Verify that eval broker has both evals + _, ok := fsm.evalBroker.evals[e1.ID] + require.True(ok) + + _, ok = fsm.evalBroker.evals[e1.ID] + require.True(ok) + dout, err := fsm.State().DeploymentByID(ws, d.ID) assert.Nil(err) tg, ok := dout.TaskGroups[alloc.TaskGroup]