From fa8372a83bea385f29f0cc3eddf19795a346809a Mon Sep 17 00:00:00 2001 From: Jiaying Wang <42981373+jennijuju@users.noreply.github.com> Date: Mon, 10 Jan 2022 19:07:54 -0500 Subject: [PATCH 01/29] Update pull_request_template.md - remove misc, can use chore instead - add deps for area --- .github/pull_request_template.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index c6273f056..c806120b1 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -14,8 +14,8 @@ Before you mark the PR ready for review, please make sure that: - [ ] All commits have a clear commit message. - [ ] The PR title is in the form of of `: : ` - example: ` fix: mempool: Introduce a cache for valid signatures` - - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_, _misc_,_perf_, _refactor_, _revert_, _style_, _test_ - - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_ + - `PR type`: _fix_, _feat_, _INTERFACE BREAKING CHANGE_, _CONSENSUS BREAKING_, _build_, _chore_, _ci_, _docs_,_perf_, _refactor_, _revert_, _style_, _test_ + - `area`: _api_, _chain_, _state_, _vm_, _data transfer_, _market_, _mempool_, _message_, _block production_, _multisig_, _networking_, _paychan_, _proving_, _sealing_, _wallet_, _deps_ - [ ] This PR has tests for new functionality or change in behaviour - [ ] If new user-facing features are introduced, clear usage guidelines and / or documentation updates should be included in https://lotus.filecoin.io or [Discussion Tutorials.](https://github.com/filecoin-project/lotus/discussions/categories/tutorials) - [ ] CI is green From 92d56d82f4cc8d6e148c7d7d2bd10d404f0f7092 Mon Sep 17 00:00:00 2001 From: hannahhoward Date: Fri, 14 Jan 2022 17:04:41 -0800 Subject: [PATCH 02/29] feat(deps): update markets stack update go-fil-markets, go-data-transfer 1.13.0, go-graphsync 0.12.0 --- go.mod | 10 +++++----- go.sum | 38 +++++++++++++++++++----------------- markets/loggers/loggers.go | 2 +- node/modules/client.go | 8 ++------ node/modules/storageminer.go | 10 +++------- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index b5d8bac55..680ed0460 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.12.1 + github.com/filecoin-project/go-data-transfer v1.13.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.14.1 + github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -78,7 +78,7 @@ require ( github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.11.5 + github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-blocksutil v0.0.1 github.com/ipfs/go-ipfs-chunker v0.0.5 @@ -97,12 +97,12 @@ require ( github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 github.com/ipfs/go-path v0.0.7 - github.com/ipfs/go-unixfs v0.2.6 + github.com/ipfs/go-unixfs v0.3.1 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.14.3 + github.com/ipld/go-ipld-prime v0.14.4 github.com/ipld/go-ipld-selector-text-lite v0.0.1 github.com/jonboulle/clockwork v0.2.2 // indirect github.com/kelseyhightower/envconfig v1.4.0 diff --git a/go.sum b/go.sum index 882d231ee..9dbd3af85 100644 --- a/go.sum +++ b/go.sum @@ -94,6 +94,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -314,19 +316,19 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= -github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= -github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= +github.com/filecoin-project/go-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= +github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= +github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= +github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= -github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 h1:HQlChWK+n/Bm6sXcNh3KOFqPHXKlZ41o3l+bygpHw3Q= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -658,6 +660,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= @@ -693,7 +697,6 @@ github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= @@ -721,13 +724,11 @@ github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zND github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= -github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= -github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= +github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= +github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= @@ -745,7 +746,6 @@ github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1I github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= -github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= @@ -829,8 +829,10 @@ github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68 github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= -github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= +github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= +github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= @@ -854,11 +856,10 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= -github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= +github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73 h1:TsyATB2ZRRQGTwafJdgEUQkmjOExRV0DNokcihZxbnQ= github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= @@ -1459,8 +1460,9 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c h1:VyANTtZ0wsx0IAZnCZhfMmAmfUyzJq/5JQi2hHOtKS0= +github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index 2acf987cb..2d13a64a1 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -40,7 +40,7 @@ func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelStat "sent", state.Sent(), "received", state.Received(), "queued", state.Queued(), - "received count", state.ReceivedCidsLen(), + "received count", state.ReceivedCidsTotal(), "total size", state.TotalSize(), "remote peer", state.OtherPeer(), "event message", event.Message, diff --git a/node/modules/client.go b/node/modules/client.go index 86063b8d9..48f9dc3d7 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -114,11 +114,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap net := dtnet.NewFromLibp2pHost(h, dtRetryParams) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/client/transfers")) - transport := dtgstransport.NewTransport(h.ID(), gs, net) - err := os.MkdirAll(filepath.Join(r.Path(), "data-transfer"), 0755) //nolint: gosec - if err != nil && !os.IsExist(err) { - return nil, err - } + transport := dtgstransport.NewTransport(h.ID(), gs) // data-transfer push / pull channel restart configuration: dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ @@ -138,7 +134,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // After trying to restart 3 times, give up and fail the transfer MaxConsecutiveRestarts: 3, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConfig) + dt, err := dtimpl.NewDataTransfer(dtDs, net, transport, dtRestartConfig) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 3b8687525..da1a016f7 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -341,19 +341,15 @@ func NewProviderTransferNetwork(h host.Host) dtypes.ProviderTransferNetwork { } // NewProviderTransport sets up a data transfer transport over graphsync -func NewProviderTransport(h host.Host, gs dtypes.StagingGraphsync, net dtypes.ProviderTransferNetwork) dtypes.ProviderTransport { - return dtgstransport.NewTransport(h.ID(), gs, net) +func NewProviderTransport(h host.Host, gs dtypes.StagingGraphsync) dtypes.ProviderTransport { + return dtgstransport.NewTransport(h.ID(), gs) } // NewProviderDataTransfer returns a data transfer manager func NewProviderDataTransfer(lc fx.Lifecycle, net dtypes.ProviderTransferNetwork, transport dtypes.ProviderTransport, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) - err := os.MkdirAll(filepath.Join(r.Path(), "data-transfer"), 0755) //nolint: gosec - if err != nil && !os.IsExist(err) { - return nil, err - } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) + dt, err := dtimpl.NewDataTransfer(dtDs, net, transport) if err != nil { return nil, err } From 9ec1abf8808422366443e3bea06973a23e644a2c Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 17 Jan 2022 16:08:16 -0500 Subject: [PATCH 03/29] :Fix: create a new VM for each epoch --- chain/consensus/filcns/compute_state.go | 58 +++++++++++-------------- chain/consensus/filcns/filecoin.go | 20 ++++++--- chain/vm/vm.go | 11 ----- 3 files changed, 39 insertions(+), 50 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 2f8cab740..f7f6284d0 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -92,16 +92,16 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager partDone() }() - makeVmWithBaseState := func(base cid.Cid) (*vm.VM, error) { + makeVmWithBaseStateAndEpoch := func(base cid.Cid, e abi.ChainEpoch) (*vm.VM, error) { vmopt := &vm.VMOpts{ StateBase: base, - Epoch: epoch, + Epoch: e, Rand: r, Bstore: sm.ChainStore().StateBlockstore(), Actors: NewActorRegistry(), Syscalls: sm.Syscalls, CircSupplyCalc: sm.GetVMCirculatingSupply, - NetworkVersion: sm.GetNetworkVersion(ctx, epoch), + NetworkVersion: sm.GetNetworkVersion(ctx, e), BaseFee: baseFee, LookbackState: stmgr.LookbackStateGetterForTipset(sm, ts), } @@ -109,12 +109,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager return sm.VMConstructor()(ctx, vmopt) } - vmi, err := makeVmWithBaseState(pstate) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) - } - - runCron := func(epoch abi.ChainEpoch) error { + runCron := func(vmCron *vm.VM, epoch abi.ChainEpoch) error { cronMsg := &types.Message{ To: cron.Address, From: builtin.SystemActorAddr, @@ -126,59 +121,58 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager Method: cron.Methods.EpochTick, Params: nil, } - ret, err := vmi.ApplyImplicitMessage(ctx, cronMsg) + ret, err := vmCron.ApplyImplicitMessage(ctx, cronMsg) if err != nil { - return err + return xerrors.Errorf("running cron: %w", err) } + if em != nil { if err := em.MessageApplied(ctx, ts, cronMsg.Cid(), cronMsg, ret, true); err != nil { return xerrors.Errorf("callback failed on cron message: %w", err) } } if ret.ExitCode != 0 { - return xerrors.Errorf("CheckProofSubmissions exit was non-zero: %d", ret.ExitCode) + return xerrors.Errorf("cron exit was non-zero: %d", ret.ExitCode) } return nil } for i := parentEpoch; i < epoch; i++ { + var err error if i > parentEpoch { - // run cron for null rounds if any - if err := runCron(i); err != nil { - return cid.Undef, cid.Undef, err + vmCron, err := makeVmWithBaseStateAndEpoch(pstate, i) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("making cron vm: %w", err) } - pstate, err = vmi.Flush(ctx) + // run cron for null rounds if any + if err = runCron(vmCron, i); err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("running cron: %w", err) + } + + pstate, err = vmCron.Flush(ctx) if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("flushing vm: %w", err) + return cid.Undef, cid.Undef, xerrors.Errorf("flushing cron vm: %w", err) } } // handle state forks // XXX: The state tree - newState, err := sm.HandleStateForks(ctx, pstate, i, em, ts) + pstate, err = sm.HandleStateForks(ctx, pstate, i, em, ts) if err != nil { return cid.Undef, cid.Undef, xerrors.Errorf("error handling state forks: %w", err) } - - if pstate != newState { - vmi, err = makeVmWithBaseState(newState) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) - } - } - - if err = vmi.SetBlockHeight(ctx, i+1); err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("error advancing vm an epoch: %w", err) - } - - pstate = newState } partDone() partDone = metrics.Timer(ctx, metrics.VMApplyMessages) + vmi, err := makeVmWithBaseStateAndEpoch(pstate, epoch) + if err != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("making vm: %w", err) + } + var receipts []cbg.CBORMarshaler processedMsgs := make(map[cid.Cid]struct{}) for _, b := range bms { @@ -246,7 +240,7 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, sm *stmgr.StateManager partDone() partDone = metrics.Timer(ctx, metrics.VMApplyCron) - if err := runCron(epoch); err != nil { + if err := runCron(vmi, epoch); err != nil { return cid.Cid{}, cid.Cid{}, err } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 42020d529..be7628b4f 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -458,7 +458,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl stateroot, _, err := filec.sm.TipSetState(ctx, baseTs) if err != nil { - return err + return xerrors.Errorf("failed to compute tipsettate for %s: %w", baseTs.Key(), err) } st, err := state.LoadStateTree(filec.store.ActorStore(ctx), stateroot) @@ -475,7 +475,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl // Phase 1: syntactic validation, as defined in the spec minGas := pl.OnChainMessage(msg.ChainLength()) if err := m.ValidForBlockInclusion(minGas.Total(), nv); err != nil { - return err + return xerrors.Errorf("msg %s invalid for block inclusion: %w", m.Cid(), err) } // ValidForBlockInclusion checks if any single message does not exceed BlockGasLimit @@ -491,7 +491,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version13 { sender, err = st.LookupID(m.From) if err != nil { - return err + return xerrors.Errorf("failed to lookup sender %s: %w", m.From, err) } } else { sender = m.From @@ -574,12 +574,13 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl bmroot, err := bmArr.Root() if err != nil { - return err + return xerrors.Errorf("failed to root bls msgs: %w", err) + } smroot, err := smArr.Root() if err != nil { - return err + return xerrors.Errorf("failed to root secp msgs: %w", err) } mrcid, err := tmpstore.Put(ctx, &types.MsgMeta{ @@ -587,7 +588,7 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl SecpkMessages: smroot, }) if err != nil { - return err + return xerrors.Errorf("failed to put msg meta: %w", err) } if b.Header.Messages != mrcid { @@ -595,7 +596,12 @@ func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBl } // Finally, flush. - return vm.Copy(ctx, tmpbs, filec.store.ChainBlockstore(), mrcid) + err = vm.Copy(ctx, tmpbs, filec.store.ChainBlockstore(), mrcid) + if err != nil { + return xerrors.Errorf("failed to flush:%w", err) + } + + return nil } func (filec *FilecoinEC) IsEpochBeyondCurrMax(epoch abi.ChainEpoch) bool { diff --git a/chain/vm/vm.go b/chain/vm/vm.go index 703a19880..1ab97bc33 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -824,17 +824,6 @@ func (vm *VM) StateTree() types.StateTree { return vm.cstate } -func (vm *VM) SetBlockHeight(ctx context.Context, h abi.ChainEpoch) error { - vm.blockHeight = h - ncirc, err := vm.circSupplyCalc(ctx, vm.blockHeight, vm.cstate) - if err != nil { - return err - } - - vm.baseCircSupply = ncirc - return nil -} - func (vm *VM) Invoke(act *types.Actor, rt *Runtime, method abi.MethodNum, params []byte) ([]byte, aerrors.ActorError) { ctx, span := trace.StartSpan(rt.ctx, "vm.Invoke") defer span.End() From d6778263123be5e265085ff4d7e010f234f6112e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 18 Jan 2022 10:24:43 +0100 Subject: [PATCH 04/29] Cleanup go.mod --- go.mod | 4 ---- 1 file changed, 4 deletions(-) diff --git a/go.mod b/go.mod index b5d8bac55..34a5f1498 100644 --- a/go.mod +++ b/go.mod @@ -173,7 +173,3 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors - -//replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors - -// replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage From 1ce1dbbc5007d2236152f352eade7c11c47b1b14 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 18 Jan 2022 14:29:59 +0100 Subject: [PATCH 05/29] feat: update go-fil-markets to tagged release --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 680ed0460..639f87504 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.13.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 + github.com/filecoin-project/go-fil-markets v1.17.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index 9dbd3af85..8bcda41ef 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36 h1:HQlChWK+n/Bm6sXcNh3KOFqPHXKlZ41o3l+bygpHw3Q= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220115005823-180ae44bbc36/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= +github.com/filecoin-project/go-fil-markets v1.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= +github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From d0390181ec67ac606c59a2cb71ce57b85a762a33 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 10:39:02 -0500 Subject: [PATCH 06/29] feat: sealing: Add ReplicaUpdate work to Resource table --- documentation/en/api-v0-methods-miner.md | 328 +++++++++++++++++++ documentation/en/api-v0-methods-worker.md | 328 +++++++++++++++++++ extern/sector-storage/storiface/resources.go | 136 ++++++++ 3 files changed, 792 insertions(+) diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index caf0419fe..437473f3c 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -3768,6 +3768,334 @@ Response: "BaseMinMemory": 1073741824 } }, + "seal/v0/provereplicaupdate/1": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/provereplicaupdate/2": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "3": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "4": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "8": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "9": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + } + }, + "seal/v0/regensectorkey": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/replicaupdate": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, "seal/v0/unseal": { "0": { "MinMemory": 2048, diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index f2d9019e2..959265a4d 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -599,6 +599,334 @@ Response: "BaseMinMemory": 1073741824 } }, + "seal/v0/provereplicaupdate/1": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 0, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/provereplicaupdate/2": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "3": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "4": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1610612736, + "GPUUtilization": 1, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 10737418240 + }, + "8": { + "MinMemory": 32212254720, + "MaxMemory": 161061273600, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 34359738368 + }, + "9": { + "MinMemory": 64424509440, + "MaxMemory": 204010946560, + "GPUUtilization": 1, + "MaxParallelism": -1, + "MaxParallelismGPU": 6, + "BaseMinMemory": 68719476736 + } + }, + "seal/v0/regensectorkey": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, + "seal/v0/replicaupdate": { + "0": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "1": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "2": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "3": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "4": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "5": { + "MinMemory": 2048, + "MaxMemory": 2048, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 2048 + }, + "6": { + "MinMemory": 8388608, + "MaxMemory": 8388608, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 8388608 + }, + "7": { + "MinMemory": 1073741824, + "MaxMemory": 1073741824, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "8": { + "MinMemory": 4294967296, + "MaxMemory": 4294967296, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + }, + "9": { + "MinMemory": 8589934592, + "MaxMemory": 8589934592, + "GPUUtilization": 0, + "MaxParallelism": 1, + "MaxParallelismGPU": 0, + "BaseMinMemory": 1073741824 + } + }, "seal/v0/unseal": { "0": { "MinMemory": 2048, diff --git a/extern/sector-storage/storiface/resources.go b/extern/sector-storage/storiface/resources.go index b5f45d722..51bb68574 100644 --- a/extern/sector-storage/storiface/resources.go +++ b/extern/sector-storage/storiface/resources.go @@ -331,10 +331,146 @@ var ResourceTable = map[sealtasks.TaskType]map[abi.RegisteredSealProof]Resources BaseMinMemory: 0, }, }, + // TODO: this should ideally be the actual replica update proof types + // TODO: actually measure this (and all the other replica update work) + sealtasks.TTReplicaUpdate: { // copied from addpiece + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 8 << 30, + MinMemory: 8 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 4 << 30, + MinMemory: 4 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 1, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 1, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 1, + + BaseMinMemory: 8 << 20, + }, + }, + sealtasks.TTProveReplicaUpdate1: { // copied from commit1 + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 1 << 30, + MinMemory: 1 << 30, + + MaxParallelism: 0, + + BaseMinMemory: 1 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 0, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 0, + + BaseMinMemory: 8 << 20, + }, + }, + sealtasks.TTProveReplicaUpdate2: { // copied from commit2 + abi.RegisteredSealProof_StackedDrg64GiBV1: Resources{ + MaxMemory: 190 << 30, // TODO: Confirm + MinMemory: 60 << 30, + + MaxParallelism: -1, + MaxParallelismGPU: 6, + GPUUtilization: 1.0, + + BaseMinMemory: 64 << 30, // params + }, + abi.RegisteredSealProof_StackedDrg32GiBV1: Resources{ + MaxMemory: 150 << 30, // TODO: ~30G of this should really be BaseMaxMemory + MinMemory: 30 << 30, + + MaxParallelism: -1, + MaxParallelismGPU: 6, + GPUUtilization: 1.0, + + BaseMinMemory: 32 << 30, // params + }, + abi.RegisteredSealProof_StackedDrg512MiBV1: Resources{ + MaxMemory: 3 << 29, // 1.5G + MinMemory: 1 << 30, + + MaxParallelism: 1, // This is fine + GPUUtilization: 1.0, + + BaseMinMemory: 10 << 30, + }, + abi.RegisteredSealProof_StackedDrg2KiBV1: Resources{ + MaxMemory: 2 << 10, + MinMemory: 2 << 10, + + MaxParallelism: 1, + GPUUtilization: 1.0, + + BaseMinMemory: 2 << 10, + }, + abi.RegisteredSealProof_StackedDrg8MiBV1: Resources{ + MaxMemory: 8 << 20, + MinMemory: 8 << 20, + + MaxParallelism: 1, + GPUUtilization: 1.0, + + BaseMinMemory: 8 << 20, + }, + }, } func init() { ResourceTable[sealtasks.TTUnseal] = ResourceTable[sealtasks.TTPreCommit1] // TODO: measure accurately + ResourceTable[sealtasks.TTRegenSectorKey] = ResourceTable[sealtasks.TTReplicaUpdate] // V1_1 is the same as V1 for _, m := range ResourceTable { From ab8bf393c237262e4785af22a398fe94dff23e70 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 16:35:07 -0500 Subject: [PATCH 07/29] create replica update paths in acquireSectors --- extern/sector-storage/ffiwrapper/basicfs/fs.go | 6 ++++++ extern/sector-storage/ffiwrapper/sealer_cgo.go | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/extern/sector-storage/ffiwrapper/basicfs/fs.go b/extern/sector-storage/ffiwrapper/basicfs/fs.go index a833f728c..3d19e49ef 100644 --- a/extern/sector-storage/ffiwrapper/basicfs/fs.go +++ b/extern/sector-storage/ffiwrapper/basicfs/fs.go @@ -34,6 +34,12 @@ func (b *Provider) AcquireSector(ctx context.Context, id storage.SectorRef, exis if err := os.Mkdir(filepath.Join(b.Root, storiface.FTCache.String()), 0755); err != nil && !os.IsExist(err) { // nolint return storiface.SectorPaths{}, nil, err } + if err := os.Mkdir(filepath.Join(b.Root, storiface.FTUpdate.String()), 0755); err != nil && !os.IsExist(err) { // nolint + return storiface.SectorPaths{}, nil, err + } + if err := os.Mkdir(filepath.Join(b.Root, storiface.FTUpdateCache.String()), 0755); err != nil && !os.IsExist(err) { // nolint + return storiface.SectorPaths{}, nil, err + } done := func() {} diff --git a/extern/sector-storage/ffiwrapper/sealer_cgo.go b/extern/sector-storage/ffiwrapper/sealer_cgo.go index e3939d3d1..88ab50f05 100644 --- a/extern/sector-storage/ffiwrapper/sealer_cgo.go +++ b/extern/sector-storage/ffiwrapper/sealer_cgo.go @@ -697,10 +697,10 @@ func (sb *Sealer) ReplicaUpdate(ctx context.Context, sector storage.SectorRef, p if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint if os.IsExist(err) { - log.Warnf("existing cache in %s; removing", paths.Cache) + log.Warnf("existing cache in %s; removing", paths.UpdateCache) if err := os.RemoveAll(paths.UpdateCache); err != nil { - return empty, xerrors.Errorf("remove existing sector cache from %s (sector %d): %w", paths.Cache, sector, err) + return empty, xerrors.Errorf("remove existing sector cache from %s (sector %d): %w", paths.UpdateCache, sector, err) } if err := os.Mkdir(paths.UpdateCache, 0755); err != nil { // nolint:gosec From 3ff23ecbfab79c08c6c48ee43e66e1651420c3f4 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 18 Jan 2022 18:54:33 -0500 Subject: [PATCH 08/29] :fix: checkReplica incorrectly returns ErrBadPR --- build/openrpc/miner.json.gz | Bin 12680 -> 12787 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3918 bytes extern/storage-sealing/checks.go | 2 +- extern/storage-sealing/states_failed.go | 2 +- 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 8e34e9de7477a8ec0e2d360d581d3a68d8cdb762..0c3eef45d2660c0ac839ba80b59ab2b2b55f3ab3 100644 GIT binary patch delta 319 zcmV-F0l@xap9JI2q0oVLW>Gn)%Up&<9nNoYER8hXRXG+g~rX&%p z?fKIFIPTl?rS^QOJzsh`=SvQnBjWN1`a85~9k2Tm#@B|JZr6hS?p?2Ki0QtDn8u9P zR-*0;)wU9~m8h*m{VpZynz&wd|5lVf_t|S370^Zn6bRBbDqw$~q5__nBz;fd)C$wU zyE3;Pksyr1xq|NOXGi(o3fqn+@-x%VJH?zc<@YY(PMJZONpw49)i=(qHTer#G}VaUmd zHW@;(*JWme$ET^x$49TFdKtr5l$}!Msvl-oqOodPY9z8xF*i##oX;HMYlbcpETp&` zF^-iGVuafj^M+##U;Y~|5tKeFGgg&Y@@h}w@}~q1aq+dwY7+YzzCD;|Pfxc`|33f# N|NqR!W#ffe0s!emXw(1z diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 3715754a2f7550af5b97187cec88804d9fe60f95..b940feca71098909be807a47d9ff170043fd2d9e 100644 GIT binary patch literal 3918 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 literal 3803 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 Date: Tue, 18 Jan 2022 14:19:30 +0200 Subject: [PATCH 09/29] go mod: go-libp2p@v0.18.0-rc1 --- go.mod | 16 +++++++-------- go.sum | 63 ++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/go.mod b/go.mod index 0e527d8bd..de4f05fab 100644 --- a/go.mod +++ b/go.mod @@ -92,7 +92,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-log/v2 v2.5.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 @@ -108,26 +108,26 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 github.com/libp2p/go-eventbus v0.2.1 - github.com/libp2p/go-libp2p v0.17.0 - github.com/libp2p/go-libp2p-connmgr v0.3.1 - github.com/libp2p/go-libp2p-core v0.13.0 + github.com/libp2p/go-libp2p v0.18.0-rc1 + github.com/libp2p/go-libp2p-connmgr v0.3.1 // indirect + github.com/libp2p/go-libp2p-core v0.14.0 github.com/libp2p/go-libp2p-discovery v0.6.0 github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 github.com/libp2p/go-libp2p-pubsub v0.6.0 - github.com/libp2p/go-libp2p-quic-transport v0.15.2 + github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 - github.com/libp2p/go-libp2p-swarm v0.9.0 + github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 - github.com/libp2p/go-libp2p-yamux v0.7.0 + github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.4 - github.com/multiformats/go-multiaddr v0.4.1 + github.com/multiformats/go-multiaddr v0.5.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.1.0 diff --git a/go.sum b/go.sum index 8bcda41ef..d81393867 100644 --- a/go.sum +++ b/go.sum @@ -807,8 +807,9 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= @@ -959,7 +960,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= github.com/libp2p/go-addr-util v0.0.2/go.mod h1:Ecd6Fb3yIuLzq4bD7VcywcVSBtefcAwnUISBM3WG15E= -github.com/libp2p/go-addr-util v0.1.0 h1:acKsntI33w2bTU7tC9a0SaPimJGfSI0bFKC18ChxeVI= github.com/libp2p/go-addr-util v0.1.0/go.mod h1:6I3ZYuFr2O/9D+SoyM0zEw0EF3YkldtTX406BpdQMqw= github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= @@ -993,8 +993,9 @@ github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qD github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= -github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= +github.com/libp2p/go-libp2p v0.18.0-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= +github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= github.com/libp2p/go-libp2p-asn-util v0.1.0 h1:rABPCO77SjdbJ/eJ/ynIo8vWICy1VEnL5JAxJbQLo1E= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= @@ -1006,7 +1007,6 @@ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRk github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= -github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= github.com/libp2p/go-libp2p-autonat-svc v0.1.0/go.mod h1:fqi8Obl/z3R4PFVLm8xFtZ6PBL9MlV/xumymRFkKq5A= github.com/libp2p/go-libp2p-blankhost v0.0.1/go.mod h1:Ibpbw/7cPPYwFb7PACIWdvxxv0t0XCCI10t7czjAjTc= @@ -1022,8 +1022,9 @@ github.com/libp2p/go-libp2p-circuit v0.1.1/go.mod h1:Ahq4cY3V9VJcHcn1SBXjr78AbFk github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8OTBGoV1AWbWor3qM= github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= -github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= +github.com/libp2p/go-libp2p-circuit v0.6.0 h1:rw/HlhmUB3OktS/Ygz6+2XABOmHKzZpPUuMNUMosj8w= +github.com/libp2p/go-libp2p-circuit v0.6.0/go.mod h1:kB8hY+zCpMeScyvFrKrGicRdid6vNXbunKE4rXATZ0M= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= github.com/libp2p/go-libp2p-connmgr v0.2.4/go.mod h1:YV0b/RIm8NGPnnNWM7hG9Q38OeQiQfKhHCCs1++ufn0= github.com/libp2p/go-libp2p-connmgr v0.3.0/go.mod h1:RVoyPjJm0J9Vd1m6qUN2Tn7kJm4rL1Ml20pFsFgPGik= @@ -1062,8 +1063,9 @@ github.com/libp2p/go-libp2p-core v0.9.0/go.mod h1:ESsbz31oC3C1AvMJoGx26RTuCkNhmk github.com/libp2p/go-libp2p-core v0.10.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.11.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= github.com/libp2p/go-libp2p-core v0.12.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= -github.com/libp2p/go-libp2p-core v0.13.0 h1:IFG/s8dN6JN2OTrXX9eq2wNU/Zlz2KLdwZUp5FplgXI= github.com/libp2p/go-libp2p-core v0.13.0/go.mod h1:ECdxehoYosLYHgDDFa2N4yE8Y7aQRAMf0sX9mf2sbGg= +github.com/libp2p/go-libp2p-core v0.14.0 h1:0kYSgiK/D7Eo28GTuRXo5YHsWwAisVpFCqCVPUd/vJs= +github.com/libp2p/go-libp2p-core v0.14.0/go.mod h1:tLasfcVdTXnixsLB0QYaT1syJOhsbrhG7q6pGrHtBg8= github.com/libp2p/go-libp2p-crypto v0.0.1/go.mod h1:yJkNyDmO341d5wwXxDUGO0LykUVT72ImHNUqh5D/dBE= github.com/libp2p/go-libp2p-crypto v0.0.2/go.mod h1:eETI5OUfBnvARGOHrJz2eWNyTUxEGZnBxMcbUjfIj4I= github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= @@ -1098,8 +1100,9 @@ github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiY github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= -github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= +github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= +github.com/libp2p/go-libp2p-mplex v0.5.0/go.mod h1:eLImPJLkj3iG5t5lq68w3Vm5NAQ5BcKwrrb2VmOYb3M= github.com/libp2p/go-libp2p-nat v0.0.4/go.mod h1:N9Js/zVtAXqaeT99cXgTV9e75KpnWCvVOiGzlcHmBbY= github.com/libp2p/go-libp2p-nat v0.0.5/go.mod h1:1qubaE5bTZMJE+E/uu2URroMbzdubFz1ChgiN79yKPE= github.com/libp2p/go-libp2p-nat v0.0.6/go.mod h1:iV59LVhB3IkFvS6S6sauVTSOrNEANnINbI/fkaLimiw= @@ -1142,14 +1145,17 @@ github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqU github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= -github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= github.com/libp2p/go-libp2p-quic-transport v0.15.2/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= +github.com/libp2p/go-libp2p-quic-transport v0.16.0 h1:aVg9/jr+R2esov5sH7wkXrmYmqJiUjtLMLYX3L9KYdY= +github.com/libp2p/go-libp2p-quic-transport v0.16.0/go.mod h1:1BXjVMzr+w7EkPfiHkKnwsWjPjtfaNT0q8RS3tGDvEQ= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= +github.com/libp2p/go-libp2p-resource-manager v0.1.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= +github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= @@ -1169,8 +1175,9 @@ github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJeg github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= -github.com/libp2p/go-libp2p-swarm v0.9.0 h1:LdWjHDVjPMYt3NCG2EHcQiIP8XzA8BHhHz8ZLAYol2Y= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= +github.com/libp2p/go-libp2p-swarm v0.10.0 h1:1yr7UCwxCN92cw9g9Q+fnJSlk7lOB1RetoEewxhGVL0= +github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1182,8 +1189,9 @@ github.com/libp2p/go-libp2p-testing v0.3.0/go.mod h1:efZkql4UZ7OVsEfaxNHZPzIehts github.com/libp2p/go-libp2p-testing v0.4.0/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.4.2/go.mod h1:Q+PFXYoiYFN5CAEG2w3gLPEzotlKsNSbKQ/lImlOWF0= github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= -github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= +github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= +github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= @@ -1198,8 +1206,9 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIW github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= github.com/libp2p/go-libp2p-transport-upgrader v0.5.0/go.mod h1:Rc+XODlB3yce7dvFV4q/RmyJGsFcCZRkeZMu/Zdg0mo= -github.com/libp2p/go-libp2p-transport-upgrader v0.6.0 h1:GfMCU+2aGGEm1zW3UcOz6wYSn8tXQalFfVfcww99i5A= github.com/libp2p/go-libp2p-transport-upgrader v0.6.0/go.mod h1:1e07y1ZSZdHo9HPbuU8IztM1Cj+DR5twgycb4pnRzRo= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.0 h1:ADnLrL7fC4Vy7HPjk9oGof7nDeTqGXuof85Ar6kin9Q= +github.com/libp2p/go-libp2p-transport-upgrader v0.7.0/go.mod h1:GIR2aTRp1J5yjVlkUoFqMkdobfob6RnAwYg/RZPhrzg= github.com/libp2p/go-libp2p-xor v0.0.0-20210714161855-5c005aca55db/go.mod h1:LSTM5yRnjGZbWNTA/hRwq2gGFrvRIbQJscoIL/u6InY= github.com/libp2p/go-libp2p-yamux v0.1.2/go.mod h1:xUoV/RmYkg6BW/qGxA9XJyg+HzXFYkeXbnhjmnYzKp8= github.com/libp2p/go-libp2p-yamux v0.1.3/go.mod h1:VGSQVrqkh6y4nm0189qqxMtvyBft44MOYYPpYKXiVt4= @@ -1213,8 +1222,9 @@ github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelN github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= -github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= +github.com/libp2p/go-libp2p-yamux v0.8.0 h1:APQYlttIj+Rr5sfa6siojwsi0ZwcIh/exHIUl9hZr6o= +github.com/libp2p/go-libp2p-yamux v0.8.0/go.mod h1:yTkPgN2ib8FHyU1ZcVD7aelzyAqXXwEPbyx+aSKm9h8= github.com/libp2p/go-maddr-filter v0.0.1/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= github.com/libp2p/go-maddr-filter v0.0.5/go.mod h1:Jk+36PMfIqCJhAnaASRH83bdAvfDRp/w6ENFaC9bG+M= @@ -1226,8 +1236,9 @@ github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6 github.com/libp2p/go-mplex v0.1.1/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.1.2/go.mod h1:Xgz2RDCi3co0LeZfgjm4OgUF15+sVR8SRcu3SFXI1lk= github.com/libp2p/go-mplex v0.2.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= -github.com/libp2p/go-mplex v0.3.0 h1:U1T+vmCYJaEoDJPV1aq31N56hS+lJgb397GsylNSgrU= github.com/libp2p/go-mplex v0.3.0/go.mod h1:0Oy/A9PQlwBytDRp4wSkFnzHYDKcpLot35JQ6msjvYQ= +github.com/libp2p/go-mplex v0.4.0 h1:Ukkez9/4EOX5rTw4sHefNJp10dksftAA05ZgyjplUbM= +github.com/libp2p/go-mplex v0.4.0/go.mod h1:y26Lx+wNVtMYMaPu300Cbot5LkEZ4tJaNYeHeT9dh6E= github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.3/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= github.com/libp2p/go-msgio v0.0.4/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= @@ -1242,8 +1253,9 @@ github.com/libp2p/go-nat v0.1.0/go.mod h1:X7teVkwRHNInVNWQiO/tAiAVRwSr5zoRz4YSTC github.com/libp2p/go-netroute v0.1.2/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.3/go.mod h1:jZLDV+1PE8y5XxBySEBgbuVAXbhtuHSdmLPL2n9MKbk= github.com/libp2p/go-netroute v0.1.5/go.mod h1:V1SR3AaECRkEQCoFFzYwVYWvYIEtlxx89+O3qcpCl4A= -github.com/libp2p/go-netroute v0.1.6 h1:ruPJStbYyXVYGQ81uzEDzuvbYRLKRrLvTYd33yomC38= github.com/libp2p/go-netroute v0.1.6/go.mod h1:AqhkMh0VuWmfgtxKPp3Oc1LdU5QSWS7wl0QLhSZqXxQ= +github.com/libp2p/go-netroute v0.2.0 h1:0FpsbsvuSnAhXFnCY0VLFbJOzaK0VnP0r1QT/o4nWRE= +github.com/libp2p/go-netroute v0.2.0/go.mod h1:Vio7LTzZ+6hoT4CMZi5/6CpY3Snzh2vgZhWgxMNwlQI= github.com/libp2p/go-openssl v0.0.2/go.mod h1:v8Zw2ijCSWBQi8Pq5GAixw6DbFfa9u6VIYDXnvOXkc0= github.com/libp2p/go-openssl v0.0.3/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= github.com/libp2p/go-openssl v0.0.4/go.mod h1:unDrJpgy3oFr+rqXsarWifmJuNnJR4chtO1HmaZjggc= @@ -1262,14 +1274,14 @@ github.com/libp2p/go-reuseport-transport v0.1.0 h1:C3PHeHjmnz8m6f0uydObj02tMEoi7 github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v+ujJvYmDQVLowvAjEOmfw= github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= -github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= -github.com/libp2p/go-stream-muxer-multistream v0.3.0 h1:TqnSHPJEIqDEO7h1wZZ0p3DXdvDSiLHQidKKUGZtiOY= github.com/libp2p/go-stream-muxer-multistream v0.3.0/go.mod h1:yDh8abSIzmZtqtOt64gFJUXEryejzNb0lisTt+fAMJA= +github.com/libp2p/go-stream-muxer-multistream v0.4.0 h1:HsM/9OdtqnIzjVXcxTXjmqKrj3gJ8kacaOJwJS1ipaY= +github.com/libp2p/go-stream-muxer-multistream v0.4.0/go.mod h1:nb+dGViZleRP4XcyHuZSVrJCBl55nRBOMmiSL/dyziw= github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19K427vCzQ+xHKH/o= github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= @@ -1277,8 +1289,9 @@ github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcr github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= +github.com/libp2p/go-tcp-transport v0.5.0 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= +github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= github.com/libp2p/go-testutil v0.1.0/go.mod h1:81b2n5HypcVyrCg/MJx4Wgfp/VHojytjVe/gLzZ2Ehc= github.com/libp2p/go-ws-transport v0.0.5/go.mod h1:Qbl4BxPfXXhhd/o0wcrgoaItHqA9tnZjoFZnxykuaXU= @@ -1287,8 +1300,9 @@ github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6 github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= -github.com/libp2p/go-ws-transport v0.5.0 h1:cO6x4P0v6PfxbKnxmf5cY2Ny4OPDGYkUqNvZzp/zdlo= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= +github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= +github.com/libp2p/go-ws-transport v0.6.0/go.mod h1:dXqtI9e2JV9FtF1NOtWVZSKXh5zXvnuwPXfj8GPBbYU= github.com/libp2p/go-yamux v1.2.1/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= github.com/libp2p/go-yamux v1.2.3/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= @@ -1300,8 +1314,9 @@ github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= -github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/go-yamux/v3 v3.0.1 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= +github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1309,8 +1324,9 @@ github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdf github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= -github.com/lucas-clemente/quic-go v0.24.0 h1:ToR7SIIEdrgOhgVTHvPgdVRJfgVy+N0wQAagH7L4d5g= github.com/lucas-clemente/quic-go v0.24.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= +github.com/lucas-clemente/quic-go v0.25.0 h1:K+X9Gvd7JXsOHtU0N2icZ2Nw3rx82uBej3mP4CLgibc= +github.com/lucas-clemente/quic-go v0.25.0/go.mod h1:YtzP8bxRVCBlO77yRanE264+fY/T2U9ZlW1AaHOsMOg= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1337,6 +1353,8 @@ github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZE github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1 h1:EnzzN9fPUkUck/1CuY1FlzBaIYMoiBsdwTNmNGkwUUM= +github.com/marten-seemann/qtls-go1-18 v0.1.0-beta.1/go.mod h1:PUhIQk19LoFt2174H4+an8TYvWOGjb/hHwphBeaDHwI= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1435,8 +1453,9 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= +github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= +github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= @@ -1557,6 +1576,8 @@ github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= +github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= From c394fbdfc3aaf369dc517446a9fd9fac74007b7c Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:52:19 +0200 Subject: [PATCH 10/29] go mod: go-libp2p-resource-manager --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index de4f05fab..21c8ce09b 100644 --- a/go.mod +++ b/go.mod @@ -118,6 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 + github.com/libp2p/go-libp2p-resource-manager v0.1.0 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 From 826cdb2186e49d7f5a48d8ba25a9b820b634a42f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:19:40 +0200 Subject: [PATCH 11/29] use the libp2p connmgr --- node/modules/lp2p/libp2p.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/modules/lp2p/libp2p.go b/node/modules/lp2p/libp2p.go index 5d8ece732..997792d48 100644 --- a/node/modules/lp2p/libp2p.go +++ b/node/modules/lp2p/libp2p.go @@ -10,10 +10,10 @@ import ( logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p" - connmgr "github.com/libp2p/go-libp2p-connmgr" "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peerstore" + "github.com/libp2p/go-libp2p/p2p/net/connmgr" "go.uber.org/fx" ) From 8d3f98fe386f96a3824b0ae7da39a0be463772e0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 14:56:24 +0200 Subject: [PATCH 12/29] instantiate resource manager in DI --- node/builder.go | 6 ++++ node/modules/lp2p/rcmgr.go | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 node/modules/lp2p/rcmgr.go diff --git a/node/builder.go b/node/builder.go index 96d217ec3..6770e8dc8 100644 --- a/node/builder.go +++ b/node/builder.go @@ -15,6 +15,7 @@ import ( logging "github.com/ipfs/go-log/v2" ci "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peerstore" "github.com/libp2p/go-libp2p-core/routing" @@ -68,6 +69,7 @@ var ( BandwidthReporterKey = special{11} // Libp2p option ConnGaterKey = special{12} // libp2p option DAGStoreKey = special{13} // constructor returns multiple values + ResourceManagerKey = special{14} // Libp2p option ) type invoke int @@ -215,6 +217,10 @@ var LibP2P = Options( Override(ConnectionManagerKey, lp2p.ConnectionManager(50, 200, 20*time.Second, nil)), Override(new(*conngater.BasicConnectionGater), lp2p.ConnGater), Override(ConnGaterKey, lp2p.ConnGaterOption), + + // Services (resource management) + Override(new(network.ResourceManager), lp2p.ResourceManager), + Override(ResourceManagerKey, lp2p.ResourceManagerOption), ) func IsType(t repo.RepoType) func(s *Settings) bool { diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go new file mode 100644 index 000000000..a012fc1f4 --- /dev/null +++ b/node/modules/lp2p/rcmgr.go @@ -0,0 +1,66 @@ +package lp2p + +import ( + "errors" + "fmt" + "os" + "path/filepath" + + "go.uber.org/fx" + + "github.com/libp2p/go-libp2p" + "github.com/libp2p/go-libp2p-core/network" + rcmgr "github.com/libp2p/go-libp2p-resource-manager" + + "github.com/filecoin-project/lotus/node/repo" +) + +func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceManager, error) { + var limiter *rcmgr.BasicLimiter + var opts []rcmgr.Option + + repoPath := repo.Path() + + // create limiter -- parse $repo/limits.json if exists + limitsFile := filepath.Join(repoPath, "limits.json") + limitsIn, err := os.Open(limitsFile) + switch { + case err == nil: + defer limitsIn.Close() + limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) + if err != nil { + return nil, fmt.Errorf("error parsing limit file: %w", err) + } + + case errors.Is(err, os.ErrNotExist): + limiter = rcmgr.NewDefaultLimiter() + + default: + return nil, err + } + + // TODO: also set appropriate default limits for lotus protocols + libp2p.SetDefaultServiceLimits(limiter) + + if os.Getenv("LOTUS_DEBUG_RCMGR") != "" { + debugPath := filepath.Join(repoPath, "debug") + if err := os.MkdirAll(debugPath, 0755); err != nil { + return nil, fmt.Errorf("error creating debug directory: %w", err) + } + traceFile := filepath.Join(debugPath, "rcmgr.json.gz") + opts = append(opts, rcmgr.WithTrace(traceFile)) + } + + mgr, err := rcmgr.NewResourceManager(limiter, opts...) + if err != nil { + return nil, fmt.Errorf("error creating resource manager: %w", err) + } + + return mgr, nil +} + +func ResourceManagerOption(mgr network.ResourceManager) Libp2pOpts { + return Libp2pOpts{ + Opts: []libp2p.Option{libp2p.ResourceManager(mgr)}, + } +} From d05d5bcb70a55411cb4cc5bdeb1b7edcecfca617 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 15:38:18 +0200 Subject: [PATCH 13/29] add resource manager NetStat api --- api/api_net.go | 3 ++ api/types.go | 9 ++++ node/impl/net/net.go | 13 +++--- node/impl/net/rcmgr.go | 102 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 node/impl/net/rcmgr.go diff --git a/api/api_net.go b/api/api_net.go index 4cf9ca336..0a389e5ed 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -51,6 +51,9 @@ type Net interface { NetBlockRemove(ctx context.Context, acl NetBlockList) error //perm:admin NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read + // ResourceManager API + NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read } diff --git a/api/types.go b/api/types.go index 81345306d..66fb79850 100644 --- a/api/types.go +++ b/api/types.go @@ -12,6 +12,7 @@ import ( "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" + "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" ma "github.com/multiformats/go-multiaddr" @@ -129,6 +130,14 @@ type NetBlockList struct { IPSubnets []string } +type NetStat struct { + System *network.ScopeStat `json:",omitempty"` + Transient *network.ScopeStat `json:",omitempty"` + Services map[string]network.ScopeStat `json:",omitempty"` + Protocols map[string]network.ScopeStat `json:",omitempty"` + Peers map[string]network.ScopeStat +} + type ExtendedPeerInfo struct { ID peer.ID Agent string diff --git a/node/impl/net/net.go b/node/impl/net/net.go index a1003ffe5..27e7734a1 100644 --- a/node/impl/net/net.go +++ b/node/impl/net/net.go @@ -25,12 +25,13 @@ import ( type NetAPI struct { fx.In - RawHost lp2p.RawHost - Host host.Host - Router lp2p.BaseIpfsRouting - ConnGater *conngater.BasicConnectionGater - Reporter metrics.Reporter - Sk *dtypes.ScoreKeeper + RawHost lp2p.RawHost + Host host.Host + Router lp2p.BaseIpfsRouting + ConnGater *conngater.BasicConnectionGater + ResourceManager network.ResourceManager + Reporter metrics.Reporter + Sk *dtypes.ScoreKeeper } func (a *NetAPI) ID(context.Context) (peer.ID, error) { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go new file mode 100644 index 000000000..2084d3a35 --- /dev/null +++ b/node/impl/net/rcmgr.go @@ -0,0 +1,102 @@ +package net + +import ( + "context" + "strings" + + "golang.org/x/xerrors" + + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" + rcmgr "github.com/libp2p/go-libp2p-resource-manager" + + "github.com/filecoin-project/lotus/api" +) + +func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, err error) { + switch { + case scope == "all": + rapi, ok := a.ResourceManager.(rcmgr.ResourceManagerState) + if !ok { + return result, xerrors.Errorf("rexource manager does not support ResourceManagerState API") + } + + stat := rapi.Stat() + result.System = &stat.System + result.Transient = &stat.Transient + if len(stat.Services) > 0 { + result.Services = stat.Services + } + if len(stat.Protocols) > 0 { + result.Protocols = make(map[string]network.ScopeStat, len(stat.Protocols)) + for proto, stat := range stat.Protocols { + result.Protocols[string(proto)] = stat + } + } + if len(stat.Peers) > 0 { + result.Peers = make(map[string]network.ScopeStat, len(stat.Peers)) + for p, stat := range stat.Peers { + result.Peers[p.Pretty()] = stat + } + } + + return result, nil + + case scope == "system": + err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + stat := s.Stat() + result.System = &stat + return nil + }) + return result, err + + case scope == "transient": + err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + stat := s.Stat() + result.Transient = &stat + return nil + }) + return result, err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + stat := s.Stat() + result.Services = map[string]network.ScopeStat{ + svc: stat, + } + return nil + }) + return result, err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + stat := s.Stat() + result.Protocols = map[string]network.ScopeStat{ + proto: stat, + } + return nil + }) + return result, err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return result, err + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + stat := s.Stat() + result.Peers = map[string]network.ScopeStat{ + p: stat, + } + return nil + }) + return result, err + + default: + return result, xerrors.Errorf("invalid scope %s", scope) + } +} From 554848fe6b2384780b08632c71c304df899a7200 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:15:32 +0200 Subject: [PATCH 14/29] add resource manager Net(Set)Limit api --- api/api_net.go | 4 +- api/types.go | 16 +++- node/impl/net/rcmgr.go | 171 ++++++++++++++++++++++++++++++++++++++++- 3 files changed, 188 insertions(+), 3 deletions(-) diff --git a/api/api_net.go b/api/api_net.go index 0a389e5ed..7dddb09ac 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -52,7 +52,9 @@ type Net interface { NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read // ResourceManager API - NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read + NetLimit(ctx context.Context, scope string) (NetLimit, error) //perm:read + NetSetLimit(ctx context.Context, scope string, limit NetLimit) error //perm:admin // ID returns peerID of libp2p node backing this API ID(context.Context) (peer.ID, error) //perm:read diff --git a/api/types.go b/api/types.go index 66fb79850..c688edf4b 100644 --- a/api/types.go +++ b/api/types.go @@ -135,7 +135,21 @@ type NetStat struct { Transient *network.ScopeStat `json:",omitempty"` Services map[string]network.ScopeStat `json:",omitempty"` Protocols map[string]network.ScopeStat `json:",omitempty"` - Peers map[string]network.ScopeStat + Peers map[string]network.ScopeStat `json:",omitempty"` +} + +type NetLimit struct { + Dynamic bool `json:",omitempty"` + // set if Dynamic is false + Memory int64 `json:",omitempty"` + // set if Dynamic is true + MemoryFraction float64 `json:",omitempty"` + MinMemory int64 `json:",omitempty"` + MaxMemory int64 `json:",omitempty"` + + Streams, StreamsInbound, StreamsOutbound int + Conns, ConnsInbound, ConnsOutbound int + FD int } type ExtendedPeerInfo struct { diff --git a/node/impl/net/rcmgr.go b/node/impl/net/rcmgr.go index 2084d3a35..1b6d57d8e 100644 --- a/node/impl/net/rcmgr.go +++ b/node/impl/net/rcmgr.go @@ -85,7 +85,7 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, p := scope[5:] pid, err := peer.IDFromString(p) if err != nil { - return result, err + return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) } err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { stat := s.Stat() @@ -100,3 +100,172 @@ func (a *NetAPI) NetStat(ctx context.Context, scope string) (result api.NetStat, return result, xerrors.Errorf("invalid scope %s", scope) } } + +func (a *NetAPI) NetLimit(ctx context.Context, scope string) (result api.NetLimit, err error) { + getLimit := func(s network.ResourceScope) error { + limiter, ok := s.(rcmgr.ResourceScopeLimiter) + if !ok { + return xerrors.Errorf("resource scope doesn't implement ResourceScopeLimiter interface") + } + + limit := limiter.Limit() + switch l := limit.(type) { + case *rcmgr.StaticLimit: + result.Memory = l.Memory + result.Streams = l.BaseLimit.Streams + result.StreamsInbound = l.BaseLimit.StreamsInbound + result.StreamsOutbound = l.BaseLimit.StreamsOutbound + result.Conns = l.BaseLimit.Conns + result.ConnsInbound = l.BaseLimit.ConnsInbound + result.ConnsOutbound = l.BaseLimit.ConnsOutbound + result.FD = l.BaseLimit.FD + + case *rcmgr.DynamicLimit: + result.Dynamic = true + result.MemoryFraction = l.MemoryLimit.MemoryFraction + result.MinMemory = l.MemoryLimit.MinMemory + result.MaxMemory = l.MemoryLimit.MaxMemory + result.Streams = l.BaseLimit.Streams + result.StreamsInbound = l.BaseLimit.StreamsInbound + result.StreamsOutbound = l.BaseLimit.StreamsOutbound + result.Conns = l.BaseLimit.Conns + result.ConnsInbound = l.BaseLimit.ConnsInbound + result.ConnsOutbound = l.BaseLimit.ConnsOutbound + result.FD = l.BaseLimit.FD + + default: + return xerrors.Errorf("unknown limit type %T", limit) + } + + return nil + } + + switch { + case scope == "system": + err = a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + return getLimit(s) + }) + return result, err + + case scope == "transient": + err = a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err = a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err = a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + return getLimit(s) + }) + return result, err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return result, xerrors.Errorf("invalid peer ID: %s: %w", p, err) + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + return getLimit(s) + }) + return result, err + + default: + return result, xerrors.Errorf("invalid scope %s", scope) + } +} + +func (a *NetAPI) NetSetLimit(ctx context.Context, scope string, limit api.NetLimit) error { + setLimit := func(s network.ResourceScope) error { + limiter, ok := s.(rcmgr.ResourceScopeLimiter) + if !ok { + return xerrors.Errorf("resource scope doesn't implement ResourceScopeLimiter interface") + } + + var newLimit rcmgr.Limit + if limit.Dynamic { + newLimit = &rcmgr.DynamicLimit{ + MemoryLimit: rcmgr.MemoryLimit{ + MemoryFraction: limit.MemoryFraction, + MinMemory: limit.MinMemory, + MaxMemory: limit.MaxMemory, + }, + BaseLimit: rcmgr.BaseLimit{ + Streams: limit.Streams, + StreamsInbound: limit.StreamsInbound, + StreamsOutbound: limit.StreamsOutbound, + Conns: limit.Conns, + ConnsInbound: limit.ConnsInbound, + ConnsOutbound: limit.ConnsOutbound, + FD: limit.FD, + }, + } + } else { + newLimit = &rcmgr.StaticLimit{ + Memory: limit.Memory, + BaseLimit: rcmgr.BaseLimit{ + Streams: limit.Streams, + StreamsInbound: limit.StreamsInbound, + StreamsOutbound: limit.StreamsOutbound, + Conns: limit.Conns, + ConnsInbound: limit.ConnsInbound, + ConnsOutbound: limit.ConnsOutbound, + FD: limit.FD, + }, + } + } + + limiter.SetLimit(newLimit) + return nil + } + + switch { + case scope == "system": + err := a.ResourceManager.ViewSystem(func(s network.ResourceScope) error { + return setLimit(s) + }) + return err + + case scope == "transient": + err := a.ResourceManager.ViewTransient(func(s network.ResourceScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "svc:"): + svc := scope[4:] + err := a.ResourceManager.ViewService(svc, func(s network.ServiceScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "proto:"): + proto := scope[6:] + err := a.ResourceManager.ViewProtocol(protocol.ID(proto), func(s network.ProtocolScope) error { + return setLimit(s) + }) + return err + + case strings.HasPrefix(scope, "peer:"): + p := scope[5:] + pid, err := peer.IDFromString(p) + if err != nil { + return xerrors.Errorf("invalid peer ID: %s: %w", p, err) + } + err = a.ResourceManager.ViewPeer(pid, func(s network.PeerScope) error { + return setLimit(s) + }) + return err + + default: + return xerrors.Errorf("invalid scope %s", scope) + } +} From 39bf59d37217bd31f6708947717568183dc24882 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:15:49 +0200 Subject: [PATCH 15/29] add examples to docgen --- api/docgen/docgen.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 571599935..1190b0dc4 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -300,6 +300,34 @@ func init() { Error: "", }) addExample(storiface.ResourceTable) + addExample(network.ScopeStat{ + Memory: 123, + NumStreamsInbound: 1, + NumStreamsOutbound: 2, + NumConnsInbound: 3, + NumConnsOutbound: 4, + NumFD: 5, + }) + addExample(map[string]network.ScopeStat{ + "abc": { + Memory: 123, + NumStreamsInbound: 1, + NumStreamsOutbound: 2, + NumConnsInbound: 3, + NumConnsOutbound: 4, + NumFD: 5, + }}) + addExample(api.NetLimit{ + Memory: 123, + StreamsInbound: 1, + StreamsOutbound: 2, + Streams: 3, + ConnsInbound: 3, + ConnsOutbound: 4, + Conns: 4, + FD: 5, + }) + } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { From 0de1566eaff66bbd4574ae9806968dde6c676a5f Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:28:20 +0200 Subject: [PATCH 16/29] add net stat and limit cli --- cli/net.go | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/cli/net.go b/cli/net.go index fdd0a13d6..104b4b40e 100644 --- a/cli/net.go +++ b/cli/net.go @@ -36,6 +36,8 @@ var NetCmd = &cli.Command{ NetReachability, NetBandwidthCmd, NetBlockCmd, + NetStatCmd, + NetLimitCmd, }, } @@ -606,3 +608,86 @@ var NetBlockListCmd = &cli.Command{ return nil }, } + +var NetStatCmd = &cli.Command{ + Name: "stat", + Usage: "report resource stat for a scope", + ArgsUsage: "scope", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + args := cctx.Args().Slice() + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] + + result, err := api.NetStat(ctx, scope) + if err != nil { + return err + } + + enc := json.NewEncoder(os.Stdout) + enc.Encode(result) + + return nil + }, +} + +var NetLimitCmd = &cli.Command{ + Name: "limit", + Usage: "get or set resource limit for a scope", + ArgsUsage: "scope [limit]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "set", + Usage: "set the limit for a scope", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + args := cctx.Args().Slice() + + if cctx.Bool("set") { + if len(args) != 2 { + return xerrors.Errorf("must specify exactly a scope and a limit") + } + scope := args[0] + limitStr := args[1] + + var limit atypes.NetLimit + err := json.Unmarshal([]byte(limitStr), &limit) + if err != nil { + return xerrors.Errorf("error decoding limit: %w", err) + } + + return api.NetSetLimit(ctx, scope, limit) + + } else { + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] + + result, err := api.NetLimit(ctx, scope) + if err != nil { + return err + } + + enc := json.NewEncoder(os.Stdout) + enc.Encode(result) + } + + return nil + }, +} From 62c0f35b5ab2f17b63f90c6a1ed220d3e6e9e7ac Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:57:32 +0200 Subject: [PATCH 17/29] go mod: go-libp2p-resource-manager@v0.1.1 --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 21c8ce09b..57f40cbe5 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.0 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.0 + github.com/libp2p/go-libp2p-resource-manager v0.1.1 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index d81393867..8a6337284 100644 --- a/go.sum +++ b/go.sum @@ -1154,8 +1154,9 @@ github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp1 github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGdsU/9W//C8dqjQDk= github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= -github.com/libp2p/go-libp2p-resource-manager v0.1.0 h1:tYpbhLPVC4egLavupAi9jGKKLeMemyGq5tnfBc8taBs= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= +github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= From aa599bfaf99aca0048e76eb8c742385df74eee60 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 16:57:59 +0200 Subject: [PATCH 18/29] go mod: update go-libp2p-pubsub --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 57f40cbe5..53a3b6737 100644 --- a/go.mod +++ b/go.mod @@ -115,7 +115,7 @@ require ( github.com/libp2p/go-libp2p-kad-dht v0.15.0 github.com/libp2p/go-libp2p-noise v0.3.0 github.com/libp2p/go-libp2p-peerstore v0.6.0 - github.com/libp2p/go-libp2p-pubsub v0.6.0 + github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-resource-manager v0.1.1 diff --git a/go.sum b/go.sum index 8a6337284..3ebc4e062 100644 --- a/go.sum +++ b/go.sum @@ -1138,8 +1138,9 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= +github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= From c3fb68545a7fe8ce572f947907100e46d2d52fdb Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 17:07:56 +0200 Subject: [PATCH 19/29] fix mocknet.New invocation --- itests/kit/ensemble.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index dfd3d8cd7..0227ee81e 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -277,7 +277,7 @@ func (n *Ensemble) Start() *Ensemble { // We haven't been bootstrapped yet, we need to generate genesis and // create the networking backbone. gtempl = n.generateGenesis() - n.mn = mocknet.New(ctx) + n.mn = mocknet.New() } // --------------------- From 0870f48b5caaaa78e505b398ce13962b5ecdbc19 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 17:13:35 +0200 Subject: [PATCH 20/29] fix mocknet.New invocation --- chain/sync_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chain/sync_test.go b/chain/sync_test.go index 2af8aeb54..ae22b251c 100644 --- a/chain/sync_test.go +++ b/chain/sync_test.go @@ -103,7 +103,7 @@ func prepSyncTest(t testing.TB, h int) *syncTestUtil { ctx: ctx, cancel: cancel, - mn: mocknet.New(ctx), + mn: mocknet.New(), g: g, us: filcns.DefaultUpgradeSchedule(), } @@ -157,7 +157,7 @@ func prepSyncTestWithV5Height(t testing.TB, h int, v5height abi.ChainEpoch) *syn ctx: ctx, cancel: cancel, - mn: mocknet.New(ctx), + mn: mocknet.New(), g: g, us: sched, } From 83427c478f5af534e39f92dcc2f378627ce63fef Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 18 Jan 2022 20:00:53 +0200 Subject: [PATCH 21/29] go mod: update go-yamux@v3.0.2 --- go.mod | 1 + go.sum | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 53a3b6737..72f57067c 100644 --- a/go.mod +++ b/go.mod @@ -124,6 +124,7 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 + github.com/libp2p/go-yamux/v3 v3.0.2 // indirect github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 diff --git a/go.sum b/go.sum index 3ebc4e062..ef555cc68 100644 --- a/go.sum +++ b/go.sum @@ -1317,8 +1317,9 @@ github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= -github.com/libp2p/go-yamux/v3 v3.0.1 h1:lIdxHGVZ+y/EHgCrqGNt4Q+Mk9qu26MbOWH/yRw+Ihk= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= +github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= From 6260271b780ad2a7d9cd4d15c5646c843136c54c Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 19 Jan 2022 11:44:45 +0200 Subject: [PATCH 22/29] go mod: update go-libp2p-resource-manager@v0.1.2 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 72f57067c..9d501ed6e 100644 --- a/go.mod +++ b/go.mod @@ -118,7 +118,7 @@ require ( github.com/libp2p/go-libp2p-pubsub v0.6.1 github.com/libp2p/go-libp2p-quic-transport v0.16.0 github.com/libp2p/go-libp2p-record v0.1.3 - github.com/libp2p/go-libp2p-resource-manager v0.1.1 + github.com/libp2p/go-libp2p-resource-manager v0.1.2 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.10.0 github.com/libp2p/go-libp2p-tls v0.3.1 diff --git a/go.sum b/go.sum index ef555cc68..52defb8de 100644 --- a/go.sum +++ b/go.sum @@ -1156,8 +1156,8 @@ github.com/libp2p/go-libp2p-record v0.1.2/go.mod h1:pal0eNcT5nqZaTV7UGhqeGqxFgGd github.com/libp2p/go-libp2p-record v0.1.3 h1:R27hoScIhQf/A8XJZ8lYpnqh9LatJ5YbHs28kCIfql0= github.com/libp2p/go-libp2p-record v0.1.3/go.mod h1:yNUff/adKIfPnYQXgp6FQmNu3gLJ6EMg7+/vv2+9pY4= github.com/libp2p/go-libp2p-resource-manager v0.1.0/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= -github.com/libp2p/go-libp2p-resource-manager v0.1.1 h1:JZ++ezpl2SVP2bj4Z+EPSmrKFS9vQVpkgC28G3DBJcA= -github.com/libp2p/go-libp2p-resource-manager v0.1.1/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= +github.com/libp2p/go-libp2p-resource-manager v0.1.2 h1:t66B/6EF6ivWEUgvO34NKOT3oPtkb+JTBJHdsIMx+mg= +github.com/libp2p/go-libp2p-resource-manager v0.1.2/go.mod h1:wJPNjeE4XQlxeidwqVY5G6DLOKqFK33u2n8blpl0I6Y= github.com/libp2p/go-libp2p-routing v0.0.1/go.mod h1:N51q3yTr4Zdr7V8Jt2JIktVU+3xBBylx1MZeVA6t1Ys= github.com/libp2p/go-libp2p-routing v0.1.0/go.mod h1:zfLhI1RI8RLEzmEaaPwzonRvXeeSHddONWkcTcB54nE= github.com/libp2p/go-libp2p-routing-helpers v0.2.3 h1:xY61alxJ6PurSi+MXbywZpelvuU4U4p/gPTxjqCqTzY= From 19c8ea328808c36d2d7128dd4e45e8d5098914ef Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 19 Jan 2022 13:15:00 +0200 Subject: [PATCH 23/29] add description for net stat and limit commands --- cli/net.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/cli/net.go b/cli/net.go index 104b4b40e..18f21f767 100644 --- a/cli/net.go +++ b/cli/net.go @@ -611,8 +611,18 @@ var NetBlockListCmd = &cli.Command{ var NetStatCmd = &cli.Command{ Name: "stat", - Usage: "report resource stat for a scope", + Usage: "Report resource usage for a scope", ArgsUsage: "scope", + Description: `Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. +`, Action: func(cctx *cli.Context) error { api, closer, err := GetAPI(cctx) if err != nil { @@ -641,8 +651,19 @@ var NetStatCmd = &cli.Command{ var NetLimitCmd = &cli.Command{ Name: "limit", - Usage: "get or set resource limit for a scope", + Usage: "Get or set resource limits for a scope", ArgsUsage: "scope [limit]", + Description: `Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. +`, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "set", From 2e5474e864d0f3ffd323f881946faa1b7c0a707d Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:23:52 +0200 Subject: [PATCH 24/29] update go-fil-markets@v0.19.0-rc1 --- go.mod | 5 ++--- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 9d501ed6e..d7ab367a7 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.13.0 + github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.17.0 + github.com/filecoin-project/go-fil-markets v1.19.0-rc1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -124,7 +124,6 @@ require ( github.com/libp2p/go-libp2p-tls v0.3.1 github.com/libp2p/go-libp2p-yamux v0.8.0 github.com/libp2p/go-maddr-filter v0.1.0 - github.com/libp2p/go-yamux/v3 v3.0.2 // indirect github.com/mattn/go-isatty v0.0.14 github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 diff --git a/go.sum b/go.sum index 52defb8de..44ee930ef 100644 --- a/go.sum +++ b/go.sum @@ -316,8 +316,8 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.13.0 h1:UqjBfacClqAmnzukek1oPxJXDM3l5UI/WX8CRN2/VkM= -github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= +github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= +github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= @@ -327,8 +327,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.17.0 h1:i9U6hZ+peri6Ygfwoda0YBk4bo1SHkd58EPBRgXCRlQ= -github.com/filecoin-project/go-fil-markets v1.17.0/go.mod h1:tKRMkDovSJiUo8yDt6YQM/gHMfNVYya0YTdayGhRnRY= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= +github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From ca4ee1e8cfb202c8f76f63d5b1a6f3aff6ec24e6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:33:38 +0200 Subject: [PATCH 25/29] fix issues with fil-markets/data-transfer updates --- markets/loggers/loggers.go | 1 - 1 file changed, 1 deletion(-) diff --git a/markets/loggers/loggers.go b/markets/loggers/loggers.go index 2d13a64a1..0d542a45d 100644 --- a/markets/loggers/loggers.go +++ b/markets/loggers/loggers.go @@ -40,7 +40,6 @@ func DataTransferLogger(event datatransfer.Event, state datatransfer.ChannelStat "sent", state.Sent(), "received", state.Received(), "queued", state.Queued(), - "received count", state.ReceivedCidsTotal(), "total size", state.TotalSize(), "remote peer", state.OtherPeer(), "event message", event.Message, From b360c9403f12b460081a32ce9c6e06a450f089cb Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:44:01 +0200 Subject: [PATCH 26/29] make gen and friends --- api/mocks/mock_full.go | 44 ++++++++ api/proxy_gen.go | 39 +++++++ api/v0api/v0mocks/mock_full.go | 44 ++++++++ build/openrpc/full.json.gz | Bin 26593 -> 26594 bytes build/openrpc/miner.json.gz | Bin 12787 -> 12784 bytes build/openrpc/worker.json.gz | Bin 3918 -> 3918 bytes documentation/en/api-v0-methods-miner.md | 117 ++++++++++++++++++++ documentation/en/api-v0-methods.md | 117 ++++++++++++++++++++ documentation/en/api-v1-unstable-methods.md | 117 ++++++++++++++++++++ documentation/en/cli-lotus-miner.md | 54 +++++++++ documentation/en/cli-lotus.md | 54 +++++++++ 11 files changed, 586 insertions(+) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 3f9d75433..e985a794d 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1811,6 +1811,21 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } +// NetLimit mocks base method. +func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) + ret0, _ := ret[0].(api.NetLimit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetLimit indicates an expected call of NetLimit. +func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) +} + // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1856,6 +1871,35 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } +// NetSetLimit mocks base method. +func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetSetLimit indicates an expected call of NetSetLimit. +func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) +} + +// NetStat mocks base method. +func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetStat", arg0, arg1) + ret0, _ := ret[0].(api.NetStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetStat indicates an expected call of NetStat. +func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) +} + // NodeStatus mocks base method. func (m *MockFullNode) NodeStatus(arg0 context.Context, arg1 bool) (api.NodeStatus, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 0a644e585..e353a7c6e 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -587,11 +587,17 @@ type NetStruct struct { NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + NetLimit func(p0 context.Context, p1 string) (NetLimit, error) `perm:"read"` + NetPeerInfo func(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) `perm:"read"` NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` NetPubsubScores func(p0 context.Context) ([]PubsubScore, error) `perm:"read"` + + NetSetLimit func(p0 context.Context, p1 string, p2 NetLimit) error `perm:"admin"` + + NetStat func(p0 context.Context, p1 string) (NetStat, error) `perm:"read"` } } @@ -3625,6 +3631,17 @@ func (s *NetStub) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, er return *new(peer.AddrInfo), ErrNotSupported } +func (s *NetStruct) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { + if s.Internal.NetLimit == nil { + return *new(NetLimit), ErrNotSupported + } + return s.Internal.NetLimit(p0, p1) +} + +func (s *NetStub) NetLimit(p0 context.Context, p1 string) (NetLimit, error) { + return *new(NetLimit), ErrNotSupported +} + func (s *NetStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) { if s.Internal.NetPeerInfo == nil { return nil, ErrNotSupported @@ -3658,6 +3675,28 @@ func (s *NetStub) NetPubsubScores(p0 context.Context) ([]PubsubScore, error) { return *new([]PubsubScore), ErrNotSupported } +func (s *NetStruct) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { + if s.Internal.NetSetLimit == nil { + return ErrNotSupported + } + return s.Internal.NetSetLimit(p0, p1, p2) +} + +func (s *NetStub) NetSetLimit(p0 context.Context, p1 string, p2 NetLimit) error { + return ErrNotSupported +} + +func (s *NetStruct) NetStat(p0 context.Context, p1 string) (NetStat, error) { + if s.Internal.NetStat == nil { + return *new(NetStat), ErrNotSupported + } + return s.Internal.NetStat(p0, p1) +} + +func (s *NetStub) NetStat(p0 context.Context, p1 string) (NetStat, error) { + return *new(NetStat), ErrNotSupported +} + func (s *SignableStruct) Sign(p0 context.Context, p1 SignFunc) error { if s.Internal.Sign == nil { return ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 3e9caaee8..26d795940 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -1724,6 +1724,21 @@ func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock. return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) } +// NetLimit mocks base method. +func (m *MockFullNode) NetLimit(arg0 context.Context, arg1 string) (api.NetLimit, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetLimit", arg0, arg1) + ret0, _ := ret[0].(api.NetLimit) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetLimit indicates an expected call of NetLimit. +func (mr *MockFullNodeMockRecorder) NetLimit(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetLimit", reflect.TypeOf((*MockFullNode)(nil).NetLimit), arg0, arg1) +} + // NetPeerInfo mocks base method. func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { m.ctrl.T.Helper() @@ -1769,6 +1784,35 @@ func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Ca return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) } +// NetSetLimit mocks base method. +func (m *MockFullNode) NetSetLimit(arg0 context.Context, arg1 string, arg2 api.NetLimit) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetSetLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetSetLimit indicates an expected call of NetSetLimit. +func (mr *MockFullNodeMockRecorder) NetSetLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetSetLimit", reflect.TypeOf((*MockFullNode)(nil).NetSetLimit), arg0, arg1, arg2) +} + +// NetStat mocks base method. +func (m *MockFullNode) NetStat(arg0 context.Context, arg1 string) (api.NetStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetStat", arg0, arg1) + ret0, _ := ret[0].(api.NetStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetStat indicates an expected call of NetStat. +func (mr *MockFullNodeMockRecorder) NetStat(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetStat", reflect.TypeOf((*MockFullNode)(nil).NetStat), arg0, arg1) +} + // PaychAllocateLane mocks base method. func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 09098bb20aea4965d1b7dfee00017e74b8b64d95..ae8f0b86655688ef335478f8abf47bf58d1ca299 100644 GIT binary patch delta 26289 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 0c3eef45d2660c0ac839ba80b59ab2b2b55f3ab3..2cb9ab35a596996089916305611753f621b0d112 100644 GIT binary patch delta 11037 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 XkF}?#+o%5@00960#&=jp@@@hEg~f4B delta 11037 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 Xm}pN=w@?2+00960RG11s@@@hE83l95 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index b940feca71098909be807a47d9ff170043fd2d9e..d6c6806caadfecc60a2bad43c9b8e54d73222d61 100644 GIT binary patch delta 2594 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 E0Iz`vd;kCd delta 2595 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 F0074&643wv diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 437473f3c..63891c3f2 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -81,9 +81,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Pieces](#Pieces) * [PiecesGetCIDInfo](#PiecesGetCIDInfo) * [PiecesGetPieceInfo](#PiecesGetPieceInfo) @@ -1698,6 +1701,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -1783,6 +1812,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Pieces diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 88c4d8187..883d4d274 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -128,9 +128,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Paych](#Paych) * [PaychAllocateLane](#PaychAllocateLane) * [PaychAvailableFunds](#PaychAvailableFunds) @@ -3821,6 +3824,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -3906,6 +3935,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Paych The Paych methods are for interacting with and managing payment channels diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 7d5f4665e..a5fdd9994 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -134,9 +134,12 @@ * [NetConnectedness](#NetConnectedness) * [NetDisconnect](#NetDisconnect) * [NetFindPeer](#NetFindPeer) + * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) * [NetPubsubScores](#NetPubsubScores) + * [NetSetLimit](#NetSetLimit) + * [NetStat](#NetStat) * [Node](#Node) * [NodeStatus](#NodeStatus) * [Paych](#Paych) @@ -4182,6 +4185,32 @@ Response: } ``` +### NetLimit + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 +} +``` + ### NetPeerInfo @@ -4267,6 +4296,94 @@ Response: ] ``` +### NetSetLimit + + +Perms: admin + +Inputs: +```json +[ + "string value", + { + "Memory": 123, + "Streams": 3, + "StreamsInbound": 1, + "StreamsOutbound": 2, + "Conns": 4, + "ConnsInbound": 3, + "ConnsOutbound": 4, + "FD": 5 + } +] +``` + +Response: `{}` + +### NetStat + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "System": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Transient": { + "NumStreamsInbound": 123, + "NumStreamsOutbound": 123, + "NumConnsInbound": 123, + "NumConnsOutbound": 123, + "NumFD": 123, + "Memory": 9 + }, + "Services": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Protocols": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + }, + "Peers": { + "abc": { + "NumStreamsInbound": 1, + "NumStreamsOutbound": 2, + "NumConnsInbound": 3, + "NumConnsOutbound": 4, + "NumFD": 5, + "Memory": 123 + } + } +} +``` + ## Node These methods are general node management and status commands diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 7ec60a7c4..6543beab7 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1160,6 +1160,8 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -1428,6 +1430,58 @@ OPTIONS: ``` +### lotus-miner net stat +``` +NAME: + lotus-miner net stat - Report resource usage for a scope + +USAGE: + lotus-miner net stat [command options] scope + +DESCRIPTION: + Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. + + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus-miner net limit +``` +NAME: + lotus-miner net limit - Get or set resource limits for a scope + +USAGE: + lotus-miner net limit [command options] scope [limit] + +DESCRIPTION: + Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. + + +OPTIONS: + --set set the limit for a scope (default: false) + --help, -h show help (default: false) + +``` + ## lotus-miner pieces ``` NAME: diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index edf8dfde6..54c0d36df 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2616,6 +2616,8 @@ COMMANDS: reachability Print information about reachability from the internet bandwidth Print bandwidth usage information block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope help, h Shows a list of commands or help for one command OPTIONS: @@ -2884,6 +2886,58 @@ OPTIONS: ``` +### lotus net stat +``` +NAME: + lotus net stat - Report resource usage for a scope + +USAGE: + lotus net stat [command options] scope + +DESCRIPTION: + Report resource usage for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. + + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus net limit +``` +NAME: + lotus net limit - Get or set resource limits for a scope + +USAGE: + lotus net limit [command options] scope [limit] + +DESCRIPTION: + Get or set resource limits for a scope. + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. + + +OPTIONS: + --set set the limit for a scope (default: false) + --help, -h show help (default: false) + +``` + ## lotus sync ``` NAME: From 325a4c0e5b16a50fd2d3b89663e065a9116aeacb Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:46:39 +0200 Subject: [PATCH 27/29] fix lint --- cli/net.go | 30 +++++++++++++----------------- node/modules/lp2p/rcmgr.go | 2 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/cli/net.go b/cli/net.go index 18f21f767..524b0d753 100644 --- a/cli/net.go +++ b/cli/net.go @@ -643,9 +643,7 @@ var NetStatCmd = &cli.Command{ } enc := json.NewEncoder(os.Stdout) - enc.Encode(result) - - return nil + return enc.Encode(result) }, } @@ -694,21 +692,19 @@ var NetLimitCmd = &cli.Command{ return api.NetSetLimit(ctx, scope, limit) - } else { - if len(args) != 1 { - return xerrors.Errorf("must specify exactly one scope") - } - scope := args[0] - - result, err := api.NetLimit(ctx, scope) - if err != nil { - return err - } - - enc := json.NewEncoder(os.Stdout) - enc.Encode(result) } - return nil + if len(args) != 1 { + return xerrors.Errorf("must specify exactly one scope") + } + scope := args[0] + + result, err := api.NetLimit(ctx, scope) + if err != nil { + return err + } + + enc := json.NewEncoder(os.Stdout) + return enc.Encode(result) }, } diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index a012fc1f4..df52b4a4f 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -26,7 +26,7 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan limitsIn, err := os.Open(limitsFile) switch { case err == nil: - defer limitsIn.Close() + defer limitsIn.Close() //nolint:errcheck limiter, err = rcmgr.NewDefaultLimiterFromJSON(limitsIn) if err != nil { return nil, fmt.Errorf("error parsing limit file: %w", err) From 73ec10a49ea6f80b338ada16c16a089f40f645d6 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 20 Jan 2022 11:47:39 +0200 Subject: [PATCH 28/29] close the rcmgr on shutdown --- node/modules/lp2p/rcmgr.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/node/modules/lp2p/rcmgr.go b/node/modules/lp2p/rcmgr.go index df52b4a4f..8b286ff5e 100644 --- a/node/modules/lp2p/rcmgr.go +++ b/node/modules/lp2p/rcmgr.go @@ -1,6 +1,7 @@ package lp2p import ( + "context" "errors" "fmt" "os" @@ -56,6 +57,11 @@ func ResourceManager(lc fx.Lifecycle, repo repo.LockedRepo) (network.ResourceMan return nil, fmt.Errorf("error creating resource manager: %w", err) } + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + return mgr.Close() + }}) + return mgr, nil } From 8a47a71772a412597c34af114ebc36e34a52f72d Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 20 Jan 2022 11:46:17 +0100 Subject: [PATCH 29/29] feat: update to go-fil-markets v1.19.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d7ab367a7..1761efe14 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.0-rc1 + github.com/filecoin-project/go-fil-markets v1.19.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 diff --git a/go.sum b/go.sum index 44ee930ef..5615223b2 100644 --- a/go.sum +++ b/go.sum @@ -327,8 +327,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.0-rc1 h1:T8Ql+Yj9bm0nzn9o43WBrRGxtWj2aYRq2UY7hDaep0I= -github.com/filecoin-project/go-fil-markets v1.19.0-rc1/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= +github.com/filecoin-project/go-fil-markets v1.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= +github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM=