diff --git a/.github/workflows/gotest.yml b/.github/workflows/gotest.yml index c3846b03fab..8450f19c59b 100644 --- a/.github/workflows/gotest.yml +++ b/.github/workflows/gotest.yml @@ -45,7 +45,7 @@ jobs: make -j "$PARALLEL" test/unit/gotest.junit.xml && [[ ! $(jq -s -c 'map(select(.Action == "fail")) | .[]' test/unit/gotest.json) ]] - name: Upload coverage to Codecov - uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # v5.1.1 if: failure() || success() with: name: unittests diff --git a/.github/workflows/sharness.yml b/.github/workflows/sharness.yml index 354cad1029e..04fea72b20f 100644 --- a/.github/workflows/sharness.yml +++ b/.github/workflows/sharness.yml @@ -55,7 +55,7 @@ jobs: # increasing parallelism beyond 10 doesn't speed up the tests much PARALLEL: ${{ github.repository == 'ipfs/kubo' && 10 || 3 }} - name: Upload coverage report - uses: codecov/codecov-action@015f24e6818733317a2da2edd6290ab26238649a # v5.0.7 + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # v5.1.1 if: failure() || success() with: name: sharness diff --git a/cmd/ipfs/kubo/daemon.go b/cmd/ipfs/kubo/daemon.go index 5c0d9616006..6b87ff44229 100644 --- a/cmd/ipfs/kubo/daemon.go +++ b/cmd/ipfs/kubo/daemon.go @@ -295,7 +295,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment if !domigrate { fmt.Println("Not running migrations of fs-repo now.") fmt.Println("Please get fs-repo-migrations from https://dist.ipfs.tech") - return fmt.Errorf("fs-repo requires migration") + return errors.New("fs-repo requires migration") } // Read Migration section of IPFS config @@ -436,7 +436,7 @@ func daemonFunc(req *cmds.Request, re cmds.ResponseEmitter, env cmds.Environment ncfg.Routing = libp2p.NilRouterOption case routingOptionCustomKwd: if cfg.Routing.AcceleratedDHTClient.WithDefault(config.DefaultAcceleratedDHTClient) { - return fmt.Errorf("Routing.AcceleratedDHTClient option is set even tho Routing.Type is custom, using custom .AcceleratedDHTClient needs to be set on DHT routers individually") + return errors.New("Routing.AcceleratedDHTClient option is set even tho Routing.Type is custom, using custom .AcceleratedDHTClient needs to be set on DHT routers individually") } ncfg.Routing = libp2p.ConstructDelegatedRouting( cfg.Routing.Routers, diff --git a/cmd/ipfs/kubo/init.go b/cmd/ipfs/kubo/init.go index 986fe90c8b1..06312014884 100644 --- a/cmd/ipfs/kubo/init.go +++ b/cmd/ipfs/kubo/init.go @@ -88,11 +88,11 @@ environment variable: if it.Err() != nil { return it.Err() } - return fmt.Errorf("file argument was nil") + return errors.New("file argument was nil") } file := files.FileFromEntry(it) if file == nil { - return fmt.Errorf("expected a regular file") + return errors.New("expected a regular file") } conf = &config.Config{} diff --git a/cmd/ipfs/kubo/pinmfs.go b/cmd/ipfs/kubo/pinmfs.go index ec72e326df9..96ab4d8616d 100644 --- a/cmd/ipfs/kubo/pinmfs.go +++ b/cmd/ipfs/kubo/pinmfs.go @@ -90,34 +90,46 @@ func pinMFSOnChange(cctx pinMFSContext, configPollInterval time.Duration, node p case <-cctx.Context().Done(): return case <-tmo.C: - tmo.Reset(configPollInterval) - } - - // reread the config, which may have changed in the meantime - cfg, err := cctx.GetConfig() - if err != nil { - mfslog.Errorf("pinning reading config (%v)", err) - continue - } - mfslog.Debugf("pinning loop is awake, %d remote services", len(cfg.Pinning.RemoteServices)) + // reread the config, which may have changed in the meantime + cfg, err := cctx.GetConfig() + if err != nil { + mfslog.Errorf("pinning reading config (%v)", err) + continue + } + mfslog.Debugf("pinning loop is awake, %d remote services", len(cfg.Pinning.RemoteServices)) - // get the most recent MFS root cid - rootNode, err := node.RootNode() - if err != nil { - mfslog.Errorf("pinning reading MFS root (%v)", err) - continue + // pin to all remote services in parallel + pinAllMFS(cctx.Context(), node, cfg, lastPins) } - - // pin to all remote services in parallel - pinAllMFS(cctx.Context(), node, cfg, rootNode.Cid(), lastPins) + // pinAllMFS may take long. Reset interval only when we are done doing it + // so that we are not pinning constantly. + tmo.Reset(configPollInterval) } } // pinAllMFS pins on all remote services in parallel to overcome DoS attacks. -func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, rootCid cid.Cid, lastPins map[string]lastPin) { +func pinAllMFS(ctx context.Context, node pinMFSNode, cfg *config.Config, lastPins map[string]lastPin) { ch := make(chan lastPin) var started int + // Bail out to mitigate issue below when not needing to do anything. + if len(cfg.Pinning.RemoteServices) == 0 { + return + } + + // get the most recent MFS root cid. + // Warning! This can be super expensive. + // See https://github.com/ipfs/boxo/pull/751 + // and https://github.com/ipfs/kubo/issues/8694 + // Reading an MFS-directory nodes can take minutes due to + // ever growing cache being synced to unixfs. + rootNode, err := node.RootNode() + if err != nil { + mfslog.Errorf("pinning reading MFS root (%v)", err) + return + } + rootCid := rootNode.Cid() + for svcName, svcConfig := range cfg.Pinning.RemoteServices { if ctx.Err() != nil { break diff --git a/cmd/ipfs/kubo/pinmfs_test.go b/cmd/ipfs/kubo/pinmfs_test.go index 750be9c987d..6b171cd638e 100644 --- a/cmd/ipfs/kubo/pinmfs_test.go +++ b/cmd/ipfs/kubo/pinmfs_test.go @@ -94,11 +94,24 @@ func TestPinMFSRootNodeError(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), 2*testConfigPollInterval) defer cancel() + // need at least one config to trigger + cfg := &config.Config{ + Pinning: config.Pinning{ + RemoteServices: map[string]config.RemotePinningService{ + "A": { + Policies: config.RemotePinningServicePolicies{ + MFS: config.RemotePinningServiceMFSPolicy{ + Enable: false, + }, + }, + }, + }, + }, + } + cctx := &testPinMFSContext{ ctx: ctx, - cfg: &config.Config{ - Pinning: config.Pinning{}, - }, + cfg: cfg, err: nil, } node := &testPinMFSNode{ diff --git a/core/commands/add.go b/core/commands/add.go index 73491c03b44..8dcdd92171a 100644 --- a/core/commands/add.go +++ b/core/commands/add.go @@ -25,7 +25,7 @@ import ( ) // ErrDepthLimitExceeded indicates that the max depth has been exceeded. -var ErrDepthLimitExceeded = fmt.Errorf("depth limit exceeded") +var ErrDepthLimitExceeded = errors.New("depth limit exceeded") type TimeParts struct { t *time.Time diff --git a/core/commands/cat.go b/core/commands/cat.go index 6fa1f71b79d..38a3e8dfaf6 100644 --- a/core/commands/cat.go +++ b/core/commands/cat.go @@ -2,7 +2,7 @@ package commands import ( "context" - "fmt" + "errors" "io" "os" @@ -43,13 +43,13 @@ var CatCmd = &cmds.Command{ offset, _ := req.Options[offsetOptionName].(int64) if offset < 0 { - return fmt.Errorf("cannot specify negative offset") + return errors.New("cannot specify negative offset") } max, found := req.Options[lengthOptionName].(int64) if max < 0 { - return fmt.Errorf("cannot specify negative length") + return errors.New("cannot specify negative length") } if !found { max = -1 diff --git a/core/commands/cid.go b/core/commands/cid.go index b2e8f131d53..a3f3a5490f4 100644 --- a/core/commands/cid.go +++ b/core/commands/cid.go @@ -1,6 +1,7 @@ package commands import ( + "errors" "fmt" "io" "sort" @@ -85,10 +86,10 @@ The optional format string is a printf style format string: } case "0": if opts.newCodec != 0 && opts.newCodec != cid.DagProtobuf { - return fmt.Errorf("cannot convert to CIDv0 with any codec other than dag-pb") + return errors.New("cannot convert to CIDv0 with any codec other than dag-pb") } if baseStr != "" && baseStr != "base58btc" { - return fmt.Errorf("cannot convert to CIDv0 with any multibase other than the implicit base58btc") + return errors.New("cannot convert to CIDv0 with any multibase other than the implicit base58btc") } opts.verConv = toCidV0 case "1": diff --git a/core/commands/dht.go b/core/commands/dht.go index 1d46201819b..eaa8188e650 100644 --- a/core/commands/dht.go +++ b/core/commands/dht.go @@ -78,7 +78,7 @@ var queryDhtCmd = &cmds.Command{ } if d, ok := client.(kademlia); !ok { - return fmt.Errorf("dht client does not support GetClosestPeers") + return errors.New("dht client does not support GetClosestPeers") } else { errCh := make(chan error, 1) go func() { diff --git a/core/commands/files.go b/core/commands/files.go index d1a52cbfbbb..40e4f3d7aea 100644 --- a/core/commands/files.go +++ b/core/commands/files.go @@ -327,7 +327,7 @@ func statNode(nd ipld.Node, enc cidenc.Encoder) (*statOutput, error) { Type: "file", }, nil default: - return nil, fmt.Errorf("not unixfs node (proto or raw)") + return nil, errors.New("not unixfs node (proto or raw)") } } diff --git a/core/commands/id.go b/core/commands/id.go index 3446fc267cd..33ad0328698 100644 --- a/core/commands/id.go +++ b/core/commands/id.go @@ -81,7 +81,7 @@ EXAMPLE: var err error id, err = peer.Decode(req.Arguments[0]) if err != nil { - return fmt.Errorf("invalid peer id") + return errors.New("invalid peer id") } } else { id = n.Identity diff --git a/core/commands/keystore.go b/core/commands/keystore.go index a86fb281af3..0ffd141891e 100644 --- a/core/commands/keystore.go +++ b/core/commands/keystore.go @@ -5,6 +5,7 @@ import ( "crypto/ed25519" "crypto/x509" "encoding/pem" + "errors" "fmt" "io" "os" @@ -101,12 +102,12 @@ var keyGenCmd = &cmds.Command{ typ, f := req.Options[keyStoreTypeOptionName].(string) if !f { - return fmt.Errorf("please specify a key type with --type") + return errors.New("please specify a key type with --type") } name := req.Arguments[0] if name == "self" { - return fmt.Errorf("cannot create key with name 'self'") + return errors.New("cannot create key with name 'self'") } opts := []options.KeyGenerateOption{options.Key.Type(typ)} diff --git a/core/commands/p2p.go b/core/commands/p2p.go index 7b8b416e59c..1fbdc8a2861 100644 --- a/core/commands/p2p.go +++ b/core/commands/p2p.go @@ -250,7 +250,7 @@ func checkPort(target ma.Multiaddr) error { if sport != "" { return sport, nil } - return "", fmt.Errorf("address does not contain tcp or udp protocol") + return "", errors.New("address does not contain tcp or udp protocol") } sport, err := getPort() @@ -264,7 +264,7 @@ func checkPort(target ma.Multiaddr) error { } if port == 0 { - return fmt.Errorf("port can not be 0") + return errors.New("port can not be 0") } return nil diff --git a/core/commands/routing.go b/core/commands/routing.go index 3e503b014c9..c284166c8d1 100644 --- a/core/commands/routing.go +++ b/core/commands/routing.go @@ -70,7 +70,7 @@ var findProvidersRoutingCmd = &cmds.Command{ numProviders, _ := req.Options[numProvidersOptionName].(int) if numProviders < 1 { - return fmt.Errorf("number of providers must be greater than 0") + return errors.New("number of providers must be greater than 0") } c, err := cid.Parse(req.Arguments[0]) diff --git a/core/commands/stat.go b/core/commands/stat.go index 4ceb95f13d0..3f32a77a6cf 100644 --- a/core/commands/stat.go +++ b/core/commands/stat.go @@ -1,6 +1,7 @@ package commands import ( + "errors" "fmt" "io" "os" @@ -100,7 +101,7 @@ Example: } if nd.Reporter == nil { - return fmt.Errorf("bandwidth reporter disabled in config") + return errors.New("bandwidth reporter disabled in config") } pstr, pfound := req.Options[statPeerOptionName].(string) diff --git a/core/coreapi/coreapi.go b/core/coreapi/coreapi.go index b757929a26c..2cf86e172ef 100644 --- a/core/coreapi/coreapi.go +++ b/core/coreapi/coreapi.go @@ -218,7 +218,7 @@ func (api *CoreAPI) WithOptions(opts ...options.ApiOption) (coreiface.CoreAPI, e cs = node.DefaultIpnsCacheSize } if cs < 0 { - return nil, fmt.Errorf("cannot specify negative resolve cache size") + return nil, errors.New("cannot specify negative resolve cache size") } nsOptions := []namesys.Option{ diff --git a/core/coreapi/key.go b/core/coreapi/key.go index a6101dae826..784045d26e3 100644 --- a/core/coreapi/key.go +++ b/core/coreapi/key.go @@ -65,7 +65,7 @@ func (api *KeyAPI) Generate(ctx context.Context, name string, opts ...caopts.Key } if name == "self" { - return nil, fmt.Errorf("cannot create key with name 'self'") + return nil, errors.New("cannot create key with name 'self'") } _, err = api.repo.Keystore().Get(name) @@ -168,11 +168,11 @@ func (api *KeyAPI) Rename(ctx context.Context, oldName string, newName string, o ks := api.repo.Keystore() if oldName == "self" { - return nil, false, fmt.Errorf("cannot rename key with name 'self'") + return nil, false, errors.New("cannot rename key with name 'self'") } if newName == "self" { - return nil, false, fmt.Errorf("cannot overwrite key with name 'self'") + return nil, false, errors.New("cannot overwrite key with name 'self'") } oldKey, err := ks.Get(oldName) @@ -232,7 +232,7 @@ func (api *KeyAPI) Remove(ctx context.Context, name string) (coreiface.Key, erro ks := api.repo.Keystore() if name == "self" { - return nil, fmt.Errorf("cannot remove key with name 'self'") + return nil, errors.New("cannot remove key with name 'self'") } removed, err := ks.Get(name) diff --git a/core/coreapi/name.go b/core/coreapi/name.go index 3c4145ed501..305c19e43c6 100644 --- a/core/coreapi/name.go +++ b/core/coreapi/name.go @@ -2,6 +2,7 @@ package coreapi import ( "context" + "errors" "fmt" "strings" "time" @@ -214,5 +215,5 @@ func keylookup(self ci.PrivKey, kstore keystore.Keystore, k string) (ci.PrivKey, } } - return nil, fmt.Errorf("no key by the given name or PeerID was found") + return nil, errors.New("no key by the given name or PeerID was found") } diff --git a/core/coreapi/routing.go b/core/coreapi/routing.go index fe273158e1e..6d432d744dd 100644 --- a/core/coreapi/routing.go +++ b/core/coreapi/routing.go @@ -109,7 +109,7 @@ func (api *RoutingAPI) FindProviders(ctx context.Context, p path.Path, opts ...c numProviders := settings.NumProviders if numProviders < 1 { - return nil, fmt.Errorf("number of providers must be greater than 0") + return nil, errors.New("number of providers must be greater than 0") } pchan := api.routing.FindProvidersAsync(ctx, rp.RootCid(), numProviders) diff --git a/core/coreapi/unixfs.go b/core/coreapi/unixfs.go index 9d91f09b6ef..6068c9b0596 100644 --- a/core/coreapi/unixfs.go +++ b/core/coreapi/unixfs.go @@ -72,7 +72,7 @@ func (api *UnixfsAPI) Add(ctx context.Context, files files.Node, opts ...options //} if settings.NoCopy && !(cfg.Experimental.FilestoreEnabled || cfg.Experimental.UrlstoreEnabled) { - return path.ImmutablePath{}, fmt.Errorf("either the filestore or the urlstore must be enabled to use nocopy, see: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore") + return path.ImmutablePath{}, errors.New("either the filestore or the urlstore must be enabled to use nocopy, see: https://github.com/ipfs/kubo/blob/master/docs/experimental-features.md#ipfs-filestore") } addblockstore := api.blockstore diff --git a/core/node/groups.go b/core/node/groups.go index b7c64fd3821..620fe9a5b79 100644 --- a/core/node/groups.go +++ b/core/node/groups.go @@ -301,7 +301,7 @@ func Online(bcfg *BuildCfg, cfg *config.Config, userResourceOverrides rcmgr.Part ipnsCacheSize = DefaultIpnsCacheSize } if ipnsCacheSize < 0 { - return fx.Error(fmt.Errorf("cannot specify negative resolve cache size")) + return fx.Error(errors.New("cannot specify negative resolve cache size")) } // Republisher params diff --git a/core/node/libp2p/rcmgr.go b/core/node/libp2p/rcmgr.go index 977461e04bd..e08b7c5d5e0 100644 --- a/core/node/libp2p/rcmgr.go +++ b/core/node/libp2p/rcmgr.go @@ -3,6 +3,7 @@ package libp2p import ( "context" "encoding/json" + "errors" "fmt" "os" "path/filepath" @@ -26,7 +27,7 @@ var rcmgrLogger = logging.Logger("rcmgr") const NetLimitTraceFilename = "rcmgr.json.gz" -var ErrNoResourceMgr = fmt.Errorf("missing ResourceMgr: make sure the daemon is running with Swarm.ResourceMgr.Enabled") +var ErrNoResourceMgr = errors.New("missing ResourceMgr: make sure the daemon is running with Swarm.ResourceMgr.Enabled") func ResourceManager(repoPath string, cfg config.SwarmConfig, userResourceOverrides rcmgr.PartialLimitConfig) interface{} { return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo) (network.ResourceManager, Libp2pOpts, error) { diff --git a/core/node/libp2p/smux.go b/core/node/libp2p/smux.go index d52b306d85b..5b87f7d0821 100644 --- a/core/node/libp2p/smux.go +++ b/core/node/libp2p/smux.go @@ -1,7 +1,7 @@ package libp2p import ( - "fmt" + "errors" "os" "github.com/ipfs/kubo/config" @@ -12,10 +12,10 @@ import ( func makeSmuxTransportOption(tptConfig config.Transports) (libp2p.Option, error) { if prefs := os.Getenv("LIBP2P_MUX_PREFS"); prefs != "" { - return nil, fmt.Errorf("configuring muxers with LIBP2P_MUX_PREFS is no longer supported, use Swarm.Transports.Multiplexers") + return nil, errors.New("configuring muxers with LIBP2P_MUX_PREFS is no longer supported, use Swarm.Transports.Multiplexers") } if tptConfig.Multiplexers.Yamux < 0 { - return nil, fmt.Errorf("running libp2p with Swarm.Transports.Multiplexers.Yamux disabled is not supported") + return nil, errors.New("running libp2p with Swarm.Transports.Multiplexers.Yamux disabled is not supported") } return libp2p.Muxer(yamux.ID, yamux.DefaultTransport), nil diff --git a/docs/changelogs/v0.33.md b/docs/changelogs/v0.33.md index 99d7109124f..331f76cd1bb 100644 --- a/docs/changelogs/v0.33.md +++ b/docs/changelogs/v0.33.md @@ -38,7 +38,7 @@ Onboarding files and directories with `ipfs add --to-files` now requires non-emp #### 📦️ Dependency updates -- update `boxo` to [v0.24.TODO](https://github.com/ipfs/boxo/releases/tag/v0.24.TODO) +- update `boxo` to [v0.25.0](https://github.com/ipfs/boxo/releases/tag/v0.25.0) - update `go-libp2p` to [v0.37.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.1) + [v0.37.2](https://github.com/libp2p/go-libp2p/releases/tag/v0.37.2) - update `p2p-forge/client` to [v0.1.0](https://github.com/ipshipyard/p2p-forge/releases/tag/v0.1.0) - update `ipfs-webui` to [v4.4.1](https://github.com/ipfs/ipfs-webui/releases/tag/v4.4.1)