Skip to content

Commit

Permalink
Merge pull request #3023 from hashicorp/b-bitmap
Browse files Browse the repository at this point in the history
Fix panic occuring from improper bitmap size
  • Loading branch information
dadgar committed Aug 15, 2017
2 parents 1d60f05 + aabf2c0 commit 47be9b5
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
9 changes: 8 additions & 1 deletion scheduler/reconcile_util.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 aligned).
func bitmapFrom(input allocSet, minSize uint) structs.Bitmap {
var max uint
for _, a := range input {
Expand All @@ -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%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
}
Expand Down
31 changes: 31 additions & 0 deletions scheduler/reconcile_util_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
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)
}

b = bitmapFrom(input, 8)
if act := b.Size(); act != exp {
t.Fatalf("got %d; want %d", act, exp)
}
}

0 comments on commit 47be9b5

Please sign in to comment.