summaryrefslogtreecommitdiffhomepage
path: root/pkg/v1/proc
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/v1/proc')
-rw-r--r--pkg/v1/proc/exec.go37
-rw-r--r--pkg/v1/proc/exec_state.go57
-rw-r--r--pkg/v1/proc/init.go67
-rw-r--r--pkg/v1/proc/init_state.go50
4 files changed, 113 insertions, 98 deletions
diff --git a/pkg/v1/proc/exec.go b/pkg/v1/proc/exec.go
index f4f9f46e2..f02b73bb2 100644
--- a/pkg/v1/proc/exec.go
+++ b/pkg/v1/proc/exec.go
@@ -42,7 +42,7 @@ import (
type execProcess struct {
wg sync.WaitGroup
- proc.State
+ execState execState
mu sync.Mutex
id string
@@ -88,6 +88,13 @@ func (e *execProcess) ExitedAt() time.Time {
return e.exited
}
+func (e *execProcess) SetExited(status int) {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ e.execState.SetExited(status)
+}
+
func (e *execProcess) setExited(status int) {
e.status = status
e.exited = time.Now()
@@ -95,6 +102,13 @@ func (e *execProcess) setExited(status int) {
close(e.waitBlock)
}
+func (e *execProcess) Delete(ctx context.Context) error {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ return e.execState.Delete(ctx)
+}
+
func (e *execProcess) delete(ctx context.Context) error {
e.wg.Wait()
if e.io != nil {
@@ -112,6 +126,13 @@ func (e *execProcess) delete(ctx context.Context) error {
return nil
}
+func (e *execProcess) Resize(ws console.WinSize) error {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ return e.execState.Resize(ws)
+}
+
func (e *execProcess) resize(ws console.WinSize) error {
if e.console == nil {
return nil
@@ -119,6 +140,13 @@ func (e *execProcess) resize(ws console.WinSize) error {
return e.console.Resize(ws)
}
+func (e *execProcess) Kill(ctx context.Context, sig uint32, _ bool) error {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ return e.execState.Kill(ctx, sig, false)
+}
+
func (e *execProcess) kill(ctx context.Context, sig uint32, _ bool) error {
internalPid := e.internalPid
if internalPid != 0 {
@@ -141,6 +169,13 @@ func (e *execProcess) Stdio() proc.Stdio {
return e.stdio
}
+func (e *execProcess) Start(ctx context.Context) error {
+ e.mu.Lock()
+ defer e.mu.Unlock()
+
+ return e.execState.Start(ctx)
+}
+
func (e *execProcess) start(ctx context.Context) (err error) {
var (
socket *runc.Socket
diff --git a/pkg/v1/proc/exec_state.go b/pkg/v1/proc/exec_state.go
index 4ffa34178..e10954670 100644
--- a/pkg/v1/proc/exec_state.go
+++ b/pkg/v1/proc/exec_state.go
@@ -24,6 +24,14 @@ import (
"github.com/pkg/errors"
)
+type execState interface {
+ Resize(console.WinSize) error
+ Start(context.Context) error
+ Delete(context.Context) error
+ Kill(context.Context, uint32, bool) error
+ SetExited(int)
+}
+
type execCreatedState struct {
p *execProcess
}
@@ -31,11 +39,11 @@ type execCreatedState struct {
func (s *execCreatedState) transition(name string) error {
switch name {
case "running":
- s.p.State = &execRunningState{p: s.p}
+ s.p.execState = &execRunningState{p: s.p}
case "stopped":
- s.p.State = &execStoppedState{p: s.p}
+ s.p.execState = &execStoppedState{p: s.p}
case "deleted":
- s.p.State = &deletedState{}
+ s.p.execState = &deletedState{}
default:
return errors.Errorf("invalid state transition %q to %q", stateName(s), name)
}
@@ -43,15 +51,10 @@ func (s *execCreatedState) transition(name string) error {
}
func (s *execCreatedState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.resize(ws)
}
func (s *execCreatedState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
if err := s.p.start(ctx); err != nil {
return err
}
@@ -62,22 +65,14 @@ func (s *execCreatedState) Delete(ctx context.Context) error {
if err := s.p.delete(ctx); err != nil {
return err
}
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
return s.transition("deleted")
}
func (s *execCreatedState) Kill(ctx context.Context, sig uint32, all bool) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.kill(ctx, sig, all)
}
func (s *execCreatedState) SetExited(status int) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
s.p.setExited(status)
if err := s.transition("stopped"); err != nil {
@@ -92,7 +87,7 @@ type execRunningState struct {
func (s *execRunningState) transition(name string) error {
switch name {
case "stopped":
- s.p.State = &execStoppedState{p: s.p}
+ s.p.execState = &execStoppedState{p: s.p}
default:
return errors.Errorf("invalid state transition %q to %q", stateName(s), name)
}
@@ -100,37 +95,22 @@ func (s *execRunningState) transition(name string) error {
}
func (s *execRunningState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.resize(ws)
}
func (s *execRunningState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot start a running process")
}
func (s *execRunningState) Delete(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot delete a running process")
}
func (s *execRunningState) Kill(ctx context.Context, sig uint32, all bool) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.kill(ctx, sig, all)
}
func (s *execRunningState) SetExited(status int) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
s.p.setExited(status)
if err := s.transition("stopped"); err != nil {
@@ -145,7 +125,7 @@ type execStoppedState struct {
func (s *execStoppedState) transition(name string) error {
switch name {
case "deleted":
- s.p.State = &deletedState{}
+ s.p.execState = &deletedState{}
default:
return errors.Errorf("invalid state transition %q to %q", stateName(s), name)
}
@@ -153,16 +133,10 @@ func (s *execStoppedState) transition(name string) error {
}
func (s *execStoppedState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot resize a stopped container")
}
func (s *execStoppedState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot start a stopped process")
}
@@ -170,15 +144,10 @@ func (s *execStoppedState) Delete(ctx context.Context) error {
if err := s.p.delete(ctx); err != nil {
return err
}
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
return s.transition("deleted")
}
func (s *execStoppedState) Kill(ctx context.Context, sig uint32, all bool) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.kill(ctx, sig, all)
}
diff --git a/pkg/v1/proc/init.go b/pkg/v1/proc/init.go
index 390cbba2b..1c0c88c4f 100644
--- a/pkg/v1/proc/init.go
+++ b/pkg/v1/proc/init.go
@@ -45,8 +45,8 @@ const InitPidFile = "init.pid"
// Init represents an initial process for a container
type Init struct {
- wg sync.WaitGroup
- initState
+ wg sync.WaitGroup
+ initState initState
// mu is used to ensure that `Start()` and `Exited()` calls return in
// the right order when invoked in separate go routines.
@@ -217,6 +217,14 @@ func (p *Init) Status(ctx context.Context) (string, error) {
return p.convertStatus(c.Status), nil
}
+// Start the init process
+func (p *Init) Start(ctx context.Context) error {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ return p.initState.Start(ctx)
+}
+
func (p *Init) start(context context.Context) error {
var cio runc.IO
if !p.Sandbox {
@@ -244,6 +252,14 @@ func (p *Init) start(context context.Context) error {
return nil
}
+// SetExited of the init process with the next status
+func (p *Init) SetExited(status int) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ p.initState.SetExited(status)
+}
+
func (p *Init) setExited(status int) {
p.exited = time.Now()
p.status = status
@@ -251,10 +267,18 @@ func (p *Init) setExited(status int) {
close(p.waitBlock)
}
-func (p *Init) delete(context context.Context) error {
- p.killAll(context)
+// Delete the init process
+func (p *Init) Delete(ctx context.Context) error {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ return p.initState.Delete(ctx)
+}
+
+func (p *Init) delete(ctx context.Context) error {
+ p.killAll(ctx)
p.wg.Wait()
- err := p.runtime.Delete(context, p.id, nil)
+ err := p.runtime.Delete(ctx, p.id, nil)
// ignore errors if a runtime has already deleted the process
// but we still hold metadata and pipes
//
@@ -274,7 +298,7 @@ func (p *Init) delete(context context.Context) error {
p.io.Close()
}
if err2 := mount.UnmountAll(p.Rootfs, 0); err2 != nil {
- log.G(context).WithError(err2).Warn("failed to cleanup rootfs mount")
+ log.G(ctx).WithError(err2).Warn("failed to cleanup rootfs mount")
if err == nil {
err = errors.Wrap(err2, "failed rootfs umount")
}
@@ -282,6 +306,17 @@ func (p *Init) delete(context context.Context) error {
return err
}
+// Resize the init processes console
+func (p *Init) Resize(ws console.WinSize) error {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ if p.console == nil {
+ return nil
+ }
+ return p.console.Resize(ws)
+}
+
func (p *Init) resize(ws console.WinSize) error {
if p.console == nil {
return nil
@@ -289,6 +324,14 @@ func (p *Init) resize(ws console.WinSize) error {
return p.console.Resize(ws)
}
+// Kill the init process
+func (p *Init) Kill(ctx context.Context, signal uint32, all bool) error {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ return p.initState.Kill(ctx, signal, all)
+}
+
func (p *Init) kill(context context.Context, signal uint32, all bool) error {
var (
killErr error
@@ -349,8 +392,16 @@ func (p *Init) Runtime() *runsc.Runsc {
return p.runtime
}
+// Exec returns a new child process
+func (p *Init) Exec(ctx context.Context, path string, r *ExecConfig) (proc.Process, error) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+
+ return p.initState.Exec(ctx, path, r)
+}
+
// exec returns a new exec'd process
-func (p *Init) exec(context context.Context, path string, r *ExecConfig) (proc.Process, error) {
+func (p *Init) exec(ctx context.Context, path string, r *ExecConfig) (proc.Process, error) {
// process exec request
var spec specs.Process
if err := json.Unmarshal(r.Spec.Value, &spec); err != nil {
@@ -371,7 +422,7 @@ func (p *Init) exec(context context.Context, path string, r *ExecConfig) (proc.P
},
waitBlock: make(chan struct{}),
}
- e.State = &execCreatedState{p: e}
+ e.execState = &execCreatedState{p: e}
return e, nil
}
diff --git a/pkg/v1/proc/init_state.go b/pkg/v1/proc/init_state.go
index e04eadbc3..f56f6fe28 100644
--- a/pkg/v1/proc/init_state.go
+++ b/pkg/v1/proc/init_state.go
@@ -27,9 +27,12 @@ import (
)
type initState interface {
- proc.State
-
+ Resize(console.WinSize) error
+ Start(context.Context) error
+ Delete(context.Context) error
Exec(context.Context, string, *ExecConfig) (proc.Process, error)
+ Kill(context.Context, uint32, bool) error
+ SetExited(int)
}
type createdState struct {
@@ -51,15 +54,10 @@ func (s *createdState) transition(name string) error {
}
func (s *createdState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.resize(ws)
}
func (s *createdState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
if err := s.p.start(ctx); err != nil {
// Containerd doesn't allow deleting container in created state.
// However, for gvisor, a non-root container in created state can
@@ -80,8 +78,6 @@ func (s *createdState) Start(ctx context.Context) error {
}
func (s *createdState) Delete(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
if err := s.p.delete(ctx); err != nil {
return err
}
@@ -89,16 +85,10 @@ func (s *createdState) Delete(ctx context.Context) error {
}
func (s *createdState) Kill(ctx context.Context, sig uint32, all bool) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.kill(ctx, sig, all)
}
func (s *createdState) SetExited(status int) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
s.p.setExited(status)
if err := s.transition("stopped"); err != nil {
@@ -107,8 +97,6 @@ func (s *createdState) SetExited(status int) {
}
func (s *createdState) Exec(ctx context.Context, path string, r *ExecConfig) (proc.Process, error) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
return s.p.exec(ctx, path, r)
}
@@ -127,37 +115,22 @@ func (s *runningState) transition(name string) error {
}
func (s *runningState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.resize(ws)
}
func (s *runningState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot start a running process")
}
func (s *runningState) Delete(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot delete a running process")
}
func (s *runningState) Kill(ctx context.Context, sig uint32, all bool) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return s.p.kill(ctx, sig, all)
}
func (s *runningState) SetExited(status int) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
s.p.setExited(status)
if err := s.transition("stopped"); err != nil {
@@ -166,8 +139,6 @@ func (s *runningState) SetExited(status int) {
}
func (s *runningState) Exec(ctx context.Context, path string, r *ExecConfig) (proc.Process, error) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
return s.p.exec(ctx, path, r)
}
@@ -186,22 +157,14 @@ func (s *stoppedState) transition(name string) error {
}
func (s *stoppedState) Resize(ws console.WinSize) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot resize a stopped container")
}
func (s *stoppedState) Start(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return errors.Errorf("cannot start a stopped process")
}
func (s *stoppedState) Delete(ctx context.Context) error {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
if err := s.p.delete(ctx); err != nil {
return err
}
@@ -217,8 +180,5 @@ func (s *stoppedState) SetExited(status int) {
}
func (s *stoppedState) Exec(ctx context.Context, path string, r *ExecConfig) (proc.Process, error) {
- s.p.mu.Lock()
- defer s.p.mu.Unlock()
-
return nil, errors.Errorf("cannot exec in a stopped state")
}