From 036282bafdfa29bff80b84960003f5af1f15948c Mon Sep 17 00:00:00 2001 From: Tim Gross Date: Wed, 24 Nov 2021 12:28:47 -0500 Subject: [PATCH] scheduler: fix panic in system jobs when nodes filtered by class (#11565) 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. --- .changelog/11565.txt | 3 +++ scheduler/scheduler_system.go | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 .changelog/11565.txt diff --git a/.changelog/11565.txt b/.changelog/11565.txt new file mode 100644 index 00000000000..182f5166356 --- /dev/null +++ b/.changelog/11565.txt @@ -0,0 +1,3 @@ +```release-note:bug +scheduler: Fix panic when system jobs are filtered by node class +``` diff --git a/scheduler/scheduler_system.go b/scheduler/scheduler_system.go index 5d0278eae65..325e7ae00a5 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 }