From a647390befb97e8f860bd08c4e08d3cf995217e3 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 19:38:47 +0200 Subject: [PATCH 1/7] build: release: v1.21.0-rc2 build: release: v1.21.0-rc2 --- build/openrpc/full.json.gz | Bin 33808 -> 33808 bytes build/openrpc/gateway.json.gz | Bin 9288 -> 9288 bytes build/openrpc/miner.json.gz | Bin 15860 -> 15860 bytes build/openrpc/worker.json.gz | Bin 5226 -> 5226 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 58de79c43b7c24df2ffb860357390208d5a14c95..901026656e49d7f2f0204da928691823692055c8 100644 GIT binary patch literal 33808 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

?B+ONh|^m347(YW-Gh~h~%Wb%al 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

  • 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 literal 5226 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 diff --git a/build/version.go b/build/version.go index 70be30d80..9a37dc5d8 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.21.0-rc1" +const BuildVersion = "1.21.0-rc2" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index c5a230095..50ee5618a 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.21.0-rc1 + 1.21.0-rc2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index d7496709e..33be6055f 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.21.0-rc1 + 1.21.0-rc2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index ea5ea6ac1..ce6402e7e 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.21.0-rc1 + 1.21.0-rc2 COMMANDS: daemon Start a lotus daemon process From ca1247e0d940311eb4fc24453e3e539f55003632 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 19:50:14 +0200 Subject: [PATCH 2/7] Update go.mod Update go.mod --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a4794c03a..f74501a93 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/filecoin-project/lotus -go 1.18 +go 1.19 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. From d3d5f929857e11c98e3e223de4fcd6b8f6892e35 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 20:11:50 +0200 Subject: [PATCH 3/7] Update changelog for v1.21.0-rc2 Update changelog for v1.21.0-rc2 --- CHANGELOG.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc51fd29b..4dd06ca5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,9 @@ Before upgrading to this feature release read carefully through these bullet poi - Starting from this release, the SplitStore feature is automatically activated on new nodes. However, for existing Lotus users, you need to explicitly configure SplitStore by uncommenting the `EnableSplitstore` option in your `config.toml` file. To enable SplitStore, set `EnableSplitstore=true`, and to disable it, set `EnableSplitstore=false`. **It's important to note that your Lotus node will not start unless this configuration is properly set. Set it to false if you are running a full archival node!** - This feature release requires a **minimum Go version of v1.19.7 or higher to successfully build Lotus**. Additionally, Go version v1.20 and higher is now also supported. - **Storage Providers:** The proofs libraries now have CUDA enabled by default, which requires you to install (CUDA)[https://lotus.filecoin.io/tutorials/lotus-miner/cuda/] if you haven't already done so. If you prefer to use OpenCL on your GPUs instead, you can use the `FFI_USE_OPENCL=1` flag when building from source. On the other hand, if you want to disable GPUs altogether, you can use the `FFI_NO_GPU=1` environment variable when building from source. -- **Exchanges:** Execution traces (returned from `lotus state exec-trace`, `lotus state replay`, etc.), has changed to account for changes introduced by the by the FVM. **Please make sure to read the `Execution trace format change` section carefully, as these are interface breaking changes** +- **Storage Providers:** The `lotus-miner sectors extend` command has been refactored to the functionality of `lotus-miner sectors renew`. The issue where extions did not work has been fixed in this release candidate. +- **Exchanges/Node operators/RPC-providers::** Execution traces (returned from `lotus state exec-trace`, `lotus state replay`, etc.), has changed to account for changes introduced by the by the FVM. **Please make sure to read the `Execution trace format change` section carefully, as these are interface breaking changes** +- **Syncing issues:** If you have been struggling with syncing issues in normal operations you can try to adjust the amount of threads used for more concurrent FMV execution through via the `LOTUS_FVM_CONCURRENCY` enviroment variable. It is set to 4 threads by default. Recommended formula for concurrency == YOUR_RAM/4 , but max is 128. ## Highlights @@ -26,8 +28,10 @@ SplitStore also has some new configuration settings that you can set in your con The SplitStore also has two new commands: -- `lotus chain prune hot` will run an online (badger vlog) garbage collection on the hotstore. -- `lotus chain prune hot-moving` will run an moving garbage collection the hotstore +- `lotus chain prune hot` is a much less resource-intensive GC and is best suited for situations where you don't have the spare disk space for a full GC. +- `lotus chain prune hot-moving` will run a full moving garbage collection of the hotstore. This commands create a new hotstore before deleting the old one so you need working room in the hotstore directory. The current size of a fully GC'd hotstore is around 295 GiB so you need to make sure you have at least that available. + +You can read more about the new SplitStore commands in [the documentation](https://lotus.filecoin.io/lotus/configure/splitstore/#manual-chain-store-garbage-collection). **RPC API improvements** @@ -98,6 +102,10 @@ The `lotus-Miner sector list` is now running in parallel - which should speed up ## Improvements +- backport: fix: miner: correctly count sector extensions (10555) ([filecoin-project/lotus#10555](https://github.com/filecoin-project/lotus/pull/10555)) + - Fixes the issue with sector extensions. +- fix: proving: Initialize slice with with same length as partition (#10574) ([filecoin-project/lotus#10574])(https://github.com/filecoin-project/lotus/pull/10574) + - Fixes an issue where `lotus-miner proving compute window-post` paniced when trying to make skipped sectors human readable. - feat: config: Force existing users to opt into new defaults (#10488) ([filecoin-project/lotus#10488](https://github.com/filecoin-project/lotus/pull/10488)) - Force existing users to opt into the new SplitStore defaults. - fix: splitstore: Demote now common logs (#10516) ([filecoin-project/lotus#10516](https://github.com/filecoin-project/lotus/pull/10516)) @@ -171,6 +179,9 @@ The `lotus-Miner sector list` is now running in parallel - which should speed up - github.com/filecoin-project/go-fil-markets (v1.25.2 -> v1.27.0-rc1): - github.com/filecoin-project/go-jsonrpc (v0.2.1 -> v0.2.3): - github.com/filecoin-project/go-statemachine (v1.0.2 -> v1.0.3): +- github.com/ipfs/go-cid (v0.3.2 -> v0.4.0): +- github.com/ipfs/go-libipfs (v0.5.0 -> v0.7.0): +- github.com/ipfs/go-path (v0.3.0 -> v0.3.1): - deps: update go-libp2p-pubsub to v0.9.3 ([filecoin-project/lotus#10483](https://github.com/filecoin-project/lotus/pull/10483)) - deps: Update go-jsonrpc to v0.2.2 ([filecoin-project/lotus#10395](https://github.com/filecoin-project/lotus/pull/10395)) - Update to go-data-transfer v2 and libp2p, still wip ([filecoin-project/lotus#10382](https://github.com/filecoin-project/lotus/pull/10382)) @@ -178,6 +189,7 @@ The `lotus-Miner sector list` is now running in parallel - which should speed up - chore: node: migrate go-bitswap to go-libipfs/bitswap ([filecoin-project/lotus#10138](https://github.com/filecoin-project/lotus/pull/10138)) - chore: all: bump go-libipfs to replace go-block-format ([filecoin-project/lotus#10126](https://github.com/filecoin-project/lotus/pull/10126)) - chore: market: Upgrade to index-provider 0.10.0 ([filecoin-project/lotus#9981](https://github.com/filecoin-project/lotus/pull/9981)) +- chore: all: bump go-libipfs ([filecoin-project/lotus#10563](https://github.com/filecoin-project/lotus/pull/10563)) ## Others - Update service_developer_bug_report.yml ([filecoin-project/lotus#10321](https://github.com/filecoin-project/lotus/pull/10321)) @@ -207,6 +219,7 @@ The `lotus-Miner sector list` is now running in parallel - which should speed up - chore: update ffi to increase execution parallelism (#10480) ([filecoin-project/lotus#10480](https://github.com/filecoin-project/lotus/pull/10480)) - chore: update the FFI for release (#10435) ([filecoin-project/lotus#10444](https://github.com/filecoin-project/lotus/pull/10444)) - build: bump version to v1.21.0-dev ([filecoin-project/lotus#10249](https://github.com/filecoin-project/lotus/pull/10249)) +- build: docker: Update GO-version (#10591) ([filecoin-project/lotus#10249](https://github.com/filecoin-project/lotus/pull/10591)) - chore: merge release/v1.20.0 into master ([filecoin-project/lotus#10184](https://github.com/filecoin-project/lotus/pull/10184)) - docs: API Gateway: patch documentation note about make gen command ([filecoin-project/lotus#10422](https://github.com/filecoin-project/lotus/pull/10422)) - chore: docs: fix docs typos ([filecoin-project/lotus#10155](https://github.com/filecoin-project/lotus/pull/10155)) From 199a1d9e7551b1eac520e618640746d42a12518a Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 20:30:01 +0200 Subject: [PATCH 4/7] Update Changelog with backports Update Changelog with backports --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dd06ca5f..a34c5d0ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -106,6 +106,8 @@ The `lotus-Miner sector list` is now running in parallel - which should speed up - Fixes the issue with sector extensions. - fix: proving: Initialize slice with with same length as partition (#10574) ([filecoin-project/lotus#10574])(https://github.com/filecoin-project/lotus/pull/10574) - Fixes an issue where `lotus-miner proving compute window-post` paniced when trying to make skipped sectors human readable. +- feat: stmgr: speed up calculation of genesis circ supply (#10553) ([filecoin-project/lotus#10553])(https://github.com/filecoin-project/lotus/pull/10553) +- perf: eth: gas estimate set applyTsMessages false (#10546) ([filecoin-project/lotus#10456](https://github.com/filecoin-project/lotus/pull/10546)) - feat: config: Force existing users to opt into new defaults (#10488) ([filecoin-project/lotus#10488](https://github.com/filecoin-project/lotus/pull/10488)) - Force existing users to opt into the new SplitStore defaults. - fix: splitstore: Demote now common logs (#10516) ([filecoin-project/lotus#10516](https://github.com/filecoin-project/lotus/pull/10516)) From 7a95ed063d3848f9a7c175936a91b25a9c363080 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 20:31:05 +0200 Subject: [PATCH 5/7] Bump version in changelog Bump version in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a34c5d0ad..839304083 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Lotus changelog -# v1.21.0-rc1 / 2023-03-21 +# v1.21.0-rc2 / 2023-03-21 This is an optional but highly recommended feature release of Lotus. It includes numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. From d5a3ddbf7e9cd096daae60f85276f220e3193109 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 29 Mar 2023 20:39:29 +0200 Subject: [PATCH 6/7] Add longer validation time cause to changelog Add longer validation time cause to changelog --- CHANGELOG.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 839304083..7ea39b604 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Lotus changelog -# v1.21.0-rc2 / 2023-03-21 +# v1.21.0-rc2 / 2023-03-29 This is an optional but highly recommended feature release of Lotus. It includes numerous improvements and enhancements for node operators, ETH RPC-providers and storage providers. @@ -13,7 +13,8 @@ Before upgrading to this feature release read carefully through these bullet poi - **Storage Providers:** The proofs libraries now have CUDA enabled by default, which requires you to install (CUDA)[https://lotus.filecoin.io/tutorials/lotus-miner/cuda/] if you haven't already done so. If you prefer to use OpenCL on your GPUs instead, you can use the `FFI_USE_OPENCL=1` flag when building from source. On the other hand, if you want to disable GPUs altogether, you can use the `FFI_NO_GPU=1` environment variable when building from source. - **Storage Providers:** The `lotus-miner sectors extend` command has been refactored to the functionality of `lotus-miner sectors renew`. The issue where extions did not work has been fixed in this release candidate. - **Exchanges/Node operators/RPC-providers::** Execution traces (returned from `lotus state exec-trace`, `lotus state replay`, etc.), has changed to account for changes introduced by the by the FVM. **Please make sure to read the `Execution trace format change` section carefully, as these are interface breaking changes** -- **Syncing issues:** If you have been struggling with syncing issues in normal operations you can try to adjust the amount of threads used for more concurrent FMV execution through via the `LOTUS_FVM_CONCURRENCY` enviroment variable. It is set to 4 threads by default. Recommended formula for concurrency == YOUR_RAM/4 , but max is 128. +- **Syncing issues:** If you have been struggling with syncing issues in normal operations you can try to adjust the amount of threads used for more concurrent FMV execution through via the `LOTUS_FVM_CONCURRENCY` enviroment variable. It is set to 4 threads by default. Recommended formula for concurrency == YOUR_RAM/4 , but max is 128. If you are a Storage Provider and are pushing many messages within a short period of time, exporting `LOTUS_SKIP_APPLY_TS_MESSAGE_CALL_WITH_GAS=1` will also help with keeping in sync. +- **Catching up from a Snapshot:** Users have noticed that catching up sync from a snapshot is taking a lot longer these day. This is largely related to the built-in market actor consuming a lot of computational demand for block validation. A FIP for a short-term mitigation for this is currently in Last Call and will be included network version 19 upgrade if accepted. You [can read the FIP here.](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0060.md) ## Highlights From a724a713daad960b64a44414a90043be31f8840f Mon Sep 17 00:00:00 2001 From: Aayush Date: Wed, 29 Mar 2023 15:24:07 -0400 Subject: [PATCH 7/7] refactor: stop using deprecated io/ioutil --- blockstore/ipfs.go | 4 +-- chain/actors/agen/main.go | 25 ++++++++-------- chain/gen/gen.go | 6 ++-- cli/state.go | 3 +- cli/util/retrieval.go | 3 +- cli/wallet.go | 3 +- cmd/lotus-bench/import.go | 3 +- cmd/lotus-bench/main.go | 9 +++--- cmd/lotus-bench/simple.go | 9 +++--- cmd/lotus-fountain/recaptcha.go | 4 +-- cmd/lotus-miner/init.go | 5 ++-- cmd/lotus-miner/init_restore.go | 3 +- cmd/lotus-miner/storage.go | 3 +- cmd/lotus-pcr/main.go | 5 ++-- cmd/lotus-seed/genesis.go | 29 +++++++++---------- cmd/lotus-seed/main.go | 3 +- cmd/lotus-seed/seed/seed.go | 7 ++--- cmd/lotus-shed/base16.go | 3 +- cmd/lotus-shed/base32.go | 3 +- cmd/lotus-shed/base64.go | 3 +- cmd/lotus-shed/bitfield.go | 3 +- cmd/lotus-shed/fip-0036.go | 4 +-- cmd/lotus-shed/jwt.go | 9 +++--- cmd/lotus-shed/keyinfo.go | 7 ++--- cmd/lotus-shed/rpc.go | 3 +- cmd/lotus-worker/main.go | 3 +- cmd/lotus-worker/storage.go | 3 +- cmd/lotus/daemon.go | 5 ++-- conformance/corpus_test.go | 3 +- conformance/runner.go | 3 +- gen/inline-gen/main.go | 7 ++--- .../deals_partial_retrieval_dm-level_test.go | 5 ++-- itests/kit/client.go | 7 ++--- itests/kit/ensemble.go | 4 +-- itests/kit/node_miner.go | 3 +- itests/kit/node_worker.go | 3 +- lib/backupds/backupds_test.go | 3 +- lib/consensus/raft/config.go | 6 ++-- lib/rpcenc/reader.go | 5 ++-- lib/unixfs/filestore.go | 3 +- lib/unixfs/filestore_test.go | 5 ++-- markets/dagstore/mount_test.go | 9 +++--- node/config/cfgdocgen/gen.go | 3 +- node/config/load.go | 3 +- node/config/load_test.go | 7 ++--- node/config/storage.go | 3 +- node/impl/client/client_test.go | 6 ++-- node/modules/core.go | 3 +- node/modules/testing/genesis.go | 3 +- node/repo/fsrepo.go | 15 +++++----- node/repo/memrepo.go | 5 ++-- storage/paths/http_handler_test.go | 8 ++--- storage/paths/local.go | 5 ++-- storage/paths/local_test.go | 3 +- storage/paths/remote.go | 7 ++--- storage/paths/remote_test.go | 11 ++++--- storage/sealer/ffiwrapper/sealer_cgo.go | 3 +- storage/sealer/ffiwrapper/sealer_test.go | 29 +++++++++---------- storage/sealer/fr32/fr32_ffi_cmp_test.go | 5 ++-- storage/sealer/fr32/fr32_test.go | 5 ++-- storage/sealer/fr32/readers_test.go | 4 +-- storage/sealer/manager_test.go | 5 ++-- storage/sealer/mock/mock.go | 3 +- storage/sealer/piece_provider_test.go | 4 +-- 64 files changed, 161 insertions(+), 215 deletions(-) diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 756314f2d..c7dbb480a 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -3,7 +3,7 @@ package blockstore import ( "bytes" "context" - "io/ioutil" + "io" "github.com/ipfs/go-cid" httpapi "github.com/ipfs/go-ipfs-http-client" @@ -103,7 +103,7 @@ func (i *IPFSBlockstore) Get(ctx context.Context, cid cid.Cid) (blocks.Block, er return nil, xerrors.Errorf("getting ipfs block: %w", err) } - data, err := ioutil.ReadAll(rd) + data, err := io.ReadAll(rd) if err != nil { return nil, err } diff --git a/chain/actors/agen/main.go b/chain/actors/agen/main.go index b9f3a22a4..811ea27e9 100644 --- a/chain/actors/agen/main.go +++ b/chain/actors/agen/main.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "go/format" - "io/ioutil" "os" "path/filepath" "strconv" @@ -66,7 +65,7 @@ func generateAdapters() error { } { - af, err := ioutil.ReadFile(filepath.Join(actDir, "actor.go.template")) + af, err := os.ReadFile(filepath.Join(actDir, "actor.go.template")) if err != nil { return xerrors.Errorf("loading actor template: %w", err) } @@ -90,7 +89,7 @@ func generateAdapters() error { return err } - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("%s.go", act)), fmted, 0666); err != nil { + if err := os.WriteFile(filepath.Join(actDir, fmt.Sprintf("%s.go", act)), fmted, 0666); err != nil { return err } } @@ -100,7 +99,7 @@ func generateAdapters() error { } func generateState(actDir string, versions []int) error { - af, err := ioutil.ReadFile(filepath.Join(actDir, "state.go.template")) + af, err := os.ReadFile(filepath.Join(actDir, "state.go.template")) if err != nil { if os.IsNotExist(err) { return nil // skip @@ -123,7 +122,7 @@ func generateState(actDir string, versions []int) error { return err } - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("v%d.go", version)), b.Bytes(), 0666); err != nil { + if err := os.WriteFile(filepath.Join(actDir, fmt.Sprintf("v%d.go", version)), b.Bytes(), 0666); err != nil { return err } } @@ -132,7 +131,7 @@ func generateState(actDir string, versions []int) error { } func generateMessages(actDir string) error { - af, err := ioutil.ReadFile(filepath.Join(actDir, "message.go.template")) + af, err := os.ReadFile(filepath.Join(actDir, "message.go.template")) if err != nil { if os.IsNotExist(err) { return nil // skip @@ -155,7 +154,7 @@ func generateMessages(actDir string) error { return err } - if err := ioutil.WriteFile(filepath.Join(actDir, fmt.Sprintf("message%d.go", version)), b.Bytes(), 0666); err != nil { + if err := os.WriteFile(filepath.Join(actDir, fmt.Sprintf("message%d.go", version)), b.Bytes(), 0666); err != nil { return err } } @@ -165,7 +164,7 @@ func generateMessages(actDir string) error { func generatePolicy(policyPath string) error { - pf, err := ioutil.ReadFile(policyPath + ".template") + pf, err := os.ReadFile(policyPath + ".template") if err != nil { if os.IsNotExist(err) { return nil // skip @@ -187,7 +186,7 @@ func generatePolicy(policyPath string) error { return err } - if err := ioutil.WriteFile(policyPath, b.Bytes(), 0666); err != nil { + if err := os.WriteFile(policyPath, b.Bytes(), 0666); err != nil { return err } @@ -196,7 +195,7 @@ func generatePolicy(policyPath string) error { func generateBuiltin(builtinPath string) error { - bf, err := ioutil.ReadFile(builtinPath + ".template") + bf, err := os.ReadFile(builtinPath + ".template") if err != nil { if os.IsNotExist(err) { return nil // skip @@ -218,7 +217,7 @@ func generateBuiltin(builtinPath string) error { return err } - if err := ioutil.WriteFile(builtinPath, b.Bytes(), 0666); err != nil { + if err := os.WriteFile(builtinPath, b.Bytes(), 0666); err != nil { return err } @@ -227,7 +226,7 @@ func generateBuiltin(builtinPath string) error { func generateRegistry(registryPath string) error { - bf, err := ioutil.ReadFile(registryPath + ".template") + bf, err := os.ReadFile(registryPath + ".template") if err != nil { if os.IsNotExist(err) { return nil // skip @@ -248,7 +247,7 @@ func generateRegistry(registryPath string) error { return err } - if err := ioutil.WriteFile(registryPath, b.Bytes(), 0666); err != nil { + if err := os.WriteFile(registryPath, b.Bytes(), 0666); err != nil { return err } diff --git a/chain/gen/gen.go b/chain/gen/gen.go index de2df97c2..8e3c41a89 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -5,7 +5,7 @@ import ( "context" "fmt" "io" - "io/ioutil" + "os" "sync/atomic" "time" @@ -167,7 +167,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS maddr1 := genesis2.MinerAddress(0) - m1temp, err := ioutil.TempDir("", "preseal") + m1temp, err := os.MkdirTemp("", "preseal") if err != nil { return nil, err } @@ -179,7 +179,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS maddr2 := genesis2.MinerAddress(1) - m2temp, err := ioutil.TempDir("", "preseal") + m2temp, err := os.MkdirTemp("", "preseal") if err != nil { return nil, err } diff --git a/cli/state.go b/cli/state.go index c039cb80a..3099bff17 100644 --- a/cli/state.go +++ b/cli/state.go @@ -9,7 +9,6 @@ import ( "fmt" "html/template" "io" - "io/ioutil" "os" "reflect" "sort" @@ -1090,7 +1089,7 @@ var StateComputeStateCmd = &cli.Command{ var stout *lapi.ComputeStateOutput if csofile := cctx.String("compute-state-output"); csofile != "" { - data, err := ioutil.ReadFile(csofile) + data, err := os.ReadFile(csofile) if err != nil { return err } diff --git a/cli/util/retrieval.go b/cli/util/retrieval.go index 3a2ef6077..ac34fcf3a 100644 --- a/cli/util/retrieval.go +++ b/cli/util/retrieval.go @@ -4,7 +4,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "path" @@ -65,7 +64,7 @@ func ClientExportStream(apiAddr string, apiAuth http.Header, eref api.ExportRef, } if resp.StatusCode != http.StatusOK { - em, err := ioutil.ReadAll(resp.Body) + em, err := io.ReadAll(resp.Body) if err != nil { return nil, xerrors.Errorf("reading error body: %w", err) } diff --git a/cli/wallet.go b/cli/wallet.go index a936efa94..c66275cdd 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -6,7 +6,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io/ioutil" "os" "strings" @@ -337,7 +336,7 @@ var walletImport = &cli.Command{ inpdata = indata } else { - fdata, err := ioutil.ReadFile(cctx.Args().First()) + fdata, err := os.ReadFile(cctx.Args().First()) if err != nil { return err } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 51c567d90..babf9342b 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "math" "net/http" _ "net/http/pprof" @@ -158,7 +157,7 @@ var importBenchCmd = &cli.Command{ if rdir := cctx.String("repodir"); rdir != "" { tdir = rdir } else { - tmp, err := ioutil.TempDir("", "lotus-import-bench") + tmp, err := os.MkdirTemp("", "lotus-import-bench") if err != nil { return err } diff --git a/cmd/lotus-bench/main.go b/cmd/lotus-bench/main.go index 279f2d5fd..43972b187 100644 --- a/cmd/lotus-bench/main.go +++ b/cmd/lotus-bench/main.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "math/big" "math/rand" "os" @@ -197,7 +196,7 @@ var sealBenchCmd = &cli.Command{ return xerrors.Errorf("creating sectorbuilder dir: %w", err) } - tsdir, err := ioutil.TempDir(sdir, "bench") + tsdir, err := os.MkdirTemp(sdir, "bench") if err != nil { return err } @@ -287,7 +286,7 @@ var sealBenchCmd = &cli.Command{ // sectorbuilder directory... we need a better way to handle // this in other cases - fdata, err := ioutil.ReadFile(filepath.Join(sbdir, "pre-seal-"+maddr.String()+".json")) + fdata, err := os.ReadFile(filepath.Join(sbdir, "pre-seal-"+maddr.String()+".json")) if err != nil { return err } @@ -637,7 +636,7 @@ func runSeals(sb *ffiwrapper.Sealer, sbfs *basicfs.Provider, numSectors int, par return err } - if err := ioutil.WriteFile(saveC2inp, b, 0664); err != nil { + if err := os.WriteFile(saveC2inp, b, 0664); err != nil { log.Warnf("%+v", err) } } @@ -751,7 +750,7 @@ var proveCmd = &cli.Command{ return xerrors.Errorf("Usage: lotus-bench prove [input.json]") } - inb, err := ioutil.ReadFile(c.Args().First()) + inb, err := os.ReadFile(c.Args().First()) if err != nil { return xerrors.Errorf("reading input file: %w", err) } diff --git a/cmd/lotus-bench/simple.go b/cmd/lotus-bench/simple.go index 87e2c3bc0..a742b0fb3 100644 --- a/cmd/lotus-bench/simple.go +++ b/cmd/lotus-bench/simple.go @@ -5,7 +5,6 @@ import ( "encoding/base64" "encoding/json" "fmt" - "io/ioutil" "os" "strconv" "time" @@ -444,7 +443,7 @@ var simpleCommit1 = &cli.Command{ return err } - if err := ioutil.WriteFile(cctx.Args().Get(4), b, 0664); err != nil { + if err := os.WriteFile(cctx.Args().Get(4), b, 0664); err != nil { log.Warnf("%+v", err) } @@ -478,7 +477,7 @@ var simpleCommit2 = &cli.Command{ return xerrors.Errorf("Usage: lotus-bench prove [input.json]") } - inb, err := ioutil.ReadFile(c.Args().First()) + inb, err := os.ReadFile(c.Args().First()) if err != nil { return xerrors.Errorf("reading input file: %w", err) } @@ -861,7 +860,7 @@ var simpleProveReplicaUpdate1 = &cli.Command{ return xerrors.Errorf("json marshal vanilla proofs: %w", err) } - if err := ioutil.WriteFile(cctx.Args().Get(7), vpjb, 0666); err != nil { + if err := os.WriteFile(cctx.Args().Get(7), vpjb, 0666); err != nil { return xerrors.Errorf("writing vanilla proofs file: %w", err) } @@ -934,7 +933,7 @@ var simpleProveReplicaUpdate2 = &cli.Command{ return xerrors.Errorf("parse commr: %w", err) } - vpb, err := ioutil.ReadFile(cctx.Args().Get(3)) + vpb, err := os.ReadFile(cctx.Args().Get(3)) if err != nil { return xerrors.Errorf("reading valilla proof file: %w", err) } diff --git a/cmd/lotus-fountain/recaptcha.go b/cmd/lotus-fountain/recaptcha.go index 69359faa3..6b2327a03 100644 --- a/cmd/lotus-fountain/recaptcha.go +++ b/cmd/lotus-fountain/recaptcha.go @@ -6,7 +6,7 @@ package main import ( "encoding/json" - "io/ioutil" + "io" "net/http" "net/url" "os" @@ -63,7 +63,7 @@ func VerifyToken(token, remoteIP string) (Response, error) { return resp, err } - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) _ = r.Body.Close() // close immediately after reading finished if err != nil { return resp, err diff --git a/cmd/lotus-miner/init.go b/cmd/lotus-miner/init.go index 66a6691af..e752839ec 100644 --- a/cmd/lotus-miner/init.go +++ b/cmd/lotus-miner/init.go @@ -7,7 +7,6 @@ import ( "encoding/binary" "encoding/json" "fmt" - "io/ioutil" "net/http" "os" "path/filepath" @@ -246,7 +245,7 @@ var initCmd = &cli.Command{ return xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil { return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err) } @@ -292,7 +291,7 @@ func migratePreSealMeta(ctx context.Context, api v1api.FullNode, metadata string return xerrors.Errorf("expanding preseal dir: %w", err) } - b, err := ioutil.ReadFile(metadata) + b, err := os.ReadFile(metadata) if err != nil { return xerrors.Errorf("reading preseal metadata: %w", err) } diff --git a/cmd/lotus-miner/init_restore.go b/cmd/lotus-miner/init_restore.go index f3ab9d04a..7e28729bb 100644 --- a/cmd/lotus-miner/init_restore.go +++ b/cmd/lotus-miner/init_restore.go @@ -3,7 +3,6 @@ package main import ( "context" "encoding/json" - "io/ioutil" "os" "github.com/docker/go-units" @@ -59,7 +58,7 @@ var restoreCmd = &cli.Command{ return xerrors.Errorf("expanding storage config path: %w", err) } - cfb, err := ioutil.ReadFile(cf) + cfb, err := os.ReadFile(cf) if err != nil { return xerrors.Errorf("reading storage config: %w", err) } diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index a5aa354f8..89353497d 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "math/bits" "os" "path/filepath" @@ -167,7 +166,7 @@ over time return xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(p, metaFile), b, 0644); err != nil { return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(p, metaFile), err) } } diff --git a/cmd/lotus-pcr/main.go b/cmd/lotus-pcr/main.go index 57eaf0ad6..199810e03 100644 --- a/cmd/lotus-pcr/main.go +++ b/cmd/lotus-pcr/main.go @@ -7,7 +7,6 @@ import ( "encoding/csv" "fmt" "io" - "io/ioutil" "net/http" _ "net/http/pprof" "os" @@ -759,7 +758,7 @@ func (r *refunder) EnsureMinerMinimums(ctx context.Context, tipset *types.TipSet return nil, err } - w := ioutil.Discard + w := io.Discard if len(output) != 0 { f, err := os.Create(output) if err != nil { @@ -1299,7 +1298,7 @@ func loadChainEpoch(fn string) (abi.ChainEpoch, error) { err = f.Close() }() - raw, err := ioutil.ReadAll(f) + raw, err := io.ReadAll(f) if err != nil { return 0, err } diff --git a/cmd/lotus-seed/genesis.go b/cmd/lotus-seed/genesis.go index 1ab6a465a..9fdce456b 100644 --- a/cmd/lotus-seed/genesis.go +++ b/cmd/lotus-seed/genesis.go @@ -4,7 +4,6 @@ import ( "encoding/csv" "encoding/json" "fmt" - "io/ioutil" "os" "strconv" "strings" @@ -80,7 +79,7 @@ var genesisNewCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, genb, 0644); err != nil { + if err := os.WriteFile(genf, genb, 0644); err != nil { return err } @@ -103,7 +102,7 @@ var genesisAddMinerCmd = &cli.Command{ } var template genesis.Template - genb, err := ioutil.ReadFile(genf) + genb, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -117,7 +116,7 @@ var genesisAddMinerCmd = &cli.Command{ return xerrors.Errorf("expand preseal file path: %w", err) } miners := map[string]genesis.Miner{} - minb, err := ioutil.ReadFile(minf) + minb, err := os.ReadFile(minf) if err != nil { return xerrors.Errorf("read preseal file: %w", err) } @@ -156,7 +155,7 @@ var genesisAddMinerCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, genb, 0644); err != nil { + if err := os.WriteFile(genf, genb, 0644); err != nil { return err } @@ -196,7 +195,7 @@ var genesisAddMsigsCmd = &cli.Command{ } var template genesis.Template - b, err := ioutil.ReadFile(genf) + b, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -237,7 +236,7 @@ var genesisAddMsigsCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, b, 0644); err != nil { + if err := os.WriteFile(genf, b, 0644); err != nil { return err } return nil @@ -339,7 +338,7 @@ var genesisSetVRKCmd = &cli.Command{ } var template genesis.Template - b, err := ioutil.ReadFile(genf) + b, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -404,7 +403,7 @@ var genesisSetVRKCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, b, 0644); err != nil { + if err := os.WriteFile(genf, b, 0644); err != nil { return err } return nil @@ -435,7 +434,7 @@ var genesisSetRemainderCmd = &cli.Command{ } var template genesis.Template - b, err := ioutil.ReadFile(genf) + b, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -500,7 +499,7 @@ var genesisSetRemainderCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, b, 0644); err != nil { + if err := os.WriteFile(genf, b, 0644); err != nil { return err } return nil @@ -529,7 +528,7 @@ var genesisSetActorVersionCmd = &cli.Command{ } var template genesis.Template - b, err := ioutil.ReadFile(genf) + b, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -550,7 +549,7 @@ var genesisSetActorVersionCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, b, 0644); err != nil { + if err := os.WriteFile(genf, b, 0644); err != nil { return err } return nil @@ -607,7 +606,7 @@ var genesisSetVRKSignersCmd = &cli.Command{ } var template genesis.Template - b, err := ioutil.ReadFile(genf) + b, err := os.ReadFile(genf) if err != nil { return xerrors.Errorf("read genesis template: %w", err) } @@ -662,7 +661,7 @@ var genesisSetVRKSignersCmd = &cli.Command{ return err } - if err := ioutil.WriteFile(genf, b, 0644); err != nil { + if err := os.WriteFile(genf, b, 0644); err != nil { return err } return nil diff --git a/cmd/lotus-seed/main.go b/cmd/lotus-seed/main.go index 7567f6393..863a508f2 100644 --- a/cmd/lotus-seed/main.go +++ b/cmd/lotus-seed/main.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io/ioutil" "os" "github.com/docker/go-units" @@ -114,7 +113,7 @@ var preSealCmd = &cli.Command{ var k *types.KeyInfo if c.String("key") != "" { k = new(types.KeyInfo) - kh, err := ioutil.ReadFile(c.String("key")) + kh, err := os.ReadFile(c.String("key")) if err != nil { return err } diff --git a/cmd/lotus-seed/seed/seed.go b/cmd/lotus-seed/seed/seed.go index b98673712..48f00f8a6 100644 --- a/cmd/lotus-seed/seed/seed.go +++ b/cmd/lotus-seed/seed/seed.go @@ -6,7 +6,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" @@ -135,7 +134,7 @@ func PreSeal(maddr address.Address, spt abi.RegisteredSealProof, offset abi.Sect return nil, nil, xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(filepath.Join(sbroot, "sectorstore.json"), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(sbroot, "sectorstore.json"), b, 0644); err != nil { return nil, nil, xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(sbroot, "storage.json"), err) } } @@ -228,7 +227,7 @@ func WriteGenesisMiner(maddr address.Address, sbroot string, gm *genesis.Miner, log.Infof("Writing preseal manifest to %s", filepath.Join(sbroot, "pre-seal-"+maddr.String()+".json")) - if err := ioutil.WriteFile(filepath.Join(sbroot, "pre-seal-"+maddr.String()+".json"), out, 0664); err != nil { + if err := os.WriteFile(filepath.Join(sbroot, "pre-seal-"+maddr.String()+".json"), out, 0664); err != nil { return err } @@ -239,7 +238,7 @@ func WriteGenesisMiner(maddr address.Address, sbroot string, gm *genesis.Miner, } // TODO: allow providing key - if err := ioutil.WriteFile(filepath.Join(sbroot, "pre-seal-"+maddr.String()+".key"), []byte(hex.EncodeToString(b)), 0664); err != nil { + if err := os.WriteFile(filepath.Join(sbroot, "pre-seal-"+maddr.String()+".key"), []byte(hex.EncodeToString(b)), 0664); err != nil { return err } } diff --git a/cmd/lotus-shed/base16.go b/cmd/lotus-shed/base16.go index a5d384815..28ea4916f 100644 --- a/cmd/lotus-shed/base16.go +++ b/cmd/lotus-shed/base16.go @@ -4,7 +4,6 @@ import ( "encoding/hex" "fmt" "io" - "io/ioutil" "os" "strings" @@ -30,7 +29,7 @@ var base16Cmd = &cli.Command{ input = strings.NewReader(cctx.Args().First()) } - bytes, err := ioutil.ReadAll(input) + bytes, err := io.ReadAll(input) if err != nil { return nil } diff --git a/cmd/lotus-shed/base32.go b/cmd/lotus-shed/base32.go index 66e180ddc..d2ea3dd7a 100644 --- a/cmd/lotus-shed/base32.go +++ b/cmd/lotus-shed/base32.go @@ -3,7 +3,6 @@ package main import ( "fmt" "io" - "io/ioutil" "os" "strings" @@ -30,7 +29,7 @@ var base32Cmd = &cli.Command{ input = strings.NewReader(cctx.Args().First()) } - bytes, err := ioutil.ReadAll(input) + bytes, err := io.ReadAll(input) if err != nil { return nil } diff --git a/cmd/lotus-shed/base64.go b/cmd/lotus-shed/base64.go index cacc60152..19afa6613 100644 --- a/cmd/lotus-shed/base64.go +++ b/cmd/lotus-shed/base64.go @@ -4,7 +4,6 @@ import ( "encoding/base64" "fmt" "io" - "io/ioutil" "os" "strings" @@ -38,7 +37,7 @@ var base64Cmd = &cli.Command{ input = strings.NewReader(cctx.Args().First()) } - bytes, err := ioutil.ReadAll(input) + bytes, err := io.ReadAll(input) if err != nil { return nil } diff --git a/cmd/lotus-shed/bitfield.go b/cmd/lotus-shed/bitfield.go index f0824de4f..5ac75b2c6 100644 --- a/cmd/lotus-shed/bitfield.go +++ b/cmd/lotus-shed/bitfield.go @@ -5,7 +5,6 @@ import ( "encoding/hex" "fmt" "io" - "io/ioutil" "os" "github.com/urfave/cli/v2" @@ -318,7 +317,7 @@ func decodeToByte(cctx *cli.Context, i int) ([]byte, error) { if i > 0 { return nil, xerrors.Errorf("need more than %d args", i) } - r, err := ioutil.ReadAll(os.Stdin) + r, err := io.ReadAll(os.Stdin) if err != nil { return nil, err } diff --git a/cmd/lotus-shed/fip-0036.go b/cmd/lotus-shed/fip-0036.go index 485302b9b..4c8456c04 100644 --- a/cmd/lotus-shed/fip-0036.go +++ b/cmd/lotus-shed/fip-0036.go @@ -5,7 +5,7 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" + "os" "sort" "strconv" @@ -537,7 +537,7 @@ var finalResultCmd = &cli.Command{ // Returns voted sorted by votes from earliest to latest func getVotesMap(file string) ([]Vote, error) { var votes []Vote - vb, err := ioutil.ReadFile(file) + vb, err := os.ReadFile(file) if err != nil { return nil, xerrors.Errorf("read vote: %w", err) } diff --git a/cmd/lotus-shed/jwt.go b/cmd/lotus-shed/jwt.go index e8853b419..2a24c2569 100644 --- a/cmd/lotus-shed/jwt.go +++ b/cmd/lotus-shed/jwt.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "strings" @@ -81,7 +80,7 @@ var jwtTokenCmd = &cli.Command{ defer inputFile.Close() //nolint:errcheck input := bufio.NewReader(inputFile) - encoded, err := ioutil.ReadAll(input) + encoded, err := io.ReadAll(input) if err != nil { return err } @@ -123,7 +122,7 @@ var jwtTokenCmd = &cli.Command{ return err } - return ioutil.WriteFile(cctx.String("output"), token, 0600) + return os.WriteFile(cctx.String("output"), token, 0600) }, } @@ -142,7 +141,7 @@ var jwtNewCmd = &cli.Command{ keyName := cctx.Args().First() - sk, err := ioutil.ReadAll(io.LimitReader(rand.Reader, 32)) + sk, err := io.ReadAll(io.LimitReader(rand.Reader, 32)) if err != nil { return err } @@ -184,6 +183,6 @@ var jwtNewCmd = &cli.Command{ } filenameToken := fmt.Sprintf("jwt-%s.token", keyName) - return ioutil.WriteFile(filenameToken, token, 0600) + return os.WriteFile(filenameToken, token, 0600) }, } diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go index 38f5ee6fe..15b584f3d 100644 --- a/cmd/lotus-shed/keyinfo.go +++ b/cmd/lotus-shed/keyinfo.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path" "strings" @@ -68,7 +67,7 @@ var keyinfoVerifyCmd = &cli.Command{ defer inputFile.Close() //nolint:errcheck input := bufio.NewReader(inputFile) - keyContent, err := ioutil.ReadAll(input) + keyContent, err := io.ReadAll(input) if err != nil { return err } @@ -162,7 +161,7 @@ var keyinfoImportCmd = &cli.Command{ input = bufio.NewReader(inputFile) } - encoded, err := ioutil.ReadAll(input) + encoded, err := io.ReadAll(input) if err != nil { return err } @@ -274,7 +273,7 @@ var keyinfoInfoCmd = &cli.Command{ input = bufio.NewReader(inputFile) } - encoded, err := ioutil.ReadAll(input) + encoded, err := io.ReadAll(input) if err != nil { return err } diff --git a/cmd/lotus-shed/rpc.go b/cmd/lotus-shed/rpc.go index 3be269358..8ef799129 100644 --- a/cmd/lotus-shed/rpc.go +++ b/cmd/lotus-shed/rpc.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "os" @@ -97,7 +96,7 @@ var rpcCmd = &cli.Command{ return err } - rb, err := ioutil.ReadAll(resp.Body) + rb, err := io.ReadAll(resp.Body) if err != nil { return err } diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 42f46c9d8..e0a931274 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net" "net/http" "os" @@ -464,7 +463,7 @@ var runCmd = &cli.Command{ return xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil { return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err) } diff --git a/cmd/lotus-worker/storage.go b/cmd/lotus-worker/storage.go index 6b5994c17..9e4bf1c9b 100644 --- a/cmd/lotus-worker/storage.go +++ b/cmd/lotus-worker/storage.go @@ -2,7 +2,6 @@ package main import ( "encoding/json" - "io/ioutil" "os" "path/filepath" @@ -121,7 +120,7 @@ var storageAttachCmd = &cli.Command{ return xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(p, metaFile), b, 0644); err != nil { return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(p, metaFile), err) } } diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index b3341bd79..3803c0f5d 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -10,7 +10,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "os" "runtime/pprof" @@ -244,7 +243,7 @@ var DaemonCmd = &cli.Command{ var genBytes []byte if cctx.String("genesis") != "" { - genBytes, err = ioutil.ReadFile(cctx.String("genesis")) + genBytes, err = os.ReadFile(cctx.String("genesis")) if err != nil { return xerrors.Errorf("reading genesis: %w", err) } @@ -400,7 +399,7 @@ func importKey(ctx context.Context, api lapi.FullNode, f string) error { return err } - hexdata, err := ioutil.ReadFile(f) + hexdata, err := os.ReadFile(f) if err != nil { return err } diff --git a/conformance/corpus_test.go b/conformance/corpus_test.go index adbebbcc7..ec9f9d516 100644 --- a/conformance/corpus_test.go +++ b/conformance/corpus_test.go @@ -5,7 +5,6 @@ package conformance import ( "encoding/json" - "io/ioutil" "os" "path/filepath" "strings" @@ -107,7 +106,7 @@ func TestConformance(t *testing.T) { // Run a test for each vector. for _, v := range vectors { path := filepath.Join(corpusRoot, v) - raw, err := ioutil.ReadFile(path) + raw, err := os.ReadFile(path) if err != nil { t.Fatalf("failed to read test raw file: %s", path) } diff --git a/conformance/runner.go b/conformance/runner.go index ff738a4a5..827c10a5c 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -6,7 +6,6 @@ import ( "context" "encoding/base64" "fmt" - "io/ioutil" "math" "os" "os/exec" @@ -328,7 +327,7 @@ func dumpThreeWayStateDiff(r Reporter, vector *schema.TestVector, bs blockstore. // writeStateToTempCAR writes the provided roots to a temporary CAR that'll be // cleaned up via t.Cleanup(). It returns the full path of the temp file. func writeStateToTempCAR(bs blockstore.Blockstore, roots ...cid.Cid) (string, error) { - tmp, err := ioutil.TempFile("", "lotus-tests-*.car") + tmp, err := os.CreateTemp("", "lotus-tests-*.car") if err != nil { return "", fmt.Errorf("failed to create temp file to dump CAR for diffing: %w", err) } diff --git a/gen/inline-gen/main.go b/gen/inline-gen/main.go index d97134cdd..4e55816f6 100644 --- a/gen/inline-gen/main.go +++ b/gen/inline-gen/main.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io/fs" - "io/ioutil" "os" "path/filepath" "strings" @@ -19,7 +18,7 @@ const ( ) func main() { - db, err := ioutil.ReadFile(os.Args[2]) + db, err := os.ReadFile(os.Args[2]) if err != nil { panic(err) } @@ -38,7 +37,7 @@ func main() { if filepath.Ext(path) != ".go" { return nil } - fb, err := ioutil.ReadFile(path) + fb, err := os.ReadFile(path) if err != nil { return err } @@ -110,7 +109,7 @@ func main() { if rewrite { fmt.Printf("write %s\n", path) - if err := ioutil.WriteFile(path, []byte(strings.Join(outLines, "\n")), 0664); err != nil { + if err := os.WriteFile(path, []byte(strings.Join(outLines, "\n")), 0664); err != nil { return err } } diff --git a/itests/deals_partial_retrieval_dm-level_test.go b/itests/deals_partial_retrieval_dm-level_test.go index 156ed67fe..e3414c191 100644 --- a/itests/deals_partial_retrieval_dm-level_test.go +++ b/itests/deals_partial_retrieval_dm-level_test.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "os" "testing" "time" @@ -196,7 +195,7 @@ func validateDMUnixFile(r io.Reader) error { } func testDMExportAsCar(ctx context.Context, client *kit.TestFullNode, expDirective api.ExportRef, tempDir string) error { - out, err := ioutil.TempFile(tempDir, "exp-test") + out, err := os.CreateTemp(tempDir, "exp-test") if err != nil { return err } @@ -214,7 +213,7 @@ func testDMExportAsCar(ctx context.Context, client *kit.TestFullNode, expDirecti return validateDMCar(out) } func tesV0RetrievalAsCar(ctx context.Context, client *kit.TestFullNode, retOrder api0.RetrievalOrder, tempDir string) error { - out, err := ioutil.TempFile(tempDir, "exp-test") + out, err := os.CreateTemp(tempDir, "exp-test") if err != nil { return err } diff --git a/itests/kit/client.go b/itests/kit/client.go index f29fecfeb..134b6b1ce 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -3,7 +3,6 @@ package kit import ( "context" "fmt" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -110,7 +109,7 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) // Retrieve the first file from the Miner // client retrieve - tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-client") + tmpdir, err := os.MkdirTemp(os.TempDir(), "test-cli-client") require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") @@ -144,13 +143,13 @@ func createRandomFile(rseed, size int) ([]byte, string, error) { data := make([]byte, size) rand.New(rand.NewSource(int64(rseed))).Read(data) - dir, err := ioutil.TempDir(os.TempDir(), "test-make-deal-") + dir, err := os.MkdirTemp(os.TempDir(), "test-make-deal-") if err != nil { return nil, "", err } path := filepath.Join(dir, "sourcefile.dat") - err = ioutil.WriteFile(path, data, 0644) + err = os.WriteFile(path, data, 0644) if err != nil { return nil, "", err } diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index a96aa60ff..d38518be8 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -6,9 +6,9 @@ import ( "crypto/rand" "encoding/binary" "fmt" - "io/ioutil" "net" "net/http" + "os" "sync" "testing" "time" @@ -234,7 +234,7 @@ func (n *Ensemble) MinerEnroll(minerNode *TestMiner, full *TestFullNode, opts .. peerId, err := peer.IDFromPrivateKey(privkey) require.NoError(n.t, err) - tdir, err := ioutil.TempDir("", "preseal-memgen") + tdir, err := os.MkdirTemp("", "preseal-memgen") require.NoError(n.t, err) minerCnt := len(n.inactive.miners) + len(n.active.miners) diff --git a/itests/kit/node_miner.go b/itests/kit/node_miner.go index dd6f3088c..4b81c9df0 100644 --- a/itests/kit/node_miner.go +++ b/itests/kit/node_miner.go @@ -4,7 +4,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net" "os" "path/filepath" @@ -204,7 +203,7 @@ func (tm *TestMiner) AddStorage(ctx context.Context, t *testing.T, conf func(*st b, err := json.MarshalIndent(cfg, "", " ") require.NoError(t, err) - err = ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644) + err = os.WriteFile(filepath.Join(p, metaFile), b, 0644) require.NoError(t, err) err = tm.StorageAddLocal(ctx, p) diff --git a/itests/kit/node_worker.go b/itests/kit/node_worker.go index ac200fb0f..3674763ed 100644 --- a/itests/kit/node_worker.go +++ b/itests/kit/node_worker.go @@ -3,7 +3,6 @@ package kit import ( "context" "encoding/json" - "io/ioutil" "net" "net/http" "os" @@ -67,7 +66,7 @@ func (tm *TestWorker) AddStorage(ctx context.Context, t *testing.T, conf func(*s b, err := json.MarshalIndent(cfg, "", " ") require.NoError(t, err) - err = ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644) + err = os.WriteFile(filepath.Join(p, metaFile), b, 0644) require.NoError(t, err) err = tm.StorageAddLocal(ctx, p) diff --git a/lib/backupds/backupds_test.go b/lib/backupds/backupds_test.go index b76799bfb..8909a5f3b 100644 --- a/lib/backupds/backupds_test.go +++ b/lib/backupds/backupds_test.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -77,7 +76,7 @@ func TestLogRestore(t *testing.T) { require.NoError(t, err) require.Equal(t, 1, len(fls)) - bf, err := ioutil.ReadFile(filepath.Join(logdir, fls[0].Name())) + bf, err := os.ReadFile(filepath.Join(logdir, fls[0].Name())) require.NoError(t, err) ds2 := datastore.NewMapDatastore() diff --git a/lib/consensus/raft/config.go b/lib/consensus/raft/config.go index 81bdb7fdc..bdd82c108 100644 --- a/lib/consensus/raft/config.go +++ b/lib/consensus/raft/config.go @@ -1,7 +1,7 @@ package consensus import ( - "io/ioutil" + "io" "path/filepath" "time" @@ -69,7 +69,7 @@ func DefaultClusterRaftConfig() *ClusterRaftConfig { cfg.RaftConfig.LocalID = "will_be_set_automatically" // Set up logging - cfg.RaftConfig.LogOutput = ioutil.Discard + cfg.RaftConfig.LogOutput = io.Discard return &cfg } @@ -91,7 +91,7 @@ func NewClusterRaftConfig(userRaftConfig *config.UserRaftConfig) *ClusterRaftCon cfg.RaftConfig.LocalID = "will_be_set_automatically" // Set up logging - cfg.RaftConfig.LogOutput = ioutil.Discard + cfg.RaftConfig.LogOutput = io.Discard return &cfg diff --git a/lib/rpcenc/reader.go b/lib/rpcenc/reader.go index 34b9fcfb4..2dd64473e 100644 --- a/lib/rpcenc/reader.go +++ b/lib/rpcenc/reader.go @@ -6,7 +6,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "path" @@ -158,7 +157,7 @@ func ReaderParamEncoder(addr string) jsonrpc.Option { } if resp.StatusCode != http.StatusOK { - b, _ := ioutil.ReadAll(resp.Body) + b, _ := io.ReadAll(resp.Body) log.Errorf("sending reader param (%s): non-200 status: %s, msg: '%s'", u.String(), resp.Status, string(b)) return } @@ -182,7 +181,7 @@ func ReaderParamEncoder(addr string) jsonrpc.Option { defer resp.Body.Close() //nolint if resp.StatusCode != http.StatusOK { - b, _ := ioutil.ReadAll(resp.Body) + b, _ := io.ReadAll(resp.Body) log.Errorf("sending reader param (%s): non-200 status: %s, msg: '%s'", u.String(), resp.Status, string(b)) return } diff --git a/lib/unixfs/filestore.go b/lib/unixfs/filestore.go index acd0a62ac..0a0b61c4c 100644 --- a/lib/unixfs/filestore.go +++ b/lib/unixfs/filestore.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "os" "github.com/ipfs/go-blockservice" @@ -68,7 +67,7 @@ func CreateFilestore(ctx context.Context, srcPath string, dstPath string) (cid.C return cid.Undef, xerrors.Errorf("failed to create reader path file: %w", err) } - f, err := ioutil.TempFile("", "") + f, err := os.CreateTemp("", "") if err != nil { return cid.Undef, xerrors.Errorf("failed to create temp file: %w", err) } diff --git a/lib/unixfs/filestore_test.go b/lib/unixfs/filestore_test.go index f9d5ed656..67d380701 100644 --- a/lib/unixfs/filestore_test.go +++ b/lib/unixfs/filestore_test.go @@ -5,7 +5,6 @@ import ( "bytes" "context" "io" - "io/ioutil" "os" "strings" "testing" @@ -67,7 +66,7 @@ func TestRoundtripUnixFS_Dense(t *testing.T) { // ensure contents of the initial input file and the output file are identical. fo, err := os.Open(tmpOutput) require.NoError(t, err) - bz2, err := ioutil.ReadAll(fo) + bz2, err := io.ReadAll(fo) require.NoError(t, err) require.NoError(t, fo.Close()) require.Equal(t, inputContents, bz2) @@ -107,7 +106,7 @@ func TestRoundtripUnixFS_Filestore(t *testing.T) { // ensure contents of the initial input file and the output file are identical. fo, err := os.Open(tmpOutput) require.NoError(t, err) - bz2, err := ioutil.ReadAll(fo) + bz2, err := io.ReadAll(fo) require.NoError(t, err) require.NoError(t, fo.Close()) require.Equal(t, inputContents, bz2) diff --git a/markets/dagstore/mount_test.go b/markets/dagstore/mount_test.go index e044603d4..d415f8d88 100644 --- a/markets/dagstore/mount_test.go +++ b/markets/dagstore/mount_test.go @@ -4,7 +4,6 @@ package dagstore import ( "context" "io" - "io/ioutil" "net/url" "strings" "testing" @@ -39,7 +38,7 @@ func TestLotusMount(t *testing.T) { io.ReaderAt io.Seeker }{ - ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReadCloser: io.NopCloser(strings.NewReader("testing")), ReaderAt: nil, Seeker: nil, } @@ -48,7 +47,7 @@ func TestLotusMount(t *testing.T) { io.ReaderAt io.Seeker }{ - ReadCloser: ioutil.NopCloser(strings.NewReader("testing")), + ReadCloser: io.NopCloser(strings.NewReader("testing")), ReaderAt: nil, Seeker: nil, } @@ -66,7 +65,7 @@ func TestLotusMount(t *testing.T) { rd, err := mnt.Fetch(context.Background()) require.NoError(t, err) - bz, err := ioutil.ReadAll(rd) + bz, err := io.ReadAll(rd) require.NoError(t, err) require.NoError(t, rd.Close()) require.Equal(t, []byte("testing"), bz) @@ -85,7 +84,7 @@ func TestLotusMount(t *testing.T) { // fetching on this mount should get us back the same data. rd, err = mnt2.Fetch(context.Background()) require.NoError(t, err) - bz, err = ioutil.ReadAll(rd) + bz, err = io.ReadAll(rd) require.NoError(t, err) require.NoError(t, rd.Close()) require.Equal(t, []byte("testing"), bz) diff --git a/node/config/cfgdocgen/gen.go b/node/config/cfgdocgen/gen.go index 513350152..577e85f9d 100644 --- a/node/config/cfgdocgen/gen.go +++ b/node/config/cfgdocgen/gen.go @@ -2,14 +2,13 @@ package main import ( "fmt" - "io/ioutil" "os" "sort" "strings" ) func run() error { - tfb, err := ioutil.ReadFile("./node/config/types.go") + tfb, err := os.ReadFile("./node/config/types.go") if err != nil { return err } diff --git a/node/config/load.go b/node/config/load.go index 29cb15d27..913350912 100644 --- a/node/config/load.go +++ b/node/config/load.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "os" "reflect" "regexp" @@ -47,7 +46,7 @@ func FromFile(path string, opts ...LoadCfgOpt) (interface{}, error) { return nil, err } defer file.Close() //nolint:errcheck,staticcheck // The file is RO - cfgBs, err := ioutil.ReadAll(file) + cfgBs, err := io.ReadAll(file) if err != nil { return nil, xerrors.Errorf("failed to read config for validation checks %w", err) } diff --git a/node/config/load_test.go b/node/config/load_test.go index cab5268df..e17660c19 100644 --- a/node/config/load_test.go +++ b/node/config/load_test.go @@ -3,7 +3,6 @@ package config import ( "bytes" - "io/ioutil" "os" "testing" "time" @@ -50,7 +49,7 @@ func TestParitalConfig(t *testing.T) { } { - f, err := ioutil.TempFile("", "config-*.toml") + f, err := os.CreateTemp("", "config-*.toml") fname := f.Name() assert.NoError(err, "tmp file shold not error") @@ -115,7 +114,7 @@ func TestValidateConfigSetsEnableSplitstore(t *testing.T) { assert.False(t, MatchEnableSplitstoreField(string(cfgCommentedOutEnableSS))) // write config with commented out EnableSplitstore to file - f, err := ioutil.TempFile("", "config.toml") + f, err := os.CreateTemp("", "config.toml") fname := f.Name() assert.NoError(t, err) defer func() { @@ -132,7 +131,7 @@ func TestValidateConfigSetsEnableSplitstore(t *testing.T) { // Loading without a config file and a default fails if the default fallback is disabled func TestFailToFallbackToDefault(t *testing.T) { - dir, err := ioutil.TempDir("", "dirWithNoFiles") + dir, err := os.MkdirTemp("", "dirWithNoFiles") assert.NoError(t, err) defer assert.NoError(t, os.RemoveAll(dir)) nonExistantFileName := dir + "/notarealfile" diff --git a/node/config/storage.go b/node/config/storage.go index 2c9d880f9..dfe067840 100644 --- a/node/config/storage.go +++ b/node/config/storage.go @@ -3,7 +3,6 @@ package config import ( "encoding/json" "io" - "io/ioutil" "os" "golang.org/x/xerrors" @@ -43,7 +42,7 @@ func WriteStorageFile(path string, config storiface.StorageConfig) error { return xerrors.Errorf("marshaling storage config: %w", err) } - if err := ioutil.WriteFile(path, b, 0644); err != nil { + if err := os.WriteFile(path, b, 0644); err != nil { return xerrors.Errorf("persisting storage config (%s): %w", path, err) } diff --git a/node/impl/client/client_test.go b/node/impl/client/client_test.go index 98092bc93..032fef55a 100644 --- a/node/impl/client/client_test.go +++ b/node/impl/client/client_test.go @@ -5,7 +5,7 @@ import ( "bytes" "context" "embed" - "io/ioutil" + "os" "path/filepath" "strings" "testing" @@ -77,7 +77,7 @@ func TestImportLocal(t *testing.T) { }) require.NoError(t, err) - outBytes, err := ioutil.ReadFile(out1) + outBytes, err := os.ReadFile(out1) require.NoError(t, err) require.Equal(t, b, outBytes) @@ -128,7 +128,7 @@ func TestImportLocal(t *testing.T) { err = files.WriteTo(file, exportedPath) require.NoError(t, err) - exportedBytes, err := ioutil.ReadFile(exportedPath) + exportedBytes, err := os.ReadFile(exportedPath) require.NoError(t, err) // compare original file to recreated unixfs file. diff --git a/node/modules/core.go b/node/modules/core.go index c74cc2143..a0d52c291 100644 --- a/node/modules/core.go +++ b/node/modules/core.go @@ -5,7 +5,6 @@ import ( "crypto/rand" "errors" "io" - "io/ioutil" "os" "path/filepath" "time" @@ -147,7 +146,7 @@ func APISecret(keystore types.KeyStore, lr repo.LockedRepo) (*dtypes.APIAlg, err if errors.Is(err, types.ErrKeyInfoNotFound) { log.Warn("Generating new API secret") - sk, err := ioutil.ReadAll(io.LimitReader(rand.Reader, 32)) + sk, err := io.ReadAll(io.LimitReader(rand.Reader, 32)) if err != nil { return nil, err } diff --git a/node/modules/testing/genesis.go b/node/modules/testing/genesis.go index a3d25e36a..3876775df 100644 --- a/node/modules/testing/genesis.go +++ b/node/modules/testing/genesis.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "github.com/ipfs/go-blockservice" @@ -60,7 +59,7 @@ func MakeGenesis(outFile, genesisTemplate string) func(bs dtypes.ChainBlockstore return nil, err } - fdata, err := ioutil.ReadFile(genesisTemplate) + fdata, err := os.ReadFile(genesisTemplate) if err != nil { return nil, xerrors.Errorf("reading preseals json: %w", err) } diff --git a/node/repo/fsrepo.go b/node/repo/fsrepo.go index 2dbedd5e7..03ddd2d6c 100644 --- a/node/repo/fsrepo.go +++ b/node/repo/fsrepo.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -329,7 +328,7 @@ func (fsr *FsRepo) APIEndpoint() (multiaddr.Multiaddr, error) { } defer f.Close() //nolint: errcheck // Read only op - data, err := ioutil.ReadAll(f) + data, err := io.ReadAll(f) if err != nil { return nil, xerrors.Errorf("failed to read %q: %w", p, err) } @@ -354,7 +353,7 @@ func (fsr *FsRepo) APIToken() ([]byte, error) { } defer f.Close() //nolint: errcheck // Read only op - tb, err := ioutil.ReadAll(f) + tb, err := io.ReadAll(f) if err != nil { return nil, err } @@ -582,7 +581,7 @@ func (fsr *fsLockedRepo) SetConfig(c func(interface{})) error { } // write buffer of TOML bytes to config file - err = ioutil.WriteFile(fsr.configPath, buf.Bytes(), 0644) + err = os.WriteFile(fsr.configPath, buf.Bytes(), 0644) if err != nil { return err } @@ -635,14 +634,14 @@ func (fsr *fsLockedRepo) SetAPIEndpoint(ma multiaddr.Multiaddr) error { if err := fsr.stillValid(); err != nil { return err } - return ioutil.WriteFile(fsr.join(fsAPI), []byte(ma.String()), 0644) + return os.WriteFile(fsr.join(fsAPI), []byte(ma.String()), 0644) } func (fsr *fsLockedRepo) SetAPIToken(token []byte) error { if err := fsr.stillValid(); err != nil { return err } - return ioutil.WriteFile(fsr.join(fsAPIToken), token, 0600) + return os.WriteFile(fsr.join(fsAPIToken), token, 0600) } func (fsr *fsLockedRepo) KeyStore() (types.KeyStore, error) { @@ -711,7 +710,7 @@ func (fsr *fsLockedRepo) Get(name string) (types.KeyInfo, error) { } defer file.Close() //nolint: errcheck // read only op - data, err := ioutil.ReadAll(file) + data, err := io.ReadAll(file) if err != nil { return types.KeyInfo{}, xerrors.Errorf("reading key '%s': %w", name, err) } @@ -760,7 +759,7 @@ func (fsr *fsLockedRepo) put(rawName string, info types.KeyInfo, retries int) er return xerrors.Errorf("encoding key '%s': %w", name, err) } - err = ioutil.WriteFile(keyPath, keyData, 0600) + err = os.WriteFile(keyPath, keyData, 0600) if err != nil { return xerrors.Errorf("writing key '%s': %w", name, err) } diff --git a/node/repo/memrepo.go b/node/repo/memrepo.go index 7817776a9..6a4b416e2 100644 --- a/node/repo/memrepo.go +++ b/node/repo/memrepo.go @@ -3,7 +3,6 @@ package repo import ( "context" "encoding/json" - "io/ioutil" "os" "path/filepath" "sync" @@ -103,7 +102,7 @@ func (lmem *lockedMemRepo) Path() string { return lmem.mem.tempDir } - t, err := ioutil.TempDir(os.TempDir(), "lotus-memrepo-temp-") + t, err := os.MkdirTemp(os.TempDir(), "lotus-memrepo-temp-") if err != nil { panic(err) // only used in tests, probably fine } @@ -142,7 +141,7 @@ func (lmem *lockedMemRepo) initSectorStore(t string) { panic(err) } - if err := ioutil.WriteFile(filepath.Join(t, "sectorstore.json"), b, 0644); err != nil { + if err := os.WriteFile(filepath.Join(t, "sectorstore.json"), b, 0644); err != nil { panic(err) } } diff --git a/storage/paths/http_handler_test.go b/storage/paths/http_handler_test.go index b03fd20ee..4987936dd 100644 --- a/storage/paths/http_handler_test.go +++ b/storage/paths/http_handler_test.go @@ -2,7 +2,7 @@ package paths_test import ( "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "os" @@ -378,7 +378,7 @@ func TestRemoteGetSector(t *testing.T) { if !tc.isDir { // create file - tempFile, err := ioutil.TempFile("", "TestRemoteGetSector-") + tempFile, err := os.CreateTemp("", "TestRemoteGetSector-") require.NoError(t, err) defer func() { @@ -390,7 +390,7 @@ func TestRemoteGetSector(t *testing.T) { path = tempFile.Name() } else { // create dir with a file - tempFile2, err := ioutil.TempFile("", "TestRemoteGetSector-") + tempFile2, err := os.CreateTemp("", "TestRemoteGetSector-") require.NoError(t, err) defer func() { _ = os.Remove(tempFile2.Name()) @@ -435,7 +435,7 @@ func TestRemoteGetSector(t *testing.T) { _ = resp.Body.Close() }() - bz, err := ioutil.ReadAll(resp.Body) + bz, err := io.ReadAll(resp.Body) require.NoError(t, err) // assert expected status code diff --git a/storage/paths/local.go b/storage/paths/local.go index 2182f24ef..a866f5bbe 100644 --- a/storage/paths/local.go +++ b/storage/paths/local.go @@ -3,7 +3,6 @@ package paths import ( "context" "encoding/json" - "io/ioutil" "math/bits" "math/rand" "os" @@ -151,7 +150,7 @@ func (st *Local) OpenPath(ctx context.Context, p string) error { st.localLk.Lock() defer st.localLk.Unlock() - mb, err := ioutil.ReadFile(filepath.Join(p, MetaFile)) + mb, err := os.ReadFile(filepath.Join(p, MetaFile)) if err != nil { return xerrors.Errorf("reading storage metadata for %s: %w", p, err) } @@ -247,7 +246,7 @@ func (st *Local) Redeclare(ctx context.Context, filterId *storiface.ID, dropMiss defer st.localLk.Unlock() for id, p := range st.paths { - mb, err := ioutil.ReadFile(filepath.Join(p.local, MetaFile)) + mb, err := os.ReadFile(filepath.Join(p.local, MetaFile)) if err != nil { return xerrors.Errorf("reading storage metadata for %s: %w", p.local, err) } diff --git a/storage/paths/local_test.go b/storage/paths/local_test.go index 6b9f4a545..bfa138ff6 100644 --- a/storage/paths/local_test.go +++ b/storage/paths/local_test.go @@ -3,7 +3,6 @@ package paths import ( "context" "encoding/json" - "io/ioutil" "os" "path/filepath" "testing" @@ -63,7 +62,7 @@ func (t *TestingLocalStorage) init(subpath string) error { return err } - if err := ioutil.WriteFile(metaFile, mb, 0644); err != nil { + if err := os.WriteFile(metaFile, mb, 0644); err != nil { return err } diff --git a/storage/paths/remote.go b/storage/paths/remote.go index 06d1080b3..852936153 100644 --- a/storage/paths/remote.go +++ b/storage/paths/remote.go @@ -5,7 +5,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "math/bits" "net/http" "net/url" @@ -412,7 +411,7 @@ func (r *Remote) FsStat(ctx context.Context, id storiface.ID) (fsutil.FsStat, er case 404: return fsutil.FsStat{}, errPathNotFound case 500: - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return fsutil.FsStat{}, xerrors.Errorf("fsstat: got http 500, then failed to read the error: %w", err) } @@ -768,7 +767,7 @@ func (r *Remote) GenerateSingleVanillaProof(ctx context.Context, minerID abi.Act log.Debugw("reading vanilla proof from remote not-found response", "url", url, "store", info.ID) continue } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { return nil, xerrors.Errorf("resp.Body ReadAll: %w", err) } @@ -780,7 +779,7 @@ func (r *Remote) GenerateSingleVanillaProof(ctx context.Context, minerID abi.Act return nil, xerrors.Errorf("non-200 code from %s: '%s'", url, strings.TrimSpace(string(body))) } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) if err != nil { if err := resp.Body.Close(); err != nil { log.Error("response close: ", err) diff --git a/storage/paths/remote_test.go b/storage/paths/remote_test.go index 2d7fe2c73..41d5e8a17 100644 --- a/storage/paths/remote_test.go +++ b/storage/paths/remote_test.go @@ -6,7 +6,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/http/httptest" "os" @@ -48,7 +47,7 @@ func createTestStorage(t *testing.T, p string, seal bool, att ...*paths.Local) s b, err := json.MarshalIndent(cfg, "", " ") require.NoError(t, err) - require.NoError(t, ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644)) + require.NoError(t, os.WriteFile(filepath.Join(p, metaFile), b, 0644)) for _, s := range att { require.NoError(t, s.OpenPath(context.Background(), p)) @@ -130,7 +129,7 @@ func TestMoveShared(t *testing.T) { data := make([]byte, 2032) data[1] = 54 - require.NoError(t, ioutil.WriteFile(sp.Sealed, data, 0666)) + require.NoError(t, os.WriteFile(sp.Sealed, data, 0666)) fmt.Println("write to ", sp.Sealed) require.NoError(t, index.StorageDeclareSector(ctx, storiface.ID(sid.Sealed), s1ref.ID, storiface.FTSealed, true)) @@ -145,7 +144,7 @@ func TestMoveShared(t *testing.T) { require.Equal(t, id1, storiface.ID(sid.Sealed)) fmt.Println("read from ", sp.Sealed) - read, err := ioutil.ReadFile(sp.Sealed) + read, err := os.ReadFile(sp.Sealed) require.NoError(t, err) require.EqualValues(t, data, read) } @@ -357,7 +356,7 @@ func TestReader(t *testing.T) { mockCheckAllocation(pf, offset, size, emptyPartialFile, true, nil) - f, err := ioutil.TempFile("", "TestReader-") + f, err := os.CreateTemp("", "TestReader-") require.NoError(t, err) _, err = f.Write(bz) require.NoError(t, err) @@ -502,7 +501,7 @@ func TestReader(t *testing.T) { require.NoError(t, os.Remove(f.Name())) } - bz, err := ioutil.ReadAll(rd) + bz, err := io.ReadAll(rd) require.NoError(t, err) require.Equal(t, tc.expectedSectorBytes, bz) } diff --git a/storage/sealer/ffiwrapper/sealer_cgo.go b/storage/sealer/ffiwrapper/sealer_cgo.go index e9ce5746e..871012d0b 100644 --- a/storage/sealer/ffiwrapper/sealer_cgo.go +++ b/storage/sealer/ffiwrapper/sealer_cgo.go @@ -11,7 +11,6 @@ import ( "encoding/base64" "encoding/json" "io" - "io/ioutil" "math/bits" "os" "path/filepath" @@ -1095,7 +1094,7 @@ func (sb *Sealer) FinalizeSectorInto(ctx context.Context, sector storiface.Secto } defer done() - files, err := ioutil.ReadDir(paths.Cache) + files, err := os.ReadDir(paths.Cache) if err != nil { return err } diff --git a/storage/sealer/ffiwrapper/sealer_test.go b/storage/sealer/ffiwrapper/sealer_test.go index dd0c1e184..34dea3b1b 100644 --- a/storage/sealer/ffiwrapper/sealer_test.go +++ b/storage/sealer/ffiwrapper/sealer_test.go @@ -5,7 +5,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -130,7 +129,7 @@ func (s *seal) unseal(t *testing.T, sb *Sealer, sp *basicfs.Provider, si storifa t.Fatal(err) } - expect, _ := ioutil.ReadAll(data(si.ID.Number, 1016)) + expect, _ := io.ReadAll(data(si.ID.Number, 1016)) if !bytes.Equal(b.Bytes(), expect) { t.Fatal("read wrong bytes") } @@ -160,7 +159,7 @@ func (s *seal) unseal(t *testing.T, sb *Sealer, sp *basicfs.Provider, si storifa t.Fatal(err) } - expect, _ = ioutil.ReadAll(data(si.ID.Number, 1016)) + expect, _ = io.ReadAll(data(si.ID.Number, 1016)) require.Equal(t, expect, b.Bytes()) b.Reset() @@ -240,12 +239,12 @@ func corrupt(t *testing.T, sealer *Sealer, id storiface.SectorRef) { } func getGrothParamFileAndVerifyingKeys(s abi.SectorSize) { - dat, err := ioutil.ReadFile("../../../build/proof-params/parameters.json") + dat, err := os.ReadFile("../../../build/proof-params/parameters.json") if err != nil { panic(err) } - datSrs, err := ioutil.ReadFile("../../../build/proof-params/srs-inner-product.json") + datSrs, err := os.ReadFile("../../../build/proof-params/srs-inner-product.json") if err != nil { panic(err) } @@ -281,7 +280,7 @@ func TestSealAndVerify(t *testing.T) { getGrothParamFileAndVerifyingKeys(sectorSize) - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { t.Fatal(err) } @@ -352,7 +351,7 @@ func TestSealPoStNoCommit(t *testing.T) { getGrothParamFileAndVerifyingKeys(sectorSize) - dir, err := ioutil.TempDir("", "sbtest") + dir, err := os.MkdirTemp("", "sbtest") if err != nil { t.Fatal(err) } @@ -416,7 +415,7 @@ func TestSealAndVerify3(t *testing.T) { getGrothParamFileAndVerifyingKeys(sectorSize) - dir, err := ioutil.TempDir("", "sbtest") + dir, err := os.MkdirTemp("", "sbtest") if err != nil { t.Fatal(err) } @@ -494,7 +493,7 @@ func TestSealAndVerifyAggregate(t *testing.T) { getGrothParamFileAndVerifyingKeys(sectorSize) - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { t.Fatal(err) } @@ -576,7 +575,7 @@ func BenchmarkWriteWithAlignment(b *testing.B) { for i := 0; i < b.N; i++ { b.StopTimer() rf, w, _ := commpffi.ToReadableFile(bytes.NewReader(bytes.Repeat([]byte{0xff, 0}, int(bt/2))), int64(bt)) - tf, _ := ioutil.TempFile("/tmp/", "scrb-") + tf, _ := os.CreateTemp("/tmp/", "scrb-") b.StartTimer() ffi.WriteWithAlignment(abi.RegisteredSealProof_StackedDrg2KiBV1, rf, bt, tf, nil) // nolint:errcheck @@ -735,7 +734,7 @@ func TestGenerateUnsealedCID(t *testing.T) { func TestAddPiece512M(t *testing.T) { sz := abi.PaddedPieceSize(512 << 20).Unpadded() - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { t.Fatal(err) } @@ -779,7 +778,7 @@ func BenchmarkAddPiece512M(b *testing.B) { sz := abi.PaddedPieceSize(512 << 20).Unpadded() b.SetBytes(int64(sz)) - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { b.Fatal(err) } @@ -821,7 +820,7 @@ func BenchmarkAddPiece512M(b *testing.B) { func TestAddPiece512MPadded(t *testing.T) { sz := abi.PaddedPieceSize(512 << 20).Unpadded() - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { t.Fatal(err) } @@ -890,7 +889,7 @@ func TestMulticoreSDR(t *testing.T) { getGrothParamFileAndVerifyingKeys(sectorSize) - dir, err := ioutil.TempDir("", "sbtest") + dir, err := os.MkdirTemp("", "sbtest") if err != nil { t.Fatal(err) } @@ -995,7 +994,7 @@ func TestPoStChallengeAssumptions(t *testing.T) { func TestDCAPCloses(t *testing.T) { sz := abi.PaddedPieceSize(2 << 10).Unpadded() - cdir, err := ioutil.TempDir("", "sbtest-c-") + cdir, err := os.MkdirTemp("", "sbtest-c-") if err != nil { t.Fatal(err) } diff --git a/storage/sealer/fr32/fr32_ffi_cmp_test.go b/storage/sealer/fr32/fr32_ffi_cmp_test.go index 7dece4723..32afa470e 100644 --- a/storage/sealer/fr32/fr32_ffi_cmp_test.go +++ b/storage/sealer/fr32/fr32_ffi_cmp_test.go @@ -3,7 +3,6 @@ package fr32_test import ( "bytes" "io" - "io/ioutil" "os" "testing" @@ -17,7 +16,7 @@ import ( ) func TestWriteTwoPcs(t *testing.T) { - tf, _ := ioutil.TempFile("/tmp/", "scrb-") + tf, _ := os.CreateTemp("/tmp/", "scrb-") paddedSize := abi.PaddedPieceSize(16 << 20) n := 2 @@ -43,7 +42,7 @@ func TestWriteTwoPcs(t *testing.T) { panic(err) } - ffiBytes, err := ioutil.ReadAll(tf) + ffiBytes, err := io.ReadAll(tf) if err != nil { panic(err) } diff --git a/storage/sealer/fr32/fr32_test.go b/storage/sealer/fr32/fr32_test.go index f9150e550..437fa4e43 100644 --- a/storage/sealer/fr32/fr32_test.go +++ b/storage/sealer/fr32/fr32_test.go @@ -3,7 +3,6 @@ package fr32_test import ( "bytes" "io" - "io/ioutil" "math/rand" "os" "testing" @@ -19,7 +18,7 @@ import ( func padFFI(buf []byte) []byte { rf, w, _ := commpffi.ToReadableFile(bytes.NewReader(buf), int64(len(buf))) - tf, _ := ioutil.TempFile("/tmp/", "scrb-") + tf, _ := os.CreateTemp("/tmp/", "scrb-") _, _, _, err := ffi.WriteWithAlignment(abi.RegisteredSealProof_StackedDrg32GiBV1, rf, abi.UnpaddedPieceSize(len(buf)), tf, nil) if err != nil { @@ -33,7 +32,7 @@ func padFFI(buf []byte) []byte { panic(err) } - padded, err := ioutil.ReadAll(tf) + padded, err := io.ReadAll(tf) if err != nil { panic(err) } diff --git a/storage/sealer/fr32/readers_test.go b/storage/sealer/fr32/readers_test.go index 21a5cd9cd..f84b9d67a 100644 --- a/storage/sealer/fr32/readers_test.go +++ b/storage/sealer/fr32/readers_test.go @@ -3,7 +3,7 @@ package fr32_test import ( "bufio" "bytes" - "io/ioutil" + "io" "testing" "github.com/stretchr/testify/require" @@ -27,7 +27,7 @@ func TestUnpadReader(t *testing.T) { } // using bufio reader to make sure reads are big enough for the padreader - it can't handle small reads right now - readered, err := ioutil.ReadAll(bufio.NewReaderSize(r, 512)) + readered, err := io.ReadAll(bufio.NewReaderSize(r, 512)) if err != nil { t.Fatal(err) } diff --git a/storage/sealer/manager_test.go b/storage/sealer/manager_test.go index a44f69a89..cdc135916 100644 --- a/storage/sealer/manager_test.go +++ b/storage/sealer/manager_test.go @@ -7,7 +7,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -46,7 +45,7 @@ func (t testStorage) DiskUsage(path string) (int64, error) { } func newTestStorage(t *testing.T) *testStorage { - tp, err := ioutil.TempDir(os.TempDir(), "sealer-test-") + tp, err := os.MkdirTemp(os.TempDir(), "sealer-test-") require.NoError(t, err) { @@ -58,7 +57,7 @@ func newTestStorage(t *testing.T) *testStorage { }, "", " ") require.NoError(t, err) - err = ioutil.WriteFile(filepath.Join(tp, "sectorstore.json"), b, 0644) + err = os.WriteFile(filepath.Join(tp, "sectorstore.json"), b, 0644) require.NoError(t, err) } diff --git a/storage/sealer/mock/mock.go b/storage/sealer/mock/mock.go index 6e88b86a5..ab973b3b4 100644 --- a/storage/sealer/mock/mock.go +++ b/storage/sealer/mock/mock.go @@ -6,7 +6,6 @@ import ( "crypto/sha256" "fmt" "io" - "io/ioutil" "math/rand" "sync" @@ -461,7 +460,7 @@ func (mgr *SectorMgr) ReadPiece(ctx context.Context, sector storiface.SectorRef, io.Seeker io.ReaderAt }{ - ReadCloser: ioutil.NopCloser(br), + ReadCloser: io.NopCloser(br), Seeker: br, ReaderAt: br, }, false, nil diff --git a/storage/sealer/piece_provider_test.go b/storage/sealer/piece_provider_test.go index ea2866e5d..4cbc79a93 100644 --- a/storage/sealer/piece_provider_test.go +++ b/storage/sealer/piece_provider_test.go @@ -3,7 +3,7 @@ package sealer import ( "bytes" "context" - "io/ioutil" + "io" "math/rand" "net" "net/http" @@ -346,7 +346,7 @@ func (p *pieceProviderTestHarness) readPiece(t *testing.T, offset storiface.Unpa defer func() { _ = rd.Close() }() // Make sure the input matches the output - readData, err := ioutil.ReadAll(rd) + readData, err := io.ReadAll(rd) require.NoError(t, err) require.Equal(t, expectedBytes, readData) }