mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-10 12:32:03 +00:00
Merge pull request #8888 from smarterclayton/add_new_allocators
Add a new contiguous allocator strategy option
This commit is contained in:
commit
5115f0e6bc
@ -55,6 +55,7 @@ var _ Snapshottable = &AllocationBitmap{}
|
|||||||
// allocateStrategy is a search strategy in the allocation map for a valid item.
|
// allocateStrategy is a search strategy in the allocation map for a valid item.
|
||||||
type allocateStrategy func(allocated *big.Int, max, count int) (int, bool)
|
type allocateStrategy func(allocated *big.Int, max, count int) (int, bool)
|
||||||
|
|
||||||
|
// NewAllocationMap creates an allocation bitmap using the random scan strategy.
|
||||||
func NewAllocationMap(max int, rangeSpec string) *AllocationBitmap {
|
func NewAllocationMap(max int, rangeSpec string) *AllocationBitmap {
|
||||||
a := AllocationBitmap{
|
a := AllocationBitmap{
|
||||||
strategy: randomScanStrategy,
|
strategy: randomScanStrategy,
|
||||||
@ -66,6 +67,30 @@ func NewAllocationMap(max int, rangeSpec string) *AllocationBitmap {
|
|||||||
return &a
|
return &a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewContiguousAllocationMap creates an allocation bitmap using the contiguous scan strategy.
|
||||||
|
func NewContiguousAllocationMap(max int, rangeSpec string) *AllocationBitmap {
|
||||||
|
a := AllocationBitmap{
|
||||||
|
strategy: contiguousScanStrategy,
|
||||||
|
allocated: big.NewInt(0),
|
||||||
|
count: 0,
|
||||||
|
max: max,
|
||||||
|
rangeSpec: rangeSpec,
|
||||||
|
}
|
||||||
|
return &a
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewRandomAllocationInterface creates an allocation bitmap satisfying Interface using the
|
||||||
|
// random scan strategy.
|
||||||
|
func NewRandomAllocationInterface(max int, rangeSpec string) Interface {
|
||||||
|
return NewAllocationMap(max, rangeSpec)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewContiguousAllocationInterface creates an allocation bitmap satisfying Interface using the
|
||||||
|
// contiguous scan strategy.
|
||||||
|
func NewContiguousAllocationInterface(max int, rangeSpec string) Interface {
|
||||||
|
return NewContiguousAllocationMap(max, rangeSpec)
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate attempts to reserve the provided item.
|
// Allocate attempts to reserve the provided item.
|
||||||
// Returns true if it was allocated, false if it was already in use
|
// Returns true if it was allocated, false if it was already in use
|
||||||
func (r *AllocationBitmap) Allocate(offset int) (bool, error) {
|
func (r *AllocationBitmap) Allocate(offset int) (bool, error) {
|
||||||
@ -166,3 +191,16 @@ func randomScanStrategy(allocated *big.Int, max, count int) (int, bool) {
|
|||||||
}
|
}
|
||||||
return 0, false
|
return 0, false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// contiguousScanStrategy tries to allocate starting at 0 and filling in any gaps
|
||||||
|
func contiguousScanStrategy(allocated *big.Int, max, count int) (int, bool) {
|
||||||
|
if count >= max {
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
for i := 0; i < max; i++ {
|
||||||
|
if allocated.Bit(i) == 0 {
|
||||||
|
return i, true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0, false
|
||||||
|
}
|
||||||
|
@ -151,8 +151,7 @@ func (r *PortAllocator) Restore(pr util.PortRange, data []byte) error {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("not a snapshottable allocator")
|
return fmt.Errorf("not a snapshottable allocator")
|
||||||
}
|
}
|
||||||
snapshottable.Restore(pr.String(), data)
|
return snapshottable.Restore(pr.String(), data)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// contains returns true and the offset if the port is in the range, and false
|
// contains returns true and the offset if the port is in the range, and false
|
||||||
|
Loading…
Reference in New Issue
Block a user