1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-27 16:07:42 +08:00

feat(core): use repo.Repo in core constructor

This commit is contained in:
Brian Tiger Chow
2015-01-15 11:28:14 -08:00
parent c9a89458a5
commit 4b5ff960c9
8 changed files with 79 additions and 48 deletions

View File

@ -106,7 +106,7 @@ func doInit(repoRoot string, force bool, nBitsForKeypair int) (interface{}, erro
if err := repo.ConfigureEventLogger(conf.Logs); err != nil { if err := repo.ConfigureEventLogger(conf.Logs); err != nil {
return nil, err return nil, err
} }
err = addTheWelcomeFile(conf) err = addTheWelcomeFile(repoRoot)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -116,15 +116,19 @@ func doInit(repoRoot string, force bool, nBitsForKeypair int) (interface{}, erro
// addTheWelcomeFile adds a file containing the welcome message to the newly // addTheWelcomeFile adds a file containing the welcome message to the newly
// minted node. On success, it calls onSuccess // minted node. On success, it calls onSuccess
func addTheWelcomeFile(conf *config.Config) error { func addTheWelcomeFile(repoRoot string) error {
// TODO extract this file creation operation into a function // TODO extract this file creation operation into a function
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
nd, err := core.NewIPFSNode(ctx, core.Offline(conf)) defer cancel()
r := fsrepo.At(repoRoot)
if err := r.Open(); err != nil { // NB: repo is owned by the node
return err
}
nd, err := core.NewIPFSNode(ctx, core.Offline(r))
if err != nil { if err != nil {
return err return err
} }
defer nd.Close() defer nd.Close()
defer cancel()
// Set up default file // Set up default file
reader := bytes.NewBufferString(welcomeMsg) reader := bytes.NewBufferString(welcomeMsg)

View File

@ -181,15 +181,19 @@ func (i *cmdInvocation) constructNodeFunc(ctx context.Context) func() (*core.Ipf
return nil, errors.New("constructing node without a request context") return nil, errors.New("constructing node without a request context")
} }
cfg, err := cmdctx.GetConfig() r := fsrepo.At(i.req.Context().ConfigRoot)
if err != nil { if err := r.Open(); err != nil {
return nil, fmt.Errorf("constructing node without a config: %s", err) return nil, err
} }
// ok everything is good. set it on the invocation (for ownership) // ok everything is good. set it on the invocation (for ownership)
// and return it. // and return it.
i.node, err = core.NewIPFSNode(ctx, core.Standard(cfg, cmdctx.Online)) n, err := core.NewIPFSNode(ctx, core.Standard(r, cmdctx.Online))
return i.node, err if err != nil {
return nil, err
}
i.node = n
return i.node, nil
} }
} }

View File

