execution: use provided process ID for state

Signed-off-by: Kenfe-Mickael Laventure <mickael.laventure@gmail.com>
This commit is contained in:
Kenfe-Mickael Laventure 2016-12-14 09:16:23 -08:00
parent 13399c1330
commit 7dd69a8597
6 changed files with 25 additions and 12 deletions

View File

@ -16,6 +16,7 @@ type CreateOpts struct {
}
type StartProcessOpts struct {
ID string
Spec specs.Process
Console bool
Stdin string

View File

@ -12,6 +12,10 @@ import (
"github.com/docker/containerd/execution"
)
const (
initProcessID = "init"
)
var (
ErrRootEmpty = errors.New("oci: runtime root cannot be an empty string")
)
@ -56,7 +60,7 @@ func (r *OCIRuntime) Create(ctx context.Context, id string, o execution.CreateOp
}
}(container)
initProcID, initStateDir, err := container.StateDir().NewProcess()
initStateDir, err := container.StateDir().NewProcess(initProcessID)
if err != nil {
return nil, err
}
@ -80,7 +84,7 @@ func (r *OCIRuntime) Create(ctx context.Context, id string, o execution.CreateOp
if err != nil {
return nil, err
}
process, err := newProcess(initProcID, pid)
process, err := newProcess(container, initProcessID, pid)
if err != nil {
return nil, err
}
@ -126,7 +130,7 @@ func (r *OCIRuntime) load(runcC *runc.Container) (*execution.Container, error) {
}
return nil, err
}
process, err := newProcess(filepath.Base(d), pid)
process, err := newProcess(container, filepath.Base(d), pid)
if err != nil {
return nil, err
}
@ -198,13 +202,13 @@ func (r *OCIRuntime) StartProcess(ctx context.Context, c *execution.Container, o
}
}()
procID, procStateDir, err := c.StateDir().NewProcess()
procStateDir, err := c.StateDir().NewProcess(o.ID)
if err != nil {
return nil, err
}
defer func() {
if err != nil {
c.StateDir().DeleteProcess(procID)
c.StateDir().DeleteProcess(o.ID)
}
}()
@ -223,7 +227,7 @@ func (r *OCIRuntime) StartProcess(ctx context.Context, c *execution.Container, o
return nil, err
}
process, err := newProcess(procID, pid)
process, err := newProcess(c, o.ID, pid)
if err != nil {
return nil, err
}

View File

@ -7,22 +7,28 @@ import (
"github.com/docker/containerd/execution"
)
func newProcess(id string, pid int) (execution.Process, error) {
func newProcess(c *execution.Container, id string, pid int) (execution.Process, error) {
proc, err := os.FindProcess(pid)
if err != nil {
return nil, err
}
return &process{
c: c,
id: id,
proc: proc,
}, nil
}
type process struct {
c *execution.Container
id string
proc *os.Process
}
func (p *process) Container() *execution.Container {
return p.c
}
func (p *process) ID() string {
return p.id
}

View File

@ -3,6 +3,7 @@ package execution
import "os"
type Process interface {
Container() *Container
ID() string
Pid() int64
//Spec() *specs.Process

View File

@ -134,6 +134,7 @@ func (s *Service) StartProcess(ctx context.Context, r *api.StartProcessRequest)
}
process, err := s.executor.StartProcess(ctx, container, StartProcessOpts{
ID: r.Process.ID,
Spec: spec,
Console: r.Console,
Stdin: r.Stdin,

View File

@ -26,13 +26,13 @@ func (s StateDir) Delete() error {
return os.RemoveAll(string(s))
}
func (s StateDir) NewProcess() (id, dir string, err error) {
dir, err = ioutil.TempDir(s.processesDir(), "")
if err != nil {
return "", "", err
func (s StateDir) NewProcess(id string) (dir string, err error) {
dir = filepath.Join(s.processesDir(), id)
if err = os.Mkdir(dir, 0700); err != nil {
return "", err
}
return filepath.Base(dir), dir, err
return dir, nil
}
func (s StateDir) ProcessDir(id string) string {