mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-23 03:41:45 +00:00
Fix double counting of IP addresses
The range allocator in pkg/controller/nodeipam/ipam/range_allocator.go may call Occupy() on the same range twice: 1. Just before subscribing to the NodeInformer 2. From a callback given to the NodeInformer soon after registration
This commit is contained in:
parent
59405cc2b4
commit
4d28391c24
@ -232,16 +232,20 @@ func (s *CidrSet) Release(cidr *net.IPNet) error {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
for i := begin; i <= end; i++ {
|
||||
// Only change the counters if we change the bit to prevent
|
||||
// double counting.
|
||||
if s.used.Bit(i) != 0 {
|
||||
s.used.SetBit(&s.used, i, 0)
|
||||
s.allocatedCIDRs--
|
||||
cidrSetReleases.WithLabelValues(s.label).Inc()
|
||||
}
|
||||
}
|
||||
|
||||
cidrSetUsage.WithLabelValues(s.label).Set(float64(s.allocatedCIDRs) / float64(s.maxCIDRs))
|
||||
return nil
|
||||
}
|
||||
|
||||
// Occupy marks the given CIDR range as used. Occupy does not check if the CIDR
|
||||
// Occupy marks the given CIDR range as used. Occupy succeeds even if the CIDR
|
||||
// range was previously used.
|
||||
func (s *CidrSet) Occupy(cidr *net.IPNet) (err error) {
|
||||
begin, end, err := s.getBeginingAndEndIndices(cidr)
|
||||
@ -251,10 +255,14 @@ func (s *CidrSet) Occupy(cidr *net.IPNet) (err error) {
|
||||
s.Lock()
|
||||
defer s.Unlock()
|
||||
for i := begin; i <= end; i++ {
|
||||
// Only change the counters if we change the bit to prevent
|
||||
// double counting.
|
||||
if s.used.Bit(i) == 0 {
|
||||
s.used.SetBit(&s.used, i, 1)
|
||||
s.allocatedCIDRs++
|
||||
cidrSetAllocations.WithLabelValues(s.label).Inc()
|
||||
}
|
||||
}
|
||||
|
||||
cidrSetUsage.WithLabelValues(s.label).Set(float64(s.allocatedCIDRs) / float64(s.maxCIDRs))
|
||||
return nil
|
||||
|
Loading…
Reference in New Issue
Block a user