mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-10 04:27:54 +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.
|
||||
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 {
|
||||
a := AllocationBitmap{
|
||||
strategy: randomScanStrategy,
|
||||
@ -66,6 +67,30 @@ func NewAllocationMap(max int, rangeSpec string) *AllocationBitmap {
|
||||
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.
|
||||
// Returns true if it was allocated, false if it was already in use
|
||||
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
|
||||
}
|
||||
|
||||
// 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 {
|
||||
return fmt.Errorf("not a snapshottable allocator")
|
||||
}
|
||||
snapshottable.Restore(pr.String(), data)
|
||||
return nil
|
||||
return snapshottable.Restore(pr.String(), data)
|
||||
}
|
||||
|
||||
// contains returns true and the offset if the port is in the range, and false
|
||||
|
Loading…
Reference in New Issue
Block a user