Fixing issue with bit allocation byteoffset calculation

The byteoffset calculation was skewed to double include
the offset value calculated. The double calculation
happens if the starting ordinal is part of the head
sequence block. This error in calculation could result
in duplicate but getting allocated eventually propogating
to ipam and vni id allocations

Signed-off-by: Abhinandan Prativadi <abhi@docker.com>
This commit is contained in:
Abhinandan Prativadi 2017-06-04 22:21:41 -07:00
parent 26fb58d3a8
commit 7ae2b025be
1 changed files with 6 additions and 2 deletions

View File

@ -497,7 +497,10 @@ func getFirstAvailable(head *sequence, start uint64) (uint64, uint64, error) {
// Derive the this sequence offsets // Derive the this sequence offsets
byteOffset := byteStart - inBlockBytePos byteOffset := byteStart - inBlockBytePos
bitOffset := inBlockBytePos*8 + bitStart bitOffset := inBlockBytePos*8 + bitStart
var firstOffset uint64
if current == head {
firstOffset = byteOffset
}
for current != nil { for current != nil {
if current.block != blockMAX { if current.block != blockMAX {
bytePos, bitPos, err := current.getAvailableBit(bitOffset) bytePos, bitPos, err := current.getAvailableBit(bitOffset)
@ -505,7 +508,8 @@ func getFirstAvailable(head *sequence, start uint64) (uint64, uint64, error) {
} }
// Moving to next block: Reset bit offset. // Moving to next block: Reset bit offset.
bitOffset = 0 bitOffset = 0
byteOffset += current.count * blockBytes byteOffset += (current.count * blockBytes) - firstOffset
firstOffset = 0
current = current.next current = current.next
} }
return invalidPos, invalidPos, ErrNoBitAvailable return invalidPos, invalidPos, ErrNoBitAvailable