Bump go-runc for buffer race fix

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2019-12-06 11:40:50 -05:00
parent 640ca7812f
commit cd23ad2447
3 changed files with 29 additions and 15 deletions

View File

@ -5,7 +5,7 @@ github.com/containerd/cgroups abd0b19954a6b05e0963f4842706
github.com/containerd/console 0650fd9eeb50bab4fc99dceb9f2e14cf58f36e7f github.com/containerd/console 0650fd9eeb50bab4fc99dceb9f2e14cf58f36e7f
github.com/containerd/continuity f2a389ac0a02ce21c09edd7344677a601970f41c github.com/containerd/continuity f2a389ac0a02ce21c09edd7344677a601970f41c
github.com/containerd/fifo bda0ff6ed73c67bfb5e62bc9c697f146b7fd7f13 github.com/containerd/fifo bda0ff6ed73c67bfb5e62bc9c697f146b7fd7f13
github.com/containerd/go-runc a2952bc25f5116103a8b78f3817f6df759aa7def github.com/containerd/go-runc a5c2862aed5e6358b305b0e16bfce58e0549b1cd
github.com/containerd/ttrpc 92c8520ef9f86600c650dd540266a007bf03670f github.com/containerd/ttrpc 92c8520ef9f86600c650dd540266a007bf03670f
github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40 github.com/containerd/typeurl a93fcdb778cd272c6e9b3028b2f42d813e785d40
github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6 github.com/coreos/go-systemd 48702e0da86bd25e76cfef347e2adeb434a0d0a6

View File