@ -29,11 +29,11 @@ import (
peer "github.com/jbenet/go-ipfs/p2p/peer" peer "github.com/jbenet/go-ipfs/p2p/peer"
path "github.com/jbenet/go-ipfs/path" path "github.com/jbenet/go-ipfs/path"
pin "github.com/jbenet/go-ipfs/pin" pin "github.com/jbenet/go-ipfs/pin"
repo "github.com/jbenet/go-ipfs/repo"
config "github.com/jbenet/go-ipfs/repo/config" config "github.com/jbenet/go-ipfs/repo/config"
routing "github.com/jbenet/go-ipfs/routing" routing "github.com/jbenet/go-ipfs/routing"
dht "github.com/jbenet/go-ipfs/routing/dht" dht "github.com/jbenet/go-ipfs/routing/dht"
util "github.com/jbenet/go-ipfs/util" util "github.com/jbenet/go-ipfs/util"
ds2 "github.com/jbenet/go-ipfs/util/datastore2"
debugerror "github.com/jbenet/go-ipfs/util/debugerror" debugerror "github.com/jbenet/go-ipfs/util/debugerror"
eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog"
lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables"
@ -59,9 +59,7 @@ type IpfsNode struct {
// Self // Self
Identity peer.ID // the local node's identity Identity peer.ID // the local node's identity
// TODO abstract as repo.Repo Repo repo.Repo
Config *config.Config // the node's configuration
Datastore ds2.ThreadSafeDatastoreCloser // the local datastore
// Local node // Local node
Pinning pin.Pinner // the pinning manager Pinning pin.Pinner // the pinning manager
@ -120,24 +118,24 @@ func NewIPFSNode(ctx context.Context, option ConfigOption) (*IpfsNode, error) {
node.Peerstore = peer.NewPeerstore() node.Peerstore = peer.NewPeerstore()
} }
node.DAG = merkledag.NewDAGService(node.Blocks) node.DAG = merkledag.NewDAGService(node.Blocks)
node.Pinning, err = pin.LoadPinner(node.Datastore, node.DAG) node.Pinning, err = pin.LoadPinner(node.Repo.Datastore(), node.DAG)
if err != nil { if err != nil {
node.Pinning = pin.NewPinner(node.Datastore, node.DAG) node.Pinning = pin.NewPinner(node.Repo.Datastore(), node.DAG)
} }
node.Resolver = &path.Resolver{DAG: node.DAG} node.Resolver = &path.Resolver{DAG: node.DAG}
return node, nil return node, nil
} }
func Offline(cfg *config.Config) ConfigOption { func Offline(r repo.Repo) ConfigOption {
return Standard(cfg, false) return Standard(r, false)
} }
func Online(cfg *config.Config) ConfigOption { func Online(r repo.Repo) ConfigOption {
return Standard(cfg, true) return Standard(r, true)
} }
// DEPRECATED: use Online, Offline functions // DEPRECATED: use Online, Offline functions
func Standard(cfg *config.Config, online bool) ConfigOption { func Standard(r repo.Repo, online bool) ConfigOption {
return func(ctx context.Context) (n *IpfsNode, err error) { return func(ctx context.Context) (n *IpfsNode, err error) {
success := false // flip to true after all sub-system inits succeed success := false // flip to true after all sub-system inits succeed
@ -147,8 +145,8 @@ func Standard(cfg *config.Config, online bool) ConfigOption {
} }
}() }()
if cfg == nil { if r == nil {
return nil, debugerror.Errorf("configuration required") return nil, debugerror.Errorf("repo required")
} }
n = &IpfsNode{ n = &IpfsNode{
mode: func() mode { mode: func() mode {
@ -157,7 +155,7 @@ func Standard(cfg *config.Config, online bool) ConfigOption {
} }
return offlineMode return offlineMode
}(), }(),
Config: cfg, Repo: r,
} }
n.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, n.teardown) n.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, n.teardown)
@ -166,17 +164,12 @@ func Standard(cfg *config.Config, online bool) ConfigOption {
// setup Peerstore // setup Peerstore
n.Peerstore = peer.NewPeerstore() n.Peerstore = peer.NewPeerstore()
// setup datastore.
if n.Datastore, err = makeDatastore(cfg.Datastore); err != nil {
return nil, debugerror.Wrap(err)
}
// setup local peer ID (private key is loaded in online setup) // setup local peer ID (private key is loaded in online setup)
if err := n.loadID(); err != nil { if err := n.loadID(); err != nil {
return nil, err return nil, err
} }
n.Blockstore, err = bstore.WriteCached(bstore.NewBlockstore(n.Datastore), kSizeBlockstoreWriteCache) n.Blockstore, err = bstore.WriteCached(bstore.NewBlockstore(n.Repo.Datastore()), kSizeBlockstoreWriteCache)
if err != nil { if err != nil {
return nil, debugerror.Wrap(err) return nil, debugerror.Wrap(err)
} }
@ -207,7 +200,7 @@ func (n *IpfsNode) StartOnlineServices() error {
return err return err
} }
peerhost, err := constructPeerHost(ctx, n.ContextGroup, n.Config, n.Identity, n.Peerstore) peerhost, err := constructPeerHost(ctx, n.ContextGroup, n.Repo.Config(), n.Identity, n.Peerstore)
if err != nil { if err != nil {
return debugerror.Wrap(err) return debugerror.Wrap(err)
} }
@ -217,7 +210,7 @@ func (n *IpfsNode) StartOnlineServices() error {
n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost) n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost)
// setup routing service // setup routing service
dhtRouting, err := constructDHTRouting(ctx, n.ContextGroup, n.PeerHost, n.Datastore) dhtRouting, err := constructDHTRouting(ctx, n.ContextGroup, n.PeerHost, n.Repo.Datastore())
if err != nil { if err != nil {
return debugerror.Wrap(err) return debugerror.Wrap(err)
} }
@ -240,7 +233,7 @@ func (n *IpfsNode) StartOnlineServices() error {
// manage the wiring. In that scenario, this dangling function is a bit // manage the wiring. In that scenario, this dangling function is a bit
// awkward. // awkward.
var bootstrapPeers []peer.PeerInfo var bootstrapPeers []peer.PeerInfo
for _, bootstrap := range n.Config.Bootstrap { for _, bootstrap := range n.Repo.Config().Bootstrap {
p, err := toPeer(bootstrap) p, err := toPeer(bootstrap)
if err != nil { if err != nil {
log.Event(ctx, "bootstrapError", n.Identity, lgbl.Error(err)) log.Event(ctx, "bootstrapError", n.Identity, lgbl.Error(err))
@ -258,7 +251,7 @@ func (n *IpfsNode) StartOnlineServices() error {
} }
func (n *IpfsNode) teardown() error { func (n *IpfsNode) teardown() error {
if err := n.Datastore.Close(); err != nil { if err := n.Repo.Close(); err != nil {
return err return err
} }
return nil return nil
@ -293,7 +286,7 @@ func (n *IpfsNode) loadID() error {
return debugerror.New("identity already loaded") return debugerror.New("identity already loaded")
} }
cid := n.Config.Identity.PeerID cid := n.Repo.Config().Identity.PeerID
if cid == "" { if cid == "" {
return debugerror.New("Identity was not set in config (was ipfs init run?)") return debugerror.New("Identity was not set in config (was ipfs init run?)")
} }
@ -314,7 +307,7 @@ func (n *IpfsNode) loadPrivateKey() error {
return debugerror.New("private key already loaded") return debugerror.New("private key already loaded")
} }
sk, err := loadPrivateKey(&n.Config.Identity, n.Identity) sk, err := loadPrivateKey(&n.Repo.Config().Identity, n.Identity)
if err != nil { if err != nil {
return err return err
} }

View File

@ -4,7 +4,9 @@ import (
"testing" "testing"
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
"github.com/jbenet/go-ipfs/repo"
config "github.com/jbenet/go-ipfs/repo/config" config "github.com/jbenet/go-ipfs/repo/config"
"github.com/jbenet/go-ipfs/util/testutil"
) )
func TestInitialization(t *testing.T) { func TestInitialization(t *testing.T) {
@ -42,14 +44,22 @@ func TestInitialization(t *testing.T) {
} }
for i, c := range good { for i, c := range good {
n, err := NewIPFSNode(ctx, Standard(c, false)) r := &repo.Mock{
C: *c,
D: testutil.ThreadSafeCloserMapDatastore(),
}
n, err := NewIPFSNode(ctx, Standard(r, false))
if n == nil || err != nil { if n == nil || err != nil {
t.Error("Should have constructed.", i, err) t.Error("Should have constructed.", i, err)
} }
} }
for i, c := range bad { for i, c := range bad {
n, err := NewIPFSNode(ctx, Standard(c, false)) r := &repo.Mock{
C: *c,
D: testutil.ThreadSafeCloserMapDatastore(),
}
n, err := NewIPFSNode(ctx, Standard(r, false))
if n != nil || err == nil { if n != nil || err == nil {
t.Error("Should have failed to construct.", i) t.Error("Should have failed to construct.", i)
} }

View File

@ -2,8 +2,7 @@ package core
import ( import (
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
"github.com/jbenet/go-ipfs/blocks/blockstore" "github.com/jbenet/go-ipfs/blocks/blockstore"
blockservice "github.com/jbenet/go-ipfs/blockservice" blockservice "github.com/jbenet/go-ipfs/blockservice"
@ -13,6 +12,7 @@ import (
mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock"
peer "github.com/jbenet/go-ipfs/p2p/peer" peer "github.com/jbenet/go-ipfs/p2p/peer"
path "github.com/jbenet/go-ipfs/path" path "github.com/jbenet/go-ipfs/path"
"github.com/jbenet/go-ipfs/repo"
mockrouting "github.com/jbenet/go-ipfs/routing/mock" mockrouting "github.com/jbenet/go-ipfs/routing/mock"
ds2 "github.com/jbenet/go-ipfs/util/datastore2" ds2 "github.com/jbenet/go-ipfs/util/datastore2"
testutil "github.com/jbenet/go-ipfs/util/testutil" testutil "github.com/jbenet/go-ipfs/util/testutil"
@ -46,14 +46,16 @@ func NewMockNode() (*IpfsNode, error) {
} }
// Temp Datastore // Temp Datastore
dstore := ds.NewMapDatastore() nd.Repo = &repo.Mock{
nd.Datastore = ds2.CloserWrap(syncds.MutexWrap(dstore)) // TODO C: conf,
D: ds2.CloserWrap(syncds.MutexWrap(datastore.NewMapDatastore())),
}
// Routing // Routing
nd.Routing = mockrouting.NewServer().Client(ident) nd.Routing = mockrouting.NewServer().Client(ident)
// Bitswap // Bitswap
bstore := blockstore.NewBlockstore(nd.Datastore) bstore := blockstore.NewBlockstore(nd.Repo.Datastore())
bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) bserv, err := blockservice.New(bstore, offline.Exchange(bstore))
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -1,6 +1,8 @@
package repo package repo
import ( import (
"io"
datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
config "github.com/jbenet/go-ipfs/repo/config" config "github.com/jbenet/go-ipfs/repo/config"
util "github.com/jbenet/go-ipfs/util" util "github.com/jbenet/go-ipfs/util"
@ -14,6 +16,8 @@ type Repo interface {
GetConfigKey(key string) (interface{}, error) GetConfigKey(key string) (interface{}, error)
Datastore() datastore.ThreadSafeDatastore Datastore() datastore.ThreadSafeDatastore
io.Closer
} }
// IsInitialized returns true if the path is home to an initialized IPFS // IsInitialized returns true if the path is home to an initialized IPFS

View File

@ -2,19 +2,19 @@ package epictest
import ( import (
context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore"
core "github.com/jbenet/go-ipfs/core" core "github.com/jbenet/go-ipfs/core"
bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" bitswap "github.com/jbenet/go-ipfs/exchange/bitswap"
bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network"
host "github.com/jbenet/go-ipfs/p2p/host" host "github.com/jbenet/go-ipfs/p2p/host"
peer "github.com/jbenet/go-ipfs/p2p/peer" peer "github.com/jbenet/go-ipfs/p2p/peer"
"github.com/jbenet/go-ipfs/repo"
dht "github.com/jbenet/go-ipfs/routing/dht" dht "github.com/jbenet/go-ipfs/routing/dht"
delay "github.com/jbenet/go-ipfs/thirdparty/delay" delay "github.com/jbenet/go-ipfs/thirdparty/delay"
eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog"
"github.com/jbenet/go-ipfs/util/datastore2" ds2 "github.com/jbenet/go-ipfs/util/datastore2"
testutil "github.com/jbenet/go-ipfs/util/testutil" testutil "github.com/jbenet/go-ipfs/util/testutil"
) )
@ -25,7 +25,10 @@ func MocknetTestRepo(p peer.ID, h host.Host, conf testutil.LatencyConfig) core.C
const kWriteCacheElems = 100 const kWriteCacheElems = 100
const alwaysSendToPeer = true const alwaysSendToPeer = true
dsDelay := delay.Fixed(conf.BlockstoreLatency) dsDelay := delay.Fixed(conf.BlockstoreLatency)
ds := datastore2.CloserWrap(sync.MutexWrap(datastore2.WithDelay(datastore.NewMapDatastore(), dsDelay))) r := &repo.Mock{
D: ds2.CloserWrap(syncds.MutexWrap(ds2.WithDelay(datastore.NewMapDatastore(), dsDelay))),
}
ds := r.Datastore()
log.Debugf("MocknetTestRepo: %s %s %s", p, h.ID(), h) log.Debugf("MocknetTestRepo: %s %s %s", p, h.ID(), h)
dhtt := dht.NewDHT(ctx, h, ds) dhtt := dht.NewDHT(ctx, h, ds)
@ -39,7 +42,7 @@ func MocknetTestRepo(p peer.ID, h host.Host, conf testutil.LatencyConfig) core.C
Peerstore: h.Peerstore(), Peerstore: h.Peerstore(),
Blockstore: bstore, Blockstore: bstore,
Exchange: exch, Exchange: exch,
Datastore: ds, Repo: r,
PeerHost: h, PeerHost: h,
Routing: dhtt, Routing: dhtt,
Identity: p, Identity: p,

View File

@ -0,0 +1,11 @@
package testutil
import (
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore"
syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync"
ds2 "github.com/jbenet/go-ipfs/util/datastore2"
)
func ThreadSafeCloserMapDatastore() ds2.ThreadSafeDatastoreCloser {
return ds2.CloserWrap(syncds.MutexWrap(datastore.NewMapDatastore()))
}