From e3b5686710f471a15d736c62ef2f6e66bbbec8a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20Mur=C3=A9?= Date: Wed, 27 Nov 2019 21:40:22 +0100 Subject: [PATCH] feat: make the CoreAPI expose a streaming pin interface This commit was moved from ipfs/interface-go-ipfs-core@f976af7ba62d0209b53aeef72fb102c4387d3f00 This commit was moved from ipfs/boxo@6eb5c9791b91da125d269d84b201d0acc8e7657a --- core/coreiface/pin.go | 5 ++++- core/coreiface/tests/block.go | 2 +- core/coreiface/tests/pin.go | 39 ++++++++++++++++++++++++---------- core/coreiface/tests/unixfs.go | 2 +- 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/core/coreiface/pin.go b/core/coreiface/pin.go index 7df2956f0..27f9355d3 100644 --- a/core/coreiface/pin.go +++ b/core/coreiface/pin.go @@ -14,6 +14,9 @@ type Pin interface { // Type of the pin Type() string + + // if not nil, an error happened. Everything else should be ignored. + Err() error } // PinStatus holds information about pin health @@ -41,7 +44,7 @@ type PinAPI interface { Add(context.Context, path.Path, ...options.PinAddOption) error // Ls returns list of pinned objects on this node - Ls(context.Context, ...options.PinLsOption) ([]Pin, error) + Ls(context.Context, ...options.PinLsOption) (<-chan Pin, error) // Rm removes pin for object specified by the path Rm(context.Context, path.Path, ...options.PinRmOption) error diff --git a/core/coreiface/tests/block.go b/core/coreiface/tests/block.go index 6b648f394..2048dd4c2 100644 --- a/core/coreiface/tests/block.go +++ b/core/coreiface/tests/block.go @@ -225,7 +225,7 @@ func (tp *TestSuite) TestBlockPin(t *testing.T) { t.Fatal(err) } - pins, err := api.Pin().Ls(ctx) + pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { return } diff --git a/core/coreiface/tests/pin.go b/core/coreiface/tests/pin.go index 7e574fa0d..a968490d3 100644 --- a/core/coreiface/tests/pin.go +++ b/core/coreiface/tests/pin.go @@ -67,7 +67,7 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) { t.Fatal(err) } - list, err := api.Pin().Ls(ctx) + list, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -89,7 +89,7 @@ func (tp *TestSuite) TestPinSimple(t *testing.T) { t.Fatal(err) } - list, err = api.Pin().Ls(ctx) + list, err = accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -141,7 +141,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Fatal(err) } - list, err := api.Pin().Ls(ctx) + list, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -150,7 +150,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected pin list len: %d", len(list)) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) if err != nil { t.Fatal(err) } @@ -163,7 +163,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpfsPath(nd2.Cid()).String()) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) if err != nil { t.Fatal(err) } @@ -176,7 +176,7 @@ func (tp *TestSuite) TestPinRecursive(t *testing.T) { t.Errorf("unexpected path, %s != %s", list[0].Path().String(), path.IpldPath(nd3.Cid()).String()) } - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) if err != nil { t.Fatal(err) } @@ -390,21 +390,21 @@ func getThreeChainedNodes(t *testing.T, ctx context.Context, api iface.CoreAPI, func assertPinTypes(t *testing.T, ctx context.Context, api iface.CoreAPI, recusive, direct, indirect []cidContainer) { assertPinLsAllConsistency(t, ctx, api) - list, err := api.Pin().Ls(ctx, opt.Pin.Type.Recursive()) + list, err := accPins(api.Pin().Ls(ctx, opt.Pin.Type.Recursive())) if err != nil { t.Fatal(err) } assertPinCids(t, list, recusive...) - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Direct()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Direct())) if err != nil { t.Fatal(err) } assertPinCids(t, list, direct...) - list, err = api.Pin().Ls(ctx, opt.Pin.Type.Indirect()) + list, err = accPins(api.Pin().Ls(ctx, opt.Pin.Type.Indirect())) if err != nil { t.Fatal(err) } @@ -454,7 +454,7 @@ func assertPinCids(t *testing.T, pins []iface.Pin, cids ...cidContainer) { // assertPinLsAllConsistency verifies that listing all pins gives the same result as listing the pin types individually func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.CoreAPI) { t.Helper() - allPins, err := api.Pin().Ls(ctx) + allPins, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) } @@ -485,7 +485,7 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core } for typeStr, pinProps := range typeMap { - pins, err := api.Pin().Ls(ctx, pinProps.PinLsOption) + pins, err := accPins(api.Pin().Ls(ctx, pinProps.PinLsOption)) if err != nil { t.Fatal(err) } @@ -505,3 +505,20 @@ func assertPinLsAllConsistency(t *testing.T, ctx context.Context, api iface.Core } } } + +func accPins(pins <-chan iface.Pin, err error) ([]iface.Pin, error) { + if err != nil { + return nil, err + } + + var result []iface.Pin + + for pin := range pins { + if pin.Err() != nil { + return nil, pin.Err() + } + result = append(result, pin) + } + + return result, nil +} diff --git a/core/coreiface/tests/unixfs.go b/core/coreiface/tests/unixfs.go index aac7fa92f..1ed80e873 100644 --- a/core/coreiface/tests/unixfs.go +++ b/core/coreiface/tests/unixfs.go @@ -542,7 +542,7 @@ func (tp *TestSuite) TestAddPinned(t *testing.T) { t.Fatal(err) } - pins, err := api.Pin().Ls(ctx) + pins, err := accPins(api.Pin().Ls(ctx)) if err != nil { t.Fatal(err) }