Merge pull request #2575 from fuweid/update-state-store

libcontainer: Store state.json before sync procRun
This commit is contained in:
Akihiro Suda
2020-09-23 22:12:15 +09:00
committed by GitHub
2 changed files with 24 additions and 11 deletions
+1 -11
View File
@@ -369,18 +369,8 @@ func (c *linuxContainer) start(process *Process) error {
}
return newSystemErrorWithCause(err, "starting container process")
}
// generate a timestamp indicating when the container was started
c.created = time.Now().UTC()
if process.Init {
c.state = &createdState{
c: c,
}
state, err := c.updateState(parent)
if err != nil {
return err
}
c.initProcessStartTime = state.InitProcessStartTime
if process.Init {
if c.config.Hooks != nil {
s, err := c.currentOCIState()
if err != nil {
+23
View File
@@ -11,6 +11,7 @@ import (
"os/exec"
"path/filepath"
"strconv"
"time"
"github.com/opencontainers/runc/libcontainer/cgroups"
"github.com/opencontainers/runc/libcontainer/cgroups/fs2"
@@ -411,6 +412,28 @@ func (p *initProcess) start() (retErr error) {
}
}
}
// generate a timestamp indicating when the container was started
p.container.created = time.Now().UTC()
p.container.state = &createdState{
c: p.container,
}
// NOTE: If the procRun state has been synced and the
// runc-create process has been killed for some reason,
// the runc-init[2:stage] process will be leaky. And
// the runc command also fails to parse root directory
// because the container doesn't have state.json.
//
// In order to cleanup the runc-init[2:stage] by
// runc-delete/stop, we should store the status before
// procRun sync.
state, uerr := p.container.updateState(p)
if uerr != nil {
return newSystemErrorWithCause(err, "store init state")
}
p.container.initProcessStartTime = state.InitProcessStartTime
// Sync with child.
if err := writeSync(p.messageSockPair.parent, procRun); err != nil {
return newSystemErrorWithCause(err, "writing syncT 'run'")