3795cc2bd2
This paves the way for better object lifetime management. Concretely, it makes it possible to: - have different stores backing chain and state data. - having the same datastore library, but using different parameters. - attach different caching layers/policies to each class of data, e.g. sizing caches differently. - specifying different retention policies for chain and state data. This separation is important because: - access patterns/frequency of chain and state data are different. - state is derivable from chain, so one could never expunge the chain store, and only retain state objects reachable from the last finality in the state store.
38 lines
1.5 KiB
Go
38 lines
1.5 KiB
Go
package modules
|
|
|
|
import (
|
|
"go.uber.org/fx"
|
|
"golang.org/x/xerrors"
|
|
|
|
"github.com/multiformats/go-multiaddr"
|
|
|
|
"github.com/filecoin-project/lotus/blockstore"
|
|
"github.com/filecoin-project/lotus/node/modules/dtypes"
|
|
"github.com/filecoin-project/lotus/node/modules/helpers"
|
|
)
|
|
|
|
// IpfsClientBlockstore returns a ClientBlockstore implementation backed by an IPFS node.
|
|
// If ipfsMaddr is empty, a local IPFS node is assumed considering IPFS_PATH configuration.
|
|
// If ipfsMaddr is not empty, it will connect to the remote IPFS node with the provided multiaddress.
|
|
// The flag useForRetrieval indicates if the IPFS node will also be used for storing retrieving deals.
|
|
func IpfsClientBlockstore(ipfsMaddr string, onlineMode bool) func(helpers.MetricsCtx, fx.Lifecycle, dtypes.ClientImportMgr) (dtypes.ClientBlockstore, error) {
|
|
return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, localStore dtypes.ClientImportMgr) (dtypes.ClientBlockstore, error) {
|
|
var err error
|
|
var ipfsbs blockstore.BasicBlockstore
|
|
if ipfsMaddr != "" {
|
|
var ma multiaddr.Multiaddr
|
|
ma, err = multiaddr.NewMultiaddr(ipfsMaddr)
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("parsing ipfs multiaddr: %w", err)
|
|
}
|
|
ipfsbs, err = blockstore.NewRemoteIPFSBlockstore(helpers.LifecycleCtx(mctx, lc), ma, onlineMode)
|
|
} else {
|
|
ipfsbs, err = blockstore.NewLocalIPFSBlockstore(helpers.LifecycleCtx(mctx, lc), onlineMode)
|
|
}
|
|
if err != nil {
|
|
return nil, xerrors.Errorf("constructing ipfs blockstore: %w", err)
|
|
}
|
|
return blockstore.WrapIDStore(ipfsbs), nil
|
|
}
|
|
}
|