diff --git a/libnetwork/.gitignore b/libnetwork/.gitignore index 08e11d78e2..f9cd104fec 100644 --- a/libnetwork/.gitignore +++ b/libnetwork/.gitignore @@ -8,6 +8,8 @@ bin/ integration-tmp/ _obj _test +.vagrant + # Architecture specific extensions/prefixes *.[568vq] diff --git a/libnetwork/ipam/allocator.go b/libnetwork/ipam/allocator.go index be8b4ac029..ce404e2ad2 100644 --- a/libnetwork/ipam/allocator.go +++ b/libnetwork/ipam/allocator.go @@ -70,6 +70,9 @@ func NewAllocator(lcDs, glDs datastore.DataStore) (*Allocator, error) { } } + a.checkConsistency(localAddressSpace) + a.checkConsistency(globalAddressSpace) + return a, nil } @@ -115,6 +118,25 @@ func (a *Allocator) updateBitMasks(aSpace *addrSpace) error { return nil } +// Checks for and fixes damaged bitmask. Meant to be called in constructor only. +func (a *Allocator) checkConsistency(as string) { + // Retrieve this address space's configuration and bitmasks from the datastore + a.refresh(as) + aSpace, ok := a.addrSpaces[as] + if !ok { + return + } + a.updateBitMasks(aSpace) + for sk, pd := range aSpace.subnets { + if pd.Range != nil { + continue + } + if err := a.addresses[sk].CheckConsistency(); err != nil { + log.Warnf("Error while running consistency check for %s: %v", sk, err) + } + } +} + // GetDefaultAddressSpaces returns the local and global default address spaces func (a *Allocator) GetDefaultAddressSpaces() (string, string, error) { return localAddressSpace, globalAddressSpace, nil