in ipam/manager.go [96:160]
func (am *addressManager) restore(rehydrateIpamInfoOnReboot bool) error {
// Skip if a store is not provided.
if am.store == nil {
logger.Info("ipam store is nil")
return nil
}
// Read any persisted state.
err := am.store.Read(storeKey, am)
if err != nil {
if err == store.ErrKeyNotFound {
logger.Info("store key not found")
return nil
} else if err == store.ErrStoreEmpty {
logger.Info("store empty")
return nil
} else {
logger.Error("Failed to restore state", zap.Error(err))
return err
}
}
// Populate pointers.
for _, as := range am.AddrSpaces {
for _, ap := range as.Pools {
ap.as = as
ap.addrsByID = make(map[string]*addressRecord)
for _, ar := range ap.Addresses {
if ar.ID != "" {
ap.addrsByID[ar.ID] = ar
}
}
}
}
// if rebooted mark the ip as not in use.
if rehydrateIpamInfoOnReboot {
// Check if the VM is rebooted.
modTime, err := am.store.GetModificationTime()
if err == nil {
p := platform.NewExecClient(nil)
rebootTime, err := p.GetLastRebootTime()
logger.Info("reboot store mod", zap.Any("rebootTime", rebootTime), zap.Any("modTime", modTime))
if err == nil && rebootTime.After(modTime) {
logger.Info("Rehydrating ipam state from persistent store")
for _, as := range am.AddrSpaces {
for _, ap := range as.Pools {
ap.as = as
ap.RefCount = 0
for _, ar := range ap.Addresses {
ar.InUse = false
}
}
}
}
}
}
logger.Info("Restored state", zap.Any("am", am))
return nil
}