diff --git a/go.mod b/go.mod index 0ef747c3..1f1657e4 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/longhorn/backing-image-manager go 1.21 require ( - github.com/RoaringBitmap/roaring v1.9.1 + github.com/RoaringBitmap/roaring v1.9.3 github.com/golang/protobuf v1.5.4 github.com/gorilla/mux v1.8.1 github.com/longhorn/backupstore v0.0.0-20240219094812-3a87ee02df77 diff --git a/go.sum b/go.sum index 1c3f9db7..29305d2b 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,8 @@ github.com/RoaringBitmap/roaring v1.9.0 h1:lwKhr90/j0jVXJyh5X+vQN1VVn77rQFfYnh6R github.com/RoaringBitmap/roaring v1.9.0/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= github.com/RoaringBitmap/roaring v1.9.1 h1:LXcSqGGGMKm+KAzUyWn7ZeREqoOkoMX+KwLOK1thc4I= github.com/RoaringBitmap/roaring v1.9.1/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= +github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM= +github.com/RoaringBitmap/roaring v1.9.3/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90= github.com/aws/aws-sdk-go v1.34.2 h1:9vCknCdTAmmV4ht7lPuda7aJXzllXwEQyCMZKJHjBrM= github.com/aws/aws-sdk-go v1.34.2/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= diff --git a/vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go b/vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go index 35e68438..bf08bfca 100644 --- a/vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go +++ b/vendor/github.com/RoaringBitmap/roaring/bitmapcontainer.go @@ -888,13 +888,67 @@ func (bc *bitmapContainer) iandNot(a container) container { } func (bc *bitmapContainer) iandNotArray(ac *arrayContainer) container { - acb := ac.toBitmapContainer() - return bc.iandNotBitmapSurely(acb) + if ac.isEmpty() || bc.isEmpty() { + // Nothing to do. + return bc + } + + // Word by word, we remove the elements in ac from bc. The approach is to build + // a mask of the elements to remove, and then apply it to the bitmap. + wordIdx := uint16(0) + mask := uint64(0) + for i, v := range ac.content { + if v/64 != wordIdx { + // Flush the current word. + if i != 0 { + // We're removing bits that are set in the mask and in the current word. + // To figure out the cardinality change, we count the number of bits that + // are set in the mask and in the current word. + mask &= bc.bitmap[wordIdx] + bc.bitmap[wordIdx] &= ^mask + bc.cardinality -= int(popcount(mask)) + } + + wordIdx = v / 64 + mask = 0 + } + mask |= 1 << (v % 64) + } + + // Flush the last word. + mask &= bc.bitmap[wordIdx] + bc.bitmap[wordIdx] &= ^mask + bc.cardinality -= int(popcount(mask)) + + if bc.getCardinality() <= arrayDefaultMaxSize { + return bc.toArrayContainer() + } + return bc } func (bc *bitmapContainer) iandNotRun16(rc *runContainer16) container { - rcb := rc.toBitmapContainer() - return bc.iandNotBitmapSurely(rcb) + if rc.isEmpty() || bc.isEmpty() { + // Nothing to do. + return bc + } + + wordRangeStart := rc.iv[0].start / 64 + wordRangeEnd := (rc.iv[len(rc.iv)-1].last()) / 64 // inclusive + + cardinalityChange := popcntSlice(bc.bitmap[wordRangeStart : wordRangeEnd+1]) // before cardinality - after cardinality (for word range) + + for _, iv := range rc.iv { + resetBitmapRange(bc.bitmap, int(iv.start), int(iv.last())+1) + } + + cardinalityChange -= popcntSlice(bc.bitmap[wordRangeStart : wordRangeEnd+1]) + + bc.cardinality -= int(cardinalityChange) + + if bc.getCardinality() <= arrayDefaultMaxSize { + return bc.toArrayContainer() + } + return bc } func (bc *bitmapContainer) andNotArray(value2 *arrayContainer) container { diff --git a/vendor/modules.txt b/vendor/modules.txt index 35fa8dfc..3b7362b7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -20,7 +20,7 @@ github.com/Azure/azure-sdk-for-go/sdk/internal/uuid ## explicit; go 1.16 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/internal -# github.com/RoaringBitmap/roaring v1.9.1 +# github.com/RoaringBitmap/roaring v1.9.3 ## explicit; go 1.14 github.com/RoaringBitmap/roaring github.com/RoaringBitmap/roaring/internal