scheduler: fix panic in `render_templates` destructive update check (#18100)
In #18054 we introduced a new field `render_templates` in the `restart` block. Previously changes to the `restart` block were always non-destructive in the scheduler but we now need to check the new field so that we can update the template runner. The check assumed that the block was always non-nil, which causes panics in our scheduler tests.
This commit is contained in:
parent
7fb7f77b45
commit
824a38c1f4
|
@ -260,8 +260,9 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) comparison {
|
||||||
|
|
||||||
// Check if restart.render_templates is updated
|
// Check if restart.render_templates is updated
|
||||||
// this requires a destructive update for template hook to receive the new config
|
// this requires a destructive update for template hook to receive the new config
|
||||||
if a.RestartPolicy.RenderTemplates != b.RestartPolicy.RenderTemplates {
|
if c := renderTemplatesUpdated(a.RestartPolicy, b.RestartPolicy,
|
||||||
return difference("group restart render_templates", a.RestartPolicy.RenderTemplates, b.RestartPolicy.RenderTemplates)
|
"group restart render_templates"); c.modified {
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check each task
|
// Check each task
|
||||||
|
@ -327,9 +328,11 @@ func tasksUpdated(jobA, jobB *structs.Job, taskGroup string) comparison {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if restart.render_templates is updated
|
// Check if restart.render_templates is updated
|
||||||
if at.RestartPolicy.RenderTemplates != bt.RestartPolicy.RenderTemplates {
|
if c := renderTemplatesUpdated(at.RestartPolicy, bt.RestartPolicy,
|
||||||
return difference("task restart render_templates", at.RestartPolicy.RenderTemplates, bt.RestartPolicy.RenderTemplates)
|
"task restart render_templates"); c.modified {
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// none of the fields that trigger a destructive update were modified,
|
// none of the fields that trigger a destructive update were modified,
|
||||||
|
@ -574,6 +577,23 @@ func spreadsUpdated(jobA, jobB *structs.Job, taskGroup string) comparison {
|
||||||
return same
|
return same
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// renderTemplatesUpdated returns the difference in the RestartPolicy's
|
||||||
|
// render_templates field, if set
|
||||||
|
func renderTemplatesUpdated(a, b *structs.RestartPolicy, msg string) comparison {
|
||||||
|
|
||||||
|
noRenderA := a == nil || !a.RenderTemplates
|
||||||
|
noRenderB := b == nil || !b.RenderTemplates
|
||||||
|
|
||||||
|
if noRenderA && !noRenderB {
|
||||||
|
return difference(msg, false, true)
|
||||||
|
}
|
||||||
|
if !noRenderA && noRenderB {
|
||||||
|
return difference(msg, true, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
return same // both nil, or one nil and the other false
|
||||||
|
}
|
||||||
|
|
||||||
// setStatus is used to update the status of the evaluation
|
// setStatus is used to update the status of the evaluation
|
||||||
func setStatus(logger log.Logger, planner Planner,
|
func setStatus(logger log.Logger, planner Planner,
|
||||||
eval, nextEval, spawnedBlocked *structs.Evaluation,
|
eval, nextEval, spawnedBlocked *structs.Evaluation,
|
||||||
|
|
Loading…
Reference in New Issue