Files
containerd/api/grpc/server/server_linux.go
T
Antonio Murdaca b812857db2 supervisor: cancel SendTask when channel is full
This patch handles case c) in https://github.com/moby/moby/issues/31487

(c) A request cannot be added to 's.tasks' because the queue is full.

case b) isn't fixable at this point case there's no way to cancel stuff
from a channel since channels aren't context aware (yet?).
Parallelizing tasks handling isn't easily doable either.

Signed-off-by: Antonio Murdaca <runcom@redhat.com>
2017-06-05 19:27:02 +02:00

67 lines
1.8 KiB
Go

package server
import (
"fmt"
"github.com/containerd/containerd/api/grpc/types"
"github.com/containerd/containerd/specs"
"github.com/containerd/containerd/supervisor"
"github.com/opencontainers/runc/libcontainer/system"
ocs "github.com/opencontainers/runtime-spec/specs-go"
"golang.org/x/net/context"
)
var clockTicksPerSecond = uint64(system.GetClockTicks())
func (s *apiServer) AddProcess(ctx context.Context, r *types.AddProcessRequest) (*types.AddProcessResponse, error) {
process := &specs.ProcessSpec{
Terminal: r.Terminal,
Args: r.Args,
Env: r.Env,
Cwd: r.Cwd,
}
process.User = ocs.User{
UID: r.User.Uid,
GID: r.User.Gid,
AdditionalGids: r.User.AdditionalGids,
}
// for backwards compat in the API set eibp
process.Capabilities = &ocs.LinuxCapabilities{
Bounding: r.Capabilities,
Effective: r.Capabilities,
Inheritable: r.Capabilities,
Permitted: r.Capabilities,
}
process.ApparmorProfile = r.ApparmorProfile
process.SelinuxLabel = r.SelinuxLabel
process.NoNewPrivileges = r.NoNewPrivileges
for _, rl := range r.Rlimits {
process.Rlimits = append(process.Rlimits, ocs.LinuxRlimit{
Type: rl.Type,
Soft: rl.Soft,
Hard: rl.Hard,
})
}
if r.Id == "" {
return nil, fmt.Errorf("container id cannot be empty")
}
if r.Pid == "" {
return nil, fmt.Errorf("process id cannot be empty")
}
e := &supervisor.AddProcessTask{}
e.WithContext(ctx)
e.ID = r.Id
e.PID = r.Pid
e.ProcessSpec = process
e.Stdin = r.Stdin
e.Stdout = r.Stdout
e.Stderr = r.Stderr
e.StartResponse = make(chan supervisor.StartResponse, 1)
s.sv.SendTask(e)
if err := <-e.ErrorCh(); err != nil {
return nil, err
}
sr := <-e.StartResponse
return &types.AddProcessResponse{SystemPid: uint32(sr.ExecPid)}, nil
}