More constructor fixes

License: MIT
Signed-off-by: Łukasz Magiera <magik6k@gmail.com>
This commit is contained in:
Łukasz Magiera 2019-03-28 02:57:13 +01:00 committed by Steven Allen
parent 65d8fad008
commit ccc576b693
3 changed files with 47 additions and 31 deletions

View File

@ -162,6 +162,7 @@ func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
storage := fx.Options(
fx.Provide(repoConfig),
fx.Provide(datastoreCtor),
fx.Provide(baseBlockstoreCtor),
fx.Provide(gcBlockstoreCtor),
)
@ -169,23 +170,39 @@ func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
ident := fx.Options(
fx.Provide(identity),
fx.Provide(privateKey),
fx.Provide(peerstore),
)
ipns := fx.Options(
fx.Provide(recordValidator),
)
providers := fx.Options(
fx.Provide(providerQueue),
fx.Provide(providerCtor),
fx.Provide(reproviderCtor),
fx.Invoke(reprovider),
fx.Invoke(provider.Provider.Run),
)
online := fx.Options(
fx.Provide(onlineExchangeCtor),
fx.Provide(onlineNamesysCtor),
fx.Invoke(ipnsRepublisher),
fx.Invoke(provider.Provider.Run),
fx.Provide(p2p.NewP2P),
ipfsp2p,
providers,
)
if !cfg.Online {
online = fx.Options(
fx.Provide(offline.Exchange),
fx.Provide(offlineNamesysCtor),
fx.Provide(offroute.NewOfflineRouter),
fx.Provide(provider.NewOfflineProvider),
)
}
@ -197,13 +214,6 @@ func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
fx.Provide(files),
)
providers := fx.Options(
fx.Provide(providerQueue),
fx.Provide(providerCtor),
fx.Provide(reproviderCtor),
fx.Invoke(reprovider),
)
n := &IpfsNode{
ctx: ctx,
}
@ -212,21 +222,18 @@ func NewNode(ctx context.Context, cfg *BuildCfg) (*IpfsNode, error) {
params,
storage,
ident,
ipfsp2p,
ipns,
online,
fx.Invoke(setupSharding),
core,
providers,
fx.Provide(p2p.NewP2P),
fx.Extract(n),
)
n.IsOnline = cfg.Online
n.app = app
/* n := &IpfsNode{
IsOnline: cfg.Online,

View File

@ -20,6 +20,8 @@ import (
"strings"
"time"
"go.uber.org/fx"
version "github.com/ipfs/go-ipfs"
rp "github.com/ipfs/go-ipfs/exchange/reprovide"
filestore "github.com/ipfs/go-ipfs/filestore"
@ -101,10 +103,10 @@ type IpfsNode struct {
Pinning pin.Pinner // the pinning manager
Mounts Mounts `optional:"true"` // current mount state, if any.
PrivateKey ic.PrivKey // the local node's private Key
PNetFingerprint PNetFingerprint // fingerprint of private network
PNetFingerprint PNetFingerprint `optional:"true"` // fingerprint of private network
// Services
Peerstore pstore.Peerstore // storage for other Peer instances
Peerstore pstore.Peerstore `optional:"true"` // storage for other Peer instances
Blockstore bstore.GCBlockstore // the block store (lower level)
Filestore *filestore.Filestore // the filestore blockstore
BaseBlocks bstore.Blockstore // the raw blockstore, no filestore wrapping
@ -112,30 +114,32 @@ type IpfsNode struct {
Blocks bserv.BlockService // the block service, get/add blocks.
DAG ipld.DAGService // the merkle dag service, get/add objects.
Resolver *resolver.Resolver // the path resolution system
Reporter metrics.Reporter
Reporter metrics.Reporter `optional:"true"`
Discovery discovery.Service `optional:"true"`
FilesRoot *mfs.Root
RecordValidator record.Validator
// Online
PeerHost p2phost.Host // the network host (server+client)
PeerHost p2phost.Host `optional:"true"` // the network host (server+client)
Bootstrapper io.Closer `optional:"true"` // the periodic bootstrapper
Routing routing.IpfsRouting // the routing system. recommend ipfs-dht
Routing routing.IpfsRouting `optional:"true"` // the routing system. recommend ipfs-dht
Exchange exchange.Interface // the block exchange + strategy (bitswap)
Namesys namesys.NameSystem // the name system, resolves paths to hashes
Provider provider.Provider // the value provider system
Reprovider *rp.Reprovider // the value reprovider system
Provider provider.Provider // the value provider system
Reprovider *rp.Reprovider `optional:"true"` // the value reprovider system
IpnsRepub *ipnsrp.Republisher `optional:"true"`
AutoNAT *autonat.AutoNATService `optional:"true"`
PubSub *pubsub.PubSub
PSRouter *psrouter.PubsubValueStore
DHT *dht.IpfsDHT
P2P *p2p.P2P
PubSub *pubsub.PubSub `optional:"true"`
PSRouter *psrouter.PubsubValueStore `optional:"true"`
DHT *dht.IpfsDHT `optional:"true"`
P2P *p2p.P2P `optional:"true"`
proc goprocess.Process
proc goprocess.Process //TODO: remove
ctx context.Context
app *fx.App
// Flags
IsOnline bool `optional:"true"` // Online is set when networking is enabled.
IsDaemon bool `optional:"true"` // Daemon is set when running on a long-running daemon.
@ -648,9 +652,9 @@ func (n *IpfsNode) Process() goprocess.Process {
return n.proc
}
// Close calls Close() on the Process object
// Close calls Close() on the App object
func (n *IpfsNode) Close() error {
return n.proc.Close()
return n.app.Stop(n.ctx)
}
// Context returns the IpfsNode context

View File

@ -111,6 +111,10 @@ func privateKey(cfg *iconfig.Config, id peer.ID) (ic.PrivKey, error) {
return sk, nil
}
func datastoreCtor(repo repo.Repo) ds.Datastore {
return repo.Datastore()
}
func baseBlockstoreCtor(repo repo.Repo, cfg *iconfig.Config, bcfg *BuildCfg, lc fx.Lifecycle) (bs bstore.Blockstore, err error) {
rds := &retry.Datastore{
Batching: repo.Datastore(),
@ -180,8 +184,6 @@ func recordValidator(ps pstore.Peerstore) record.Validator {
// libp2p
var ipfsp2p = fx.Options(
fx.Provide(peerstore),
fx.Provide(p2pAddrFilters),
fx.Provide(p2pBandwidthCounter),
fx.Provide(p2pPNet),
@ -411,6 +413,9 @@ func p2pHost(lc fx.Lifecycle, params p2pHostIn) (out p2pHostOut, err error) {
}))
out.Host, err = params.HostOption(ctx, params.ID, params.Peerstore, opts...)
if err != nil {
return p2pHostOut{}, err
}
// this code is necessary just for tests: mock network constructions
// ignore the libp2p constructor options that actually construct the routing!
@ -758,14 +763,14 @@ func lifecycleCtx(lc fx.Lifecycle) context.Context {
}
func lcGoProc(lc fx.Lifecycle, processFunc goprocess.ProcessFunc) {
proc := goprocess.Background()
proc := make(chan goprocess.Process, 1)
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
proc.Go(processFunc)
proc <- goprocess.Go(processFunc)
return nil
},
OnStop: func(ctx context.Context) error {
return proc.Close() // todo: respect ctx
return (<-proc).Close() // todo: respect ctx
},
})
}