@ -17,6 +17,7 @@
package runc package runc
import ( import (
"bytes"
"context" "context"
"encoding/json" "encoding/json"
"errors" "errors"
@ -72,11 +73,12 @@ type Runc struct {
// List returns all containers created inside the provided runc root directory // List returns all containers created inside the provided runc root directory
func (r *Runc) List(context context.Context) ([]*Container, error) { func (r *Runc) List(context context.Context) ([]*Container, error) {
data, err := cmdOutput(r.command(context, "list", "--format=json"), false) data, err := cmdOutput(r.command(context, "list", "--format=json"), false)
defer putBuf(data)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var out []*Container var out []*Container
if err := json.Unmarshal(data, &out); err != nil { if err := json.Unmarshal(data.Bytes(), &out); err != nil {
return nil, err return nil, err
} }
return out, nil return out, nil
@ -85,11 +87,12 @@ func (r *Runc) List(context context.Context) ([]*Container, error) {
// State returns the state for the container provided by id // State returns the state for the container provided by id
func (r *Runc) State(context context.Context, id string) (*Container, error) { func (r *Runc) State(context context.Context, id string) (*Container, error) {
data, err := cmdOutput(r.command(context, "state", id), true) data, err := cmdOutput(r.command(context, "state", id), true)
defer putBuf(data)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %s", err, data) return nil, fmt.Errorf("%s: %s", err, data.String())
} }
var c Container var c Container
if err := json.Unmarshal(data, &c); err != nil { if err := json.Unmarshal(data.Bytes(), &c); err != nil {
return nil, err return nil, err
} }
return &c, nil return &c, nil
@ -154,8 +157,9 @@ func (r *Runc) Create(context context.Context, id, bundle string, opts *CreateOp
if cmd.Stdout == nil && cmd.Stderr == nil { if cmd.Stdout == nil && cmd.Stderr == nil {
data, err := cmdOutput(cmd, true) data, err := cmdOutput(cmd, true)
defer putBuf(data)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", err, data) return fmt.Errorf("%s: %s", err, data.String())
} }
return nil return nil
} }
@ -233,8 +237,9 @@ func (r *Runc) Exec(context context.Context, id string, spec specs.Process, opts
} }
if cmd.Stdout == nil && cmd.Stderr == nil { if cmd.Stdout == nil && cmd.Stderr == nil {
data, err := cmdOutput(cmd, true) data, err := cmdOutput(cmd, true)
defer putBuf(data)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", err, data) return fmt.Errorf("%s: %s", err, data.String())
} }
return nil return nil
} }
@ -399,11 +404,12 @@ func (r *Runc) Resume(context context.Context, id string) error {
// Ps lists all the processes inside the container returning their pids // Ps lists all the processes inside the container returning their pids
func (r *Runc) Ps(context context.Context, id string) ([]int, error) { func (r *Runc) Ps(context context.Context, id string) ([]int, error) {
data, err := cmdOutput(r.command(context, "ps", "--format", "json", id), true) data, err := cmdOutput(r.command(context, "ps", "--format", "json", id), true)
defer putBuf(data)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %s", err, data) return nil, fmt.Errorf("%s: %s", err, data.String())
} }
var pids []int var pids []int
if err := json.Unmarshal(data, &pids); err != nil { if err := json.Unmarshal(data.Bytes(), &pids); err != nil {
return nil, err return nil, err
} }
return pids, nil return pids, nil
@ -412,11 +418,12 @@ func (r *Runc) Ps(context context.Context, id string) ([]int, error) {
// Top lists all the processes inside the container returning the full ps data // Top lists all the processes inside the container returning the full ps data
func (r *Runc) Top(context context.Context, id string, psOptions string) (*TopResults, error) { func (r *Runc) Top(context context.Context, id string, psOptions string) (*TopResults, error) {
data, err := cmdOutput(r.command(context, "ps", "--format", "table", id, psOptions), true) data, err := cmdOutput(r.command(context, "ps", "--format", "table", id, psOptions), true)
defer putBuf(data)
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: %s", err, data) return nil, fmt.Errorf("%s: %s", err, data.String())
} }
topResults, err := ParsePSOutput(data) topResults, err := ParsePSOutput(data.Bytes())
if err != nil { if err != nil {
return nil, fmt.Errorf("%s: ", err) return nil, fmt.Errorf("%s: ", err)
} }
@ -606,10 +613,11 @@ type Version struct {
// Version returns the runc and runtime-spec versions // Version returns the runc and runtime-spec versions
func (r *Runc) Version(context context.Context) (Version, error) { func (r *Runc) Version(context context.Context) (Version, error) {
data, err := cmdOutput(r.command(context, "--version"), false) data, err := cmdOutput(r.command(context, "--version"), false)
defer putBuf(data)
if err != nil { if err != nil {
return Version{}, err return Version{}, err
} }
return parseVersion(data) return parseVersion(data.Bytes())
} }
func parseVersion(data []byte) (Version, error) { func parseVersion(data []byte) (Version, error) {
@ -687,15 +695,17 @@ func (r *Runc) runOrError(cmd *exec.Cmd) error {
return err return err
} }
data, err := cmdOutput(cmd, true) data, err := cmdOutput(cmd, true)
defer putBuf(data)
if err != nil { if err != nil {
return fmt.Errorf("%s: %s", err, data) return fmt.Errorf("%s: %s", err, data.String())
} }
return nil return nil
} }
func cmdOutput(cmd *exec.Cmd, combined bool) ([]byte, error) { // callers of cmdOutput are expected to call putBuf on the returned Buffer
// to ensure it is released back to the shared pool after use.
func cmdOutput(cmd *exec.Cmd, combined bool) (*bytes.Buffer, error) {
b := getBuf() b := getBuf()
defer putBuf(b)
cmd.Stdout = b cmd.Stdout = b
if combined { if combined {
@ -711,5 +721,5 @@ func cmdOutput(cmd *exec.Cmd, combined bool) ([]byte, error) {
err = fmt.Errorf("%s did not terminate successfully", cmd.Args[0]) err = fmt.Errorf("%s did not terminate successfully", cmd.Args[0])
} }
return b.Bytes(), err return b, err
} }

View File

@ -57,6 +57,10 @@ func getBuf() *bytes.Buffer {
} }
func putBuf(b *bytes.Buffer) { func putBuf(b *bytes.Buffer) {
if b == nil {
return
}
b.Reset() b.Reset()
bytesBufferPool.Put(b) bytesBufferPool.Put(b)
} }