Merge pull request #2118 from amshinde/load-state-early

Load state early so that hypervisor can store the correct state
This commit is contained in:
Archana Shinde 2019-10-09 15:46:15 -07:00 committed by GitHub
commit 04489fec2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -477,34 +477,13 @@ func createSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Fac
s.Logger().WithField("features", s.config.Experimental).Infof("Enable experimental features")
}
if s.supportNewStore() {
// Restored successfully from newstore before.
if s.state.State != "" {
return s, nil
}
} else {
// Fetch sandbox network to be able to access it from the sandbox structure.
var networkNS NetworkNamespace
if err := s.store.Load(store.Network, &networkNS); err == nil {
s.networkNS = networkNS
}
devices, err := s.store.LoadDevices()
if err != nil {
s.Logger().WithError(err).WithField("sandboxid", s.id).Warning("load sandbox devices failed")
}
s.devManager = deviceManager.NewDeviceManager(sandboxConfig.HypervisorConfig.BlockDeviceDriver, devices)
// We first try to fetch the sandbox state from storage.
// If it exists, this means this is a re-creation, i.e.
// Sandbox state has been loaded from storage.
// If the Stae is not empty, this is a re-creation, i.e.
// we don't need to talk to the guest's agent, but only
// want to create the sandbox and its containers in memory.
state, err := s.store.LoadState()
if err == nil && state.State != "" {
s.state = state
if s.state.State != "" {
return s, nil
}
}
// Below code path is called only during create, because of earlier check.
if err := s.agent.createSandbox(s); err != nil {
@ -588,6 +567,24 @@ func newSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factor
return nil, err
}
} else {
// Fetch sandbox network to be able to access it from the sandbox structure.
var networkNS NetworkNamespace
if err = s.store.Load(store.Network, &networkNS); err == nil {
s.networkNS = networkNS
}
devices, err := s.store.LoadDevices()
if err != nil {
s.Logger().WithError(err).WithField("sandboxid", s.id).Warning("load sandbox devices failed")
}
s.devManager = deviceManager.NewDeviceManager(sandboxConfig.HypervisorConfig.BlockDeviceDriver, devices)
// Load sandbox state. The hypervisor.createSandbox call, may need to access statei.
state, err := s.store.LoadState()
if err == nil {
s.state = state
}
if err = s.hypervisor.createSandbox(ctx, s.id, s.networkNS, &sandboxConfig.HypervisorConfig, s.store); err != nil {
return nil, err
}