Skip to content

Commit

Permalink
Fix panic occuring from improper bitmap size
Browse files Browse the repository at this point in the history
This PR fixes an allignment calculation when determining the bitmap
size.

Fixes #3008
  • Loading branch information
dadgar committed Aug 12, 2017
1 parent 2a0f267 commit 7e6b14c
Show file tree
Hide file tree
Showing 2 changed files with 34 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 alligned).
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 > 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
}
Expand Down
26 changes: 26 additions & 0 deletions scheduler/reconcile_util_test.go
Original file line number Diff line number Diff line change
@@ -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)
}
}

0 comments on commit 7e6b14c

Please sign in to comment.