mirror of
https://github.com/kemko/nomad.git
synced 2026-01-04 17:35:43 +03:00
Fix panic occuring from improper bitmap size
This PR fixes an allignment calculation when determining the bitmap size. Fixes https://github.com/hashicorp/nomad/issues/3008
This commit is contained in:
@@ -264,7 +264,7 @@ func newAllocNameIndex(job, taskGroup string, count int, in allocSet) *allocName
|
||||
|
||||
// bitmapFrom creates a bitmap from the given allocation set and a minimum size
|
||||
// maybe given. The size of the bitmap is as the larger of the passed minimum
|
||||
// and t the maximum alloc index of the passed input (byte aligned).
|
||||
// and the maximum alloc index of the passed input (byte alligned).
|
||||
func bitmapFrom(input allocSet, minSize uint) structs.Bitmap {
|
||||
var max uint
|
||||
for _, a := range input {
|
||||
@@ -276,9 +276,16 @@ func bitmapFrom(input allocSet, minSize uint) structs.Bitmap {
|
||||
if l := uint(len(input)); minSize < l {
|
||||
minSize = l
|
||||
}
|
||||
|
||||
if max < minSize {
|
||||
max = minSize
|
||||
} else if max > minSize && max%8 == 0 {
|
||||
// This may be possible if the job was scaled down. We want to make sure
|
||||
// that the max index is not byte-alligned otherwise we will overflow
|
||||
// the bitmap.
|
||||
max++
|
||||
}
|
||||
|
||||
if max == 0 {
|
||||
max = 8
|
||||
}
|
||||
|
||||
26
scheduler/reconcile_util_test.go
Normal file
26
scheduler/reconcile_util_test.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package scheduler
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/hashicorp/nomad/nomad/structs"
|
||||
)
|
||||
|
||||
// Test that we properly create the bitmap even when the alloc set includes an
|
||||
// allocation with a higher count than the current min count and it is byte
|
||||
// alligned.
|
||||
// Ensure no regerssion from: https://github.com/hashicorp/nomad/issues/3008
|
||||
func TestBitmapFrom(t *testing.T) {
|
||||
input := map[string]*structs.Allocation{
|
||||
"8": {
|
||||
JobID: "foo",
|
||||
TaskGroup: "bar",
|
||||
Name: "foo.bar[8]",
|
||||
},
|
||||
}
|
||||
b := bitmapFrom(input, 1)
|
||||
exp := uint(16)
|
||||
if act := b.Size(); act != exp {
|
||||
t.Fatalf("got %d; want %d", act, exp)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user