state: Load the state from storage early on

The hypervisor.createSandbox may need to access the state.
For eg, ACRN today needs to access the block index to assign
it to the root image of the VM. Hence load this early on.

Fixes #2026

Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
This commit is contained in:
Archana Shinde 2019-10-08 11:02:15 -07:00
parent f62bceba99
commit fa4acad4aa

View File

@ -495,13 +495,11 @@ func createSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Fac
} }
s.devManager = deviceManager.NewDeviceManager(sandboxConfig.HypervisorConfig.BlockDeviceDriver, devices) s.devManager = deviceManager.NewDeviceManager(sandboxConfig.HypervisorConfig.BlockDeviceDriver, devices)
// We first try to fetch the sandbox state from storage. // Sandbox state has been loaded from storage.
// If it exists, this means this is a re-creation, i.e. // 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 // we don't need to talk to the guest's agent, but only
// want to create the sandbox and its containers in memory. // want to create the sandbox and its containers in memory.
state, err := s.store.LoadState() if s.state.State != "" {
if err == nil && state.State != "" {
s.state = state
return s, nil return s, nil
} }
} }
@ -588,6 +586,12 @@ func newSandbox(ctx context.Context, sandboxConfig SandboxConfig, factory Factor
return nil, err return nil, err
} }
} else { } else {
// 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 { if err = s.hypervisor.createSandbox(ctx, s.id, s.networkNS, &sandboxConfig.HypervisorConfig, s.store); err != nil {
return nil, err return nil, err
} }