From 888f97a35f6a4e227254b79b5efb7fad7a002f9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 7 Nov 2022 15:14:56 +0000 Subject: [PATCH] netbs: Add an integration test --- .circleci/config.yml | 5 ++ build/openrpc/full.json.gz | Bin 28456 -> 29070 bytes go.mod | 2 +- itests/deals_remote_retrieval_test.go | 104 ++++++++++++++++++++++++++ itests/kit/deals.go | 16 +++- itests/kit/node_full.go | 1 + itests/kit/rpc.go | 2 +- 7 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 itests/deals_remote_retrieval_test.go diff --git a/.circleci/config.yml b/.circleci/config.yml index 4af2bfc12..71c05ee51 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -896,6 +896,11 @@ workflows: suite: itest-deals_publish target: "./itests/deals_publish_test.go" + - test: + name: test-itest-deals_remote_retrieval + suite: itest-deals_remote_retrieval + target: "./itests/deals_remote_retrieval_test.go" + - test: name: test-itest-deals_retry_deal_no_funds suite: itest-deals_retry_deal_no_funds diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bd7b14d30d2535c7abdbe09a933db97bcea57e54..88ddb3f997dceeddf178b502c97529183d4178f6 100644 GIT binary patch delta 28941 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 z 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 diff --git a/go.mod b/go.mod index dbe41d95e..dad5ca5e7 100644 --- a/go.mod +++ b/go.mod @@ -63,6 +63,7 @@ require ( github.com/golang/mock v1.6.0 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.7.4 + github.com/gorilla/websocket v1.5.0 github.com/hako/durafmt v0.0.0-20200710122514-c0fb7b4da026 github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e github.com/hashicorp/go-multierror v1.1.1 @@ -214,7 +215,6 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/go-cmp v0.5.8 // indirect github.com/google/gopacket v1.1.19 // indirect - github.com/gorilla/websocket v1.5.0 // indirect github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/huin/goupnp v1.0.3 // indirect diff --git a/itests/deals_remote_retrieval_test.go b/itests/deals_remote_retrieval_test.go new file mode 100644 index 000000000..c0a37e69e --- /dev/null +++ b/itests/deals_remote_retrieval_test.go @@ -0,0 +1,104 @@ +package itests + +import ( + "bytes" + "context" + "fmt" + "io" + "net/url" + "os" + "path" + "testing" + "time" + + "github.com/google/uuid" + "github.com/gorilla/websocket" + "github.com/ipld/go-car" + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/api" + bstore "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/itests/kit" +) + +func TestNetStoreRetrieval(t *testing.T) { + kit.QuietMiningLogs() + + blocktime := 5 * time.Millisecond + ctx := context.Background() + + full, miner, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blocktime) + + time.Sleep(5 * time.Second) + + // For these tests where the block time is artificially short, just use + // a deal start epoch that is guaranteed to be far enough in the future + // so that the deal starts sealing in time + dealStartEpoch := abi.ChainEpoch(2 << 12) + + rseed := 7 + + dh := kit.NewDealHarness(t, full, miner, miner) + dealCid, res, _ := dh.MakeOnlineDeal(context.Background(), kit.MakeFullDealParams{ + Rseed: rseed, + StartEpoch: dealStartEpoch, + UseCARFileForStorageDeal: true, + }) + + // create deal store + id := uuid.New() + rstore := bstore.NewMemorySync() + + au, err := url.Parse(full.ListenURL) + require.NoError(t, err) + + switch au.Scheme { + case "http": + au.Scheme = "ws" + case "https": + au.Scheme = "wss" + } + + au.Path = path.Join(au.Path, "/rest/v0/store/"+id.String()) + + conn, _, err := websocket.DefaultDialer.Dial(au.String(), nil) + require.NoError(t, err) + + _ = bstore.HandleNetBstoreWS(ctx, rstore, conn) + + dh.PerformRetrievalWithOrder(ctx, dealCid, res.Root, false, func(offer api.QueryOffer, address address.Address) api.RetrievalOrder { + order := offer.Order(address) + + order.RemoteStore = &id + + return order + }) + + // check blockstore blocks + carv1FilePath, _ := kit.CreateRandomCARv1(t, rseed, 200) + cb, err := os.ReadFile(carv1FilePath) + require.NoError(t, err) + + cr, err := car.NewCarReader(bytes.NewReader(cb)) + require.NoError(t, err) + + var blocks int + for { + cb, err := cr.Next() + if err == io.EOF { + fmt.Println("blocks: ", blocks) + return + } + require.NoError(t, err) + + sb, err := rstore.Get(ctx, cb.Cid()) + require.NoError(t, err) + require.EqualValues(t, cb.RawData(), sb.RawData()) + + blocks++ + } +} diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 794a63803..1f3a7dfb5 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -19,6 +19,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-fil-markets/retrievalmarket" "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-fil-markets/storagemarket" @@ -308,6 +309,12 @@ func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { } func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool, offers ...api.QueryOffer) (path string) { + return dh.PerformRetrievalWithOrder(ctx, deal, root, carExport, func(offer api.QueryOffer, a address.Address) api.RetrievalOrder { + return offer.Order(a) + }, offers...) +} + +func (dh *DealHarness) PerformRetrievalWithOrder(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool, makeOrder func(api.QueryOffer, address.Address) api.RetrievalOrder, offers ...api.QueryOffer) (path string) { var offer api.QueryOffer if len(offers) == 0 { // perform retrieval. @@ -331,7 +338,9 @@ func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root updates, err := dh.client.ClientGetRetrievalUpdates(updatesCtx) require.NoError(dh.t, err) - retrievalRes, err := dh.client.ClientRetrieve(ctx, offer.Order(caddr)) + order := makeOrder(offer, caddr) + + retrievalRes, err := dh.client.ClientRetrieve(ctx, order) require.NoError(dh.t, err) consumeEvents: for { @@ -357,6 +366,11 @@ consumeEvents: } cancel() + if order.RemoteStore != nil { + // if we're retrieving into a remote store, skip export + return "" + } + require.NoError(dh.t, dh.client.ClientExport(ctx, api.ExportRef{ Root: root, diff --git a/itests/kit/node_full.go b/itests/kit/node_full.go index 710962e6a..5460d9156 100644 --- a/itests/kit/node_full.go +++ b/itests/kit/node_full.go @@ -27,6 +27,7 @@ type TestFullNode struct { // ListenAddr is the address on which an API server is listening, if an // API server is created for this Node. ListenAddr multiaddr.Multiaddr + ListenURL string DefaultKey *key.Key options nodeOpts diff --git a/itests/kit/rpc.go b/itests/kit/rpc.go index 45fb095d5..260eb970d 100644 --- a/itests/kit/rpc.go +++ b/itests/kit/rpc.go @@ -65,7 +65,7 @@ func fullRpc(t *testing.T, f *TestFullNode) *TestFullNode { cl, stop, err := client.NewFullNodeRPCV1(context.Background(), "ws://"+srv.Listener.Addr().String()+"/rpc/v1", nil) require.NoError(t, err) t.Cleanup(stop) - f.ListenAddr, f.FullNode = maddr, cl + f.ListenAddr, f.ListenURL, f.FullNode = maddr, srv.URL, cl return f }