diff --git a/cmd/ipfs/main.go b/cmd/ipfs/main.go index 6b722c7ef..96f680bcb 100644 --- a/cmd/ipfs/main.go +++ b/cmd/ipfs/main.go @@ -182,7 +182,7 @@ func (i *cmdInvocation) constructNodeFunc(ctx context.Context) func() (*core.Ipf } r := fsrepo.At(i.req.Context().ConfigRoot) - if err := r.Open(); err != nil { + if err := r.Open(); err != nil { // repo is owned by the node return nil, err } diff --git a/core/core.go b/core/core.go index 09ce82af1..2478f493b 100644 --- a/core/core.go +++ b/core/core.go @@ -150,6 +150,18 @@ func Online(r repo.Repo) ConfigOption { // DEPRECATED: use Online, Offline functions func Standard(r repo.Repo, online bool) ConfigOption { return func(ctx context.Context) (n *IpfsNode, err error) { + // FIXME perform node construction in the main constructor so it isn't + // necessary to perform this teardown in this scope. + success := false + defer func() { + if !success && n != nil { + n.teardown() + } + }() + + // TODO move as much of node initialization as possible into + // NewIPFSNode. The larger these config options are, the harder it is + // to test all node construction code paths. if r == nil { return nil, debugerror.Errorf("repo required") @@ -177,15 +189,15 @@ func Standard(r repo.Repo, online bool) ConfigOption { return nil, debugerror.Wrap(err) } - // setup online services if online { if err := n.StartOnlineServices(ctx); err != nil { - return nil, err // debugerror.Wraps. + return nil, err } } else { n.Exchange = offline.Exchange(n.Blockstore) } + success = true return n, nil } }