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:
Alex Dadgar
2017-08-12 15:37:02 -07:00
parent 2a0f267771
commit 7e6b14cf5d
2 changed files with 34 additions and 1 deletions

View File

@@ -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
}

View 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)
}
}