mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-28 16:27:50 +00:00
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:
commit
04489fec2d
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user