瀏覽代碼

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>
Abhinandan Prativadi 8 年之前
父節點
當前提交
7ae2b025be
共有 1 個文件被更改,包括 6 次插入2 次删除
  1. 6 2
      libnetwork/bitseq/sequence.go

+ 6 - 2
libnetwork/bitseq/sequence.go

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