mrun: fix Threads after changes to mctx which got rid of children
This commit is contained in:
parent
8bd0664ba0
commit
31ed0fe625
10
mrun/mrun.go
10
mrun/mrun.go
@ -30,8 +30,6 @@ package mrun
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"github.com/mediocregopher/mediocre-go-lib/mctx"
|
||||
)
|
||||
|
||||
type futureErr struct {
|
||||
@ -105,14 +103,6 @@ var ErrDone = errors.New("Wait is done waiting")
|
||||
// Wait is safe to call in parallel, and will return the same result if called
|
||||
// multiple times.
|
||||
func Wait(ctx context.Context, cancelCh <-chan struct{}) error {
|
||||
// First wait for all the children, and see if any of them return an error
|
||||
children := mctx.Children(ctx)
|
||||
for _, childCtx := range children {
|
||||
if err := Wait(childCtx, cancelCh); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
futErrs, _ := ctx.Value(threadCtxKey(0)).([]*futureErr)
|
||||
for _, futErr := range futErrs {
|
||||
err, ok := futErr.get(cancelCh)
|
||||
|
@ -5,8 +5,6 @@ import (
|
||||
"errors"
|
||||
. "testing"
|
||||
"time"
|
||||
|
||||
"github.com/mediocregopher/mediocre-go-lib/mctx"
|
||||
)
|
||||
|
||||
func TestThreadWait(t *T) {
|
||||
@ -26,123 +24,56 @@ func TestThreadWait(t *T) {
|
||||
return err
|
||||
}
|
||||
|
||||
t.Run("noChildren", func(t *T) {
|
||||
t.Run("noBlock", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error { return nil })
|
||||
if err := Wait(ctx, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("err", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error { return testErr })
|
||||
if err := Wait(ctx, nil); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
})
|
||||
t.Run("noBlock", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error { return nil })
|
||||
if err := Wait(ctx, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("block", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return nil
|
||||
})
|
||||
if err := wait(ctx, 1*time.Second); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("err", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
if err := wait(ctx, 1*time.Second); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("canceled", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(5 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
if err := Wait(ctx, cancelCh(500*time.Millisecond)); err != ErrDone {
|
||||
t.Fatalf("should have got ErrDone, got: %v", err)
|
||||
}
|
||||
})
|
||||
t.Run("err", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error { return testErr })
|
||||
if err := Wait(ctx, nil); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
ctxWithChild := func() (context.Context, context.Context) {
|
||||
ctx := context.Background()
|
||||
return ctx, mctx.NewChild(ctx, "child")
|
||||
}
|
||||
|
||||
t.Run("children", func(t *T) {
|
||||
t.Run("noBlock", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx, childCtx := ctxWithChild()
|
||||
childCtx = WithThreads(childCtx, 1, func() error { return nil })
|
||||
ctx = mctx.WithChild(ctx, childCtx)
|
||||
if err := Wait(ctx, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("err", func(t *T) {
|
||||
ctx, childCtx := ctxWithChild()
|
||||
childCtx = WithThreads(childCtx, 1, func() error { return testErr })
|
||||
ctx = mctx.WithChild(ctx, childCtx)
|
||||
if err := Wait(ctx, nil); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
t.Run("block", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return nil
|
||||
})
|
||||
if err := wait(ctx, 1*time.Second); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("block", func(t *T) {
|
||||
t.Run("noErr", func(t *T) {
|
||||
ctx, childCtx := ctxWithChild()
|
||||
childCtx = WithThreads(childCtx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return nil
|
||||
})
|
||||
ctx = mctx.WithChild(ctx, childCtx)
|
||||
if err := wait(ctx, 1*time.Second); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Run("err", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
if err := wait(ctx, 1*time.Second); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("err", func(t *T) {
|
||||
ctx, childCtx := ctxWithChild()
|
||||
childCtx = WithThreads(childCtx, 1, func() error {
|
||||
time.Sleep(1 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
ctx = mctx.WithChild(ctx, childCtx)
|
||||
if err := wait(ctx, 1*time.Second); err != testErr {
|
||||
t.Fatalf("should have got test error, got: %v", err)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("canceled", func(t *T) {
|
||||
ctx, childCtx := ctxWithChild()
|
||||
childCtx = WithThreads(childCtx, 1, func() error {
|
||||
time.Sleep(5 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
ctx = mctx.WithChild(ctx, childCtx)
|
||||
if err := Wait(ctx, cancelCh(500*time.Millisecond)); err != ErrDone {
|
||||
t.Fatalf("should have got ErrDone, got: %v", err)
|
||||
}
|
||||
t.Run("canceled", func(t *T) {
|
||||
ctx := context.Background()
|
||||
ctx = WithThreads(ctx, 1, func() error {
|
||||
time.Sleep(5 * time.Second)
|
||||
return testErr
|
||||
})
|
||||
if err := Wait(ctx, cancelCh(500*time.Millisecond)); err != ErrDone {
|
||||
t.Fatalf("should have got ErrDone, got: %v", err)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user