From ca5f16c33e8cbf72329a21b260f7fee9abad9779 Mon Sep 17 00:00:00 2001 From: Michael Crosby Date: Mon, 11 Dec 2017 10:36:19 -0500 Subject: [PATCH] Move stress worker to new file Signed-off-by: Michael Crosby --- cmd/containerd-stress/main.go | 113 ----------------------------- cmd/containerd-stress/worker.go | 125 ++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+), 113 deletions(-) create mode 100644 cmd/containerd-stress/worker.go diff --git a/cmd/containerd-stress/main.go b/cmd/containerd-stress/main.go index 53057d020..0a0d7aa9d 100644 --- a/cmd/containerd-stress/main.go +++ b/cmd/containerd-stress/main.go @@ -6,20 +6,15 @@ import ( "fmt" "os" "os/signal" - "path/filepath" "runtime" - "strconv" - "strings" "sync" "syscall" "time" "github.com/containerd/containerd" - "github.com/containerd/containerd/cio" "github.com/containerd/containerd/containers" "github.com/containerd/containerd/namespaces" "github.com/containerd/containerd/oci" - specs "github.com/opencontainers/runtime-spec/specs-go" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) @@ -225,114 +220,6 @@ func test(c config) error { return nil } -type worker struct { - id int - wg *sync.WaitGroup - count int - failures int - - client *containerd.Client - image containerd.Image - spec *specs.Spec - doExec bool -} - -func (w *worker) run(ctx, tctx context.Context) { - defer func() { - w.wg.Done() - logrus.Infof("worker %d finished", w.id) - }() - for { - select { - case <-tctx.Done(): - return - default: - } - - w.count++ - id := w.getID() - logrus.Debugf("starting container %s", id) - if err := w.runContainer(ctx, id); err != nil { - if err != context.DeadlineExceeded || - !strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { - w.failures++ - logrus.WithError(err).Errorf("running container %s", id) - - } - } - } -} - -func (w *worker) runContainer(ctx context.Context, id string) error { - // fix up cgroups path for a default config - w.spec.Linux.CgroupsPath = filepath.Join("/", "stress", id) - c, err := w.client.NewContainer(ctx, id, - containerd.WithNewSnapshot(id, w.image), - containerd.WithSpec(w.spec, oci.WithUsername("games")), - ) - if err != nil { - return err - } - defer c.Delete(ctx, containerd.WithSnapshotCleanup) - - task, err := c.NewTask(ctx, cio.NullIO) - if err != nil { - return err - } - defer task.Delete(ctx, containerd.WithProcessKill) - - statusC, err := task.Wait(ctx) - if err != nil { - return err - } - if err := task.Start(ctx); err != nil { - return err - } - if w.doExec { - for i := 0; i < 256; i++ { - if err := w.exec(ctx, i, task); err != nil { - w.failures++ - logrus.WithError(err).Error("exec failure") - } - } - if err := task.Kill(ctx, syscall.SIGKILL); err != nil { - return err - } - } - status := <-statusC - _, _, err = status.Result() - if err != nil { - if err == context.DeadlineExceeded || err == context.Canceled { - return nil - } - w.failures++ - } - return nil -} - -func (w *worker) exec(ctx context.Context, i int, t containerd.Task) error { - pSpec := *w.spec.Process - pSpec.Args = []string{"true"} - process, err := t.Exec(ctx, strconv.Itoa(i), &pSpec, cio.NullIO) - if err != nil { - return err - } - defer process.Delete(ctx) - status, err := process.Wait(ctx) - if err != nil { - return err - } - if err := process.Start(ctx); err != nil { - return err - } - <-status - return nil -} - -func (w *worker) getID() string { - return fmt.Sprintf("%d-%d", w.id, w.count) -} - // cleanup cleans up any containers in the "stress" namespace before the test run func cleanup(ctx context.Context, client *containerd.Client) error { containers, err := client.Containers(ctx) diff --git a/cmd/containerd-stress/worker.go b/cmd/containerd-stress/worker.go new file mode 100644 index 000000000..b89dfd113 --- /dev/null +++ b/cmd/containerd-stress/worker.go @@ -0,0 +1,125 @@ +package main + +import ( + "context" + "fmt" + "path/filepath" + "strconv" + "strings" + "sync" + "syscall" + + "github.com/Sirupsen/logrus" + "github.com/containerd/containerd" + "github.com/containerd/containerd/cio" + "github.com/containerd/containerd/oci" + specs "github.com/opencontainers/runtime-spec/specs-go" +) + +type worker struct { + id int + wg *sync.WaitGroup + count int + failures int + + client *containerd.Client + image containerd.Image + spec *specs.Spec + doExec bool +} + +func (w *worker) run(ctx, tctx context.Context) { + defer func() { + w.wg.Done() + logrus.Infof("worker %d finished", w.id) + }() + for { + select { + case <-tctx.Done(): + return + default: + } + + w.count++ + id := w.getID() + logrus.Debugf("starting container %s", id) + if err := w.runContainer(ctx, id); err != nil { + if err != context.DeadlineExceeded || + !strings.Contains(err.Error(), context.DeadlineExceeded.Error()) { + w.failures++ + logrus.WithError(err).Errorf("running container %s", id) + + } + } + } +} + +func (w *worker) runContainer(ctx context.Context, id string) error { + // fix up cgroups path for a default config + w.spec.Linux.CgroupsPath = filepath.Join("/", "stress", id) + c, err := w.client.NewContainer(ctx, id, + containerd.WithNewSnapshot(id, w.image), + containerd.WithSpec(w.spec, oci.WithUsername("games")), + ) + if err != nil { + return err + } + defer c.Delete(ctx, containerd.WithSnapshotCleanup) + + task, err := c.NewTask(ctx, cio.NullIO) + if err != nil { + return err + } + defer task.Delete(ctx, containerd.WithProcessKill) + + statusC, err := task.Wait(ctx) + if err != nil { + return err + } + if err := task.Start(ctx); err != nil { + return err + } + if w.doExec { + for i := 0; i < 256; i++ { + if err := w.exec(ctx, i, task); err != nil { + w.failures++ + logrus.WithError(err).Error("exec failure") + } + } + if err := task.Kill(ctx, syscall.SIGKILL); err != nil { + return err + } + } + status := <-statusC + _, _, err = status.Result() + if err != nil { + if err == context.DeadlineExceeded || err == context.Canceled { + return nil + } + w.failures++ + } + return nil +} + +func (w *worker) exec(ctx context.Context, i int, t containerd.Task) error { + pSpec := *w.spec.Process + pSpec.Args = []string{"true"} + process, err := t.Exec(ctx, strconv.Itoa(i), &pSpec, cio.NullIO) + if err != nil { + return err + } + defer process.Delete(ctx) + status, err := process.Wait(ctx) + if err != nil { + return err + } + if err := process.Start(ctx); err != nil { + return err + } + <-status + return nil +} + +func (w *worker) getID() string { + return fmt.Sprintf("%d-%d", w.id, w.count) +}