From a6ea5be36545df8e3991e7573f43132d822c5bac Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Wed, 24 Nov 2021 10:24:00 -0500 Subject: [PATCH] scheduler: fix panic in system jobs when nodes filtered by class In the system scheduler, if a subset of clients are filtered by class, we hit a code path where the `AllocMetric` has been copied, but the `Copy` method does not instantiate the various maps. This leads to an assignment to a nil map. This changeset ensures that the maps are non-nil before continuing. The `Copy` method relies on functions in the `helper` package that all return nil slices or maps when passed zero-length inputs. This changeset to fix the panic bug intentionally defers updating those functions because it'll have potential impact on memory usage. See https://github.com/hashicorp/nomad/issues/11564 for more details. --- scheduler/scheduler_system.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/scheduler/scheduler_system.go b/scheduler/scheduler_system.go index 5d0278eae655..325e7ae00a5d 100644 --- a/scheduler/scheduler_system.go +++ b/scheduler/scheduler_system.go @@ -287,9 +287,16 @@ func mergeNodeFiltered(acc, curr *structs.AllocMetric) *structs.AllocMetric { acc.NodesEvaluated += curr.NodesEvaluated acc.NodesFiltered += curr.NodesFiltered + + if acc.ClassFiltered == nil { + acc.ClassFiltered = make(map[string]int) + } for k, v := range curr.ClassFiltered { acc.ClassFiltered[k] += v } + if acc.ConstraintFiltered == nil { + acc.ConstraintFiltered = make(map[string]int) + } for k, v := range curr.ConstraintFiltered { acc.ConstraintFiltered[k] += v }