From 2f7f765076744f0a3cfeaae5fd8554736f3cec40 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 1 Mar 2019 14:29:09 -0800 Subject: [PATCH 1/2] fix(put): fail if any router fails --- parallel.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/parallel.go b/parallel.go index 7851f13..01f8256 100644 --- a/parallel.go +++ b/parallel.go @@ -130,12 +130,15 @@ func (r Parallel) put(do func(routing.IpfsRouting) error) error { } wg.Wait() - var errs []error + var ( + errs []error + success bool + ) for _, err := range results { switch err { case nil: - // Success! - return nil + // at least one router supports this. + success = true case routing.ErrNotSupported: default: errs = append(errs, err) @@ -144,6 +147,11 @@ func (r Parallel) put(do func(routing.IpfsRouting) error) error { switch len(errs) { case 0: + if success { + // No errors and at least one router succeeded. + return nil + } + // No routers supported this operation. return routing.ErrNotSupported case 1: return errs[0] From fe54a994b27606d9a49974cbe2fdc91a62ea3092 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Fri, 1 Mar 2019 17:50:38 -0800 Subject: [PATCH 2/2] test(parallel): all parallel puts must succeed --- dummy_test.go | 15 +++++++++++++++ parallel_test.go | 18 ++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/dummy_test.go b/dummy_test.go index 1d941d0..494b9ed 100644 --- a/dummy_test.go +++ b/dummy_test.go @@ -13,6 +13,21 @@ import ( ropts "github.com/libp2p/go-libp2p-routing/options" ) +type failValueStore struct{} + +var failValueErr = errors.New("fail valuestore error") + +func (f failValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { + return failValueErr +} +func (f failValueStore) GetValue(ctx context.Context, key string, opts ...ropts.Option) ([]byte, error) { + return nil, failValueErr +} + +func (f failValueStore) SearchValue(ctx context.Context, key string, opts ...ropts.Option) (<-chan []byte, error) { + return nil, failValueErr +} + type dummyValueStore sync.Map func (d *dummyValueStore) PutValue(ctx context.Context, key string, value []byte, opts ...ropts.Option) error { diff --git a/parallel_test.go b/parallel_test.go index b17cdc5..fd3a7e6 100644 --- a/parallel_test.go +++ b/parallel_test.go @@ -129,6 +129,24 @@ func TestParallelPutGet(t *testing.T) { cancel() } +func TestParallelPutFailure(t *testing.T) { + ctx := context.Background() + router := Parallel{ + Routers: []routing.IpfsRouting{ + &Compose{ + ValueStore: new(failValueStore), + }, + &Compose{ + ValueStore: new(dummyValueStore), + }, + }, + } + err := router.PutValue(ctx, "/some/thing", []byte("thing")) + if err != failValueErr { + t.Fatalf("exected put to fail with %q, got %q", failValueErr, err) + } +} + func TestBasicParallelFindProviders(t *testing.T) { prefix := cid.NewPrefixV1(cid.Raw, mh.SHA2_256) c, _ := prefix.Sum([]byte("foo"))