@@ -23,6 +23,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"io"
|
||||
"net"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
@@ -126,6 +127,59 @@ func (m manager) Name() string {
|
||||
return m.name
|
||||
}
|
||||
|
||||
type shimSocket struct {
|
||||
addr string
|
||||
s *net.UnixListener
|
||||
f *os.File
|
||||
}
|
||||
|
||||
func (s *shimSocket) Close() {
|
||||
if s.s != nil {
|
||||
s.s.Close()
|
||||
}
|
||||
if s.f != nil {
|
||||
s.f.Close()
|
||||
}
|
||||
_ = shim.RemoveSocket(s.addr)
|
||||
}
|
||||
|
||||
func newShimSocket(ctx context.Context, path, id string, debug bool) (*shimSocket, error) {
|
||||
address, err := shim.SocketAddress(ctx, path, id, debug)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
socket, err := shim.NewSocket(address)
|
||||
if err != nil {
|
||||
// the only time where this would happen is if there is a bug and the socket
|
||||
// was not cleaned up in the cleanup method of the shim or we are using the
|
||||
// grouping functionality where the new process should be run with the same
|
||||
// shim as an existing container
|
||||
if !shim.SocketEaddrinuse(err) {
|
||||
return nil, fmt.Errorf("create new shim socket: %w", err)
|
||||
}
|
||||
if !debug && shim.CanConnect(address) {
|
||||
return &shimSocket{addr: address}, errdefs.ErrAlreadyExists
|
||||
}
|
||||
if err := shim.RemoveSocket(address); err != nil {
|
||||
return nil, fmt.Errorf("remove pre-existing socket: %w", err)
|
||||
}
|
||||
if socket, err = shim.NewSocket(address); err != nil {
|
||||
return nil, fmt.Errorf("try create new shim socket 2x: %w", err)
|
||||
}
|
||||
}
|
||||
s := &shimSocket{
|
||||
addr: address,
|
||||
s: socket,
|
||||
}
|
||||
f, err := socket.File()
|
||||
if err != nil {
|
||||
s.Close()
|
||||
return nil, err
|
||||
}
|
||||
s.f = f
|
||||
return s, nil
|
||||
}
|
||||
|
||||
func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ shim.BootstrapParams, retErr error) {
|
||||
var params shim.BootstrapParams
|
||||
params.Version = 3
|
||||
@@ -146,44 +200,35 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ shi
|
||||
break
|
||||
}
|
||||
}
|
||||
address, err := shim.SocketAddress(ctx, opts.Address, grouping)
|
||||
if err != nil {
|
||||
return params, err
|
||||
}
|
||||
|
||||
socket, err := shim.NewSocket(address)
|
||||
if err != nil {
|
||||
// the only time where this would happen is if there is a bug and the socket
|
||||
// was not cleaned up in the cleanup method of the shim or we are using the
|
||||
// grouping functionality where the new process should be run with the same
|
||||
// shim as an existing container
|
||||
if !shim.SocketEaddrinuse(err) {
|
||||
return params, fmt.Errorf("create new shim socket: %w", err)
|
||||
}
|
||||
if shim.CanConnect(address) {
|
||||
params.Address = address
|
||||
return params, nil
|
||||
}
|
||||
if err := shim.RemoveSocket(address); err != nil {
|
||||
return params, fmt.Errorf("remove pre-existing socket: %w", err)
|
||||
}
|
||||
if socket, err = shim.NewSocket(address); err != nil {
|
||||
return params, fmt.Errorf("try create new shim socket 2x: %w", err)
|
||||
}
|
||||
}
|
||||
var sockets []*shimSocket
|
||||
defer func() {
|
||||
if retErr != nil {
|
||||
socket.Close()
|
||||
_ = shim.RemoveSocket(address)
|
||||
for _, s := range sockets {
|
||||
s.Close()
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
f, err := socket.File()
|
||||
s, err := newShimSocket(ctx, opts.Address, grouping, false)
|
||||
if err != nil {
|
||||
if errdefs.IsAlreadyExists(err) {
|
||||
params.Address = s.addr
|
||||
return params, nil
|
||||
}
|
||||
return params, err
|
||||
}
|
||||
sockets = append(sockets, s)
|
||||
cmd.ExtraFiles = append(cmd.ExtraFiles, s.f)
|
||||
|
||||
cmd.ExtraFiles = append(cmd.ExtraFiles, f)
|
||||
if opts.Debug {
|
||||
s, err = newShimSocket(ctx, opts.Address, grouping, true)
|
||||
if err != nil {
|
||||
return params, err
|
||||
}
|
||||
sockets = append(sockets, s)
|
||||
cmd.ExtraFiles = append(cmd.ExtraFiles, s.f)
|
||||
}
|
||||
|
||||
goruntime.LockOSThread()
|
||||
if os.Getenv("SCHED_CORE") != "" {
|
||||
@@ -193,7 +238,6 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ shi
|
||||
}
|
||||
|
||||
if err := cmd.Start(); err != nil {
|
||||
f.Close()
|
||||
return params, err
|
||||
}
|
||||
|
||||
@@ -233,7 +277,7 @@ func (manager) Start(ctx context.Context, id string, opts shim.StartOpts) (_ shi
|
||||
return params, fmt.Errorf("failed to adjust OOM score for shim: %w", err)
|
||||
}
|
||||
|
||||
params.Address = address
|
||||
params.Address = sockets[0].addr
|
||||
return params, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user