From aec0b31d4442e3fe0c9c47f80e134a68ccab7f32 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 11:15:11 -0800 Subject: [PATCH 01/16] eventlog: rm noisy low-signal statement --- p2p/protocol/mux.go | 1 - 1 file changed, 1 deletion(-) diff --git a/p2p/protocol/mux.go b/p2p/protocol/mux.go index 6ba99e4f2..91f28413f 100644 --- a/p2p/protocol/mux.go +++ b/p2p/protocol/mux.go @@ -116,7 +116,6 @@ func (m *Mux) HandleSync(s inet.Stream) { } log.Infof("muxer handle protocol: %s", name) - log.Event(ctx, "muxHandle", eventlog.Metadata{"protocol": name}) handler(s) } From 03486a5109023ab6202f93f5ea7521eb14dd0587 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 11:16:55 -0800 Subject: [PATCH 02/16] rm unused proto cc @jbenet @whyrusleeping --- p2p/crypto/secio/pb/Makefile | 10 --- p2p/crypto/secio/pb/spipe.pb.go | 130 -------------------------------- p2p/crypto/secio/pb/spipe.proto | 14 ---- 3 files changed, 154 deletions(-) delete mode 100644 p2p/crypto/secio/pb/Makefile delete mode 100644 p2p/crypto/secio/pb/spipe.pb.go delete mode 100644 p2p/crypto/secio/pb/spipe.proto diff --git a/p2p/crypto/secio/pb/Makefile b/p2p/crypto/secio/pb/Makefile deleted file mode 100644 index 334feee74..000000000 --- a/p2p/crypto/secio/pb/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -PB = $(wildcard *.proto) -GO = $(PB:.proto=.pb.go) - -all: $(GO) - -%.pb.go: %.proto - protoc --gogo_out=. --proto_path=../../../../../../:/usr/local/opt/protobuf/include:. $< - -clean: - rm *.pb.go diff --git a/p2p/crypto/secio/pb/spipe.pb.go b/p2p/crypto/secio/pb/spipe.pb.go deleted file mode 100644 index 684ce5da9..000000000 --- a/p2p/crypto/secio/pb/spipe.pb.go +++ /dev/null @@ -1,130 +0,0 @@ -// Code generated by protoc-gen-gogo. -// source: spipe.proto -// DO NOT EDIT! - -/* -Package spipe_pb is a generated protocol buffer package. - -It is generated from these files: - spipe.proto - -It has these top-level messages: - Propose - Exchange - DataSig -*/ -package spipe_pb - -import proto "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/gogoprotobuf/proto" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = math.Inf - -type Propose struct { - Rand []byte `protobuf:"bytes,1,opt,name=rand" json:"rand,omitempty"` - Pubkey []byte `protobuf:"bytes,2,opt,name=pubkey" json:"pubkey,omitempty"` - Exchanges *string `protobuf:"bytes,3,opt,name=exchanges" json:"exchanges,omitempty"` - Ciphers *string `protobuf:"bytes,4,opt,name=ciphers" json:"ciphers,omitempty"` - Hashes *string `protobuf:"bytes,5,opt,name=hashes" json:"hashes,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Propose) Reset() { *m = Propose{} } -func (m *Propose) String() string { return proto.CompactTextString(m) } -func (*Propose) ProtoMessage() {} - -func (m *Propose) GetRand() []byte { - if m != nil { - return m.Rand - } - return nil -} - -func (m *Propose) GetPubkey() []byte { - if m != nil { - return m.Pubkey - } - return nil -} - -func (m *Propose) GetExchanges() string { - if m != nil && m.Exchanges != nil { - return *m.Exchanges - } - return "" -} - -func (m *Propose) GetCiphers() string { - if m != nil && m.Ciphers != nil { - return *m.Ciphers - } - return "" -} - -func (m *Propose) GetHashes() string { - if m != nil && m.Hashes != nil { - return *m.Hashes - } - return "" -} - -type Exchange struct { - Epubkey []byte `protobuf:"bytes,1,opt,name=epubkey" json:"epubkey,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *Exchange) Reset() { *m = Exchange{} } -func (m *Exchange) String() string { return proto.CompactTextString(m) } -func (*Exchange) ProtoMessage() {} - -func (m *Exchange) GetEpubkey() []byte { - if m != nil { - return m.Epubkey - } - return nil -} - -func (m *Exchange) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -type DataSig struct { - Data []byte `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` - Signature []byte `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"` - Id *uint64 `protobuf:"varint,3,opt,name=id" json:"id,omitempty"` - XXX_unrecognized []byte `json:"-"` -} - -func (m *DataSig) Reset() { *m = DataSig{} } -func (m *DataSig) String() string { return proto.CompactTextString(m) } -func (*DataSig) ProtoMessage() {} - -func (m *DataSig) GetData() []byte { - if m != nil { - return m.Data - } - return nil -} - -func (m *DataSig) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *DataSig) GetId() uint64 { - if m != nil && m.Id != nil { - return *m.Id - } - return 0 -} - -func init() { -} diff --git a/p2p/crypto/secio/pb/spipe.proto b/p2p/crypto/secio/pb/spipe.proto deleted file mode 100644 index a7a467737..000000000 --- a/p2p/crypto/secio/pb/spipe.proto +++ /dev/null @@ -1,14 +0,0 @@ -package spipe.pb; - -message Propose { - optional bytes rand = 1; - optional bytes pubkey = 2; - optional string exchanges = 3; - optional string ciphers = 4; - optional string hashes = 5; -} - -message Exchange { - optional bytes epubkey = 1; - optional bytes signature = 2; -} From c9a89458a53c0abce4cbd8f03efccdf54eb1256f Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Wed, 14 Jan 2015 18:55:58 -0800 Subject: [PATCH 03/16] repo/mock: basic impl --- repo/mock.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 repo/mock.go diff --git a/repo/mock.go b/repo/mock.go new file mode 100644 index 000000000..d4d4e5ea8 --- /dev/null +++ b/repo/mock.go @@ -0,0 +1,37 @@ +package repo + +import ( + "errors" + + ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" + "github.com/jbenet/go-ipfs/repo/config" +) + +var errTODO = errors.New("TODO") + +// Mock is not thread-safe +type Mock struct { + C config.Config + D ds.ThreadSafeDatastore +} + +func (m *Mock) Config() *config.Config { + return &m.C // FIXME threadsafety +} + +func (m *Mock) SetConfig(updated *config.Config) error { + m.C = *updated // FIXME threadsafety + return nil +} + +func (m *Mock) SetConfigKey(key string, value interface{}) error { + return errTODO +} + +func (m *Mock) GetConfigKey(key string) (interface{}, error) { + return nil, errTODO +} + +func (m *Mock) Datastore() ds.ThreadSafeDatastore { return m.D } + +func (m *Mock) Close() error { return errTODO } From 4b5ff960c93ae478cbf174cea175fdd5924d76ac Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 11:28:14 -0800 Subject: [PATCH 04/16] feat(core): use repo.Repo in core constructor --- cmd/ipfs/init.go | 12 ++++++---- cmd/ipfs/main.go | 14 +++++++----- core/core.go | 45 ++++++++++++++++---------------------- core/core_test.go | 14 ++++++++++-- core/mock.go | 12 +++++----- repo/repo.go | 4 ++++ test/epictest/core.go | 15 ++++++++----- util/testutil/datastore.go | 11 ++++++++++ 8 files changed, 79 insertions(+), 48 deletions(-) create mode 100644 util/testutil/datastore.go diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index 1791b28cf..7afa23e70 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -106,7 +106,7 @@ func doInit(repoRoot string, force bool, nBitsForKeypair int) (interface{}, erro if err := repo.ConfigureEventLogger(conf.Logs); err != nil { return nil, err } - err = addTheWelcomeFile(conf) + err = addTheWelcomeFile(repoRoot) if err != nil { 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 // 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 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 { return err } defer nd.Close() - defer cancel() // Set up default file reader := bytes.NewBufferString(welcomeMsg) diff --git a/cmd/ipfs/main.go b/cmd/ipfs/main.go index f2cdf9e00..6b722c7ef 100644 --- a/cmd/ipfs/main.go +++ b/cmd/ipfs/main.go @@ -181,15 +181,19 @@ func (i *cmdInvocation) constructNodeFunc(ctx context.Context) func() (*core.Ipf return nil, errors.New("constructing node without a request context") } - cfg, err := cmdctx.GetConfig() - if err != nil { - return nil, fmt.Errorf("constructing node without a config: %s", err) + r := fsrepo.At(i.req.Context().ConfigRoot) + if err := r.Open(); err != nil { + return nil, err } // ok everything is good. set it on the invocation (for ownership) // and return it. - i.node, err = core.NewIPFSNode(ctx, core.Standard(cfg, cmdctx.Online)) - return i.node, err + n, err := core.NewIPFSNode(ctx, core.Standard(r, cmdctx.Online)) + if err != nil { + return nil, err + } + i.node = n + return i.node, nil } } diff --git a/core/core.go b/core/core.go index f643890d4..28c53b5c6 100644 --- a/core/core.go +++ b/core/core.go @@ -29,11 +29,11 @@ import ( peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" pin "github.com/jbenet/go-ipfs/pin" + repo "github.com/jbenet/go-ipfs/repo" config "github.com/jbenet/go-ipfs/repo/config" routing "github.com/jbenet/go-ipfs/routing" dht "github.com/jbenet/go-ipfs/routing/dht" util "github.com/jbenet/go-ipfs/util" - ds2 "github.com/jbenet/go-ipfs/util/datastore2" debugerror "github.com/jbenet/go-ipfs/util/debugerror" eventlog "github.com/jbenet/go-ipfs/thirdparty/eventlog" lgbl "github.com/jbenet/go-ipfs/util/eventlog/loggables" @@ -59,9 +59,7 @@ type IpfsNode struct { // Self Identity peer.ID // the local node's identity - // TODO abstract as repo.Repo - Config *config.Config // the node's configuration - Datastore ds2.ThreadSafeDatastoreCloser // the local datastore + Repo repo.Repo // Local node Pinning pin.Pinner // the pinning manager @@ -120,24 +118,24 @@ func NewIPFSNode(ctx context.Context, option ConfigOption) (*IpfsNode, error) { node.Peerstore = peer.NewPeerstore() } 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 { - node.Pinning = pin.NewPinner(node.Datastore, node.DAG) + node.Pinning = pin.NewPinner(node.Repo.Datastore(), node.DAG) } node.Resolver = &path.Resolver{DAG: node.DAG} return node, nil } -func Offline(cfg *config.Config) ConfigOption { - return Standard(cfg, false) +func Offline(r repo.Repo) ConfigOption { + return Standard(r, false) } -func Online(cfg *config.Config) ConfigOption { - return Standard(cfg, true) +func Online(r repo.Repo) ConfigOption { + return Standard(r, true) } // 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) { 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 { - return nil, debugerror.Errorf("configuration required") + if r == nil { + return nil, debugerror.Errorf("repo required") } n = &IpfsNode{ mode: func() mode { @@ -157,7 +155,7 @@ func Standard(cfg *config.Config, online bool) ConfigOption { } return offlineMode }(), - Config: cfg, + Repo: r, } n.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, n.teardown) @@ -166,17 +164,12 @@ func Standard(cfg *config.Config, online bool) ConfigOption { // setup Peerstore 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) if err := n.loadID(); err != nil { 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 { return nil, debugerror.Wrap(err) } @@ -207,7 +200,7 @@ func (n *IpfsNode) StartOnlineServices() error { 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 { return debugerror.Wrap(err) } @@ -217,7 +210,7 @@ func (n *IpfsNode) StartOnlineServices() error { n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost) // 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 { 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 // awkward. var bootstrapPeers []peer.PeerInfo - for _, bootstrap := range n.Config.Bootstrap { + for _, bootstrap := range n.Repo.Config().Bootstrap { p, err := toPeer(bootstrap) if err != nil { log.Event(ctx, "bootstrapError", n.Identity, lgbl.Error(err)) @@ -258,7 +251,7 @@ func (n *IpfsNode) StartOnlineServices() error { } func (n *IpfsNode) teardown() error { - if err := n.Datastore.Close(); err != nil { + if err := n.Repo.Close(); err != nil { return err } return nil @@ -293,7 +286,7 @@ func (n *IpfsNode) loadID() error { return debugerror.New("identity already loaded") } - cid := n.Config.Identity.PeerID + cid := n.Repo.Config().Identity.PeerID if cid == "" { 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") } - sk, err := loadPrivateKey(&n.Config.Identity, n.Identity) + sk, err := loadPrivateKey(&n.Repo.Config().Identity, n.Identity) if err != nil { return err } diff --git a/core/core_test.go b/core/core_test.go index 5931cffd0..293bac0f6 100644 --- a/core/core_test.go +++ b/core/core_test.go @@ -4,7 +4,9 @@ import ( "testing" 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" + "github.com/jbenet/go-ipfs/util/testutil" ) func TestInitialization(t *testing.T) { @@ -42,14 +44,22 @@ func TestInitialization(t *testing.T) { } 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 { t.Error("Should have constructed.", i, err) } } 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 { t.Error("Should have failed to construct.", i) } diff --git a/core/mock.go b/core/mock.go index e4c15540b..040aab03e 100644 --- a/core/mock.go +++ b/core/mock.go @@ -2,8 +2,7 @@ package core import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" - - ds "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" syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" "github.com/jbenet/go-ipfs/blocks/blockstore" blockservice "github.com/jbenet/go-ipfs/blockservice" @@ -13,6 +12,7 @@ import ( mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" peer "github.com/jbenet/go-ipfs/p2p/peer" path "github.com/jbenet/go-ipfs/path" + "github.com/jbenet/go-ipfs/repo" mockrouting "github.com/jbenet/go-ipfs/routing/mock" ds2 "github.com/jbenet/go-ipfs/util/datastore2" testutil "github.com/jbenet/go-ipfs/util/testutil" @@ -46,14 +46,16 @@ func NewMockNode() (*IpfsNode, error) { } // Temp Datastore - dstore := ds.NewMapDatastore() - nd.Datastore = ds2.CloserWrap(syncds.MutexWrap(dstore)) + nd.Repo = &repo.Mock{ + // TODO C: conf, + D: ds2.CloserWrap(syncds.MutexWrap(datastore.NewMapDatastore())), + } // Routing nd.Routing = mockrouting.NewServer().Client(ident) // Bitswap - bstore := blockstore.NewBlockstore(nd.Datastore) + bstore := blockstore.NewBlockstore(nd.Repo.Datastore()) bserv, err := blockservice.New(bstore, offline.Exchange(bstore)) if err != nil { return nil, err diff --git a/repo/repo.go b/repo/repo.go index 616c1ebc9..ee6899779 100644 --- a/repo/repo.go +++ b/repo/repo.go @@ -1,6 +1,8 @@ package repo import ( + "io" + datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" config "github.com/jbenet/go-ipfs/repo/config" util "github.com/jbenet/go-ipfs/util" @@ -14,6 +16,8 @@ type Repo interface { GetConfigKey(key string) (interface{}, error) Datastore() datastore.ThreadSafeDatastore + + io.Closer } // IsInitialized returns true if the path is home to an initialized IPFS diff --git a/test/epictest/core.go b/test/epictest/core.go index 2208a8f60..23a4a6ffc 100644 --- a/test/epictest/core.go +++ b/test/epictest/core.go @@ -2,19 +2,19 @@ package epictest import ( 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" - sync "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" + syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" core "github.com/jbenet/go-ipfs/core" bitswap "github.com/jbenet/go-ipfs/exchange/bitswap" bsnet "github.com/jbenet/go-ipfs/exchange/bitswap/network" host "github.com/jbenet/go-ipfs/p2p/host" peer "github.com/jbenet/go-ipfs/p2p/peer" + "github.com/jbenet/go-ipfs/repo" dht "github.com/jbenet/go-ipfs/routing/dht" delay "github.com/jbenet/go-ipfs/thirdparty/delay" 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" ) @@ -25,7 +25,10 @@ func MocknetTestRepo(p peer.ID, h host.Host, conf testutil.LatencyConfig) core.C const kWriteCacheElems = 100 const alwaysSendToPeer = true 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) 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(), Blockstore: bstore, Exchange: exch, - Datastore: ds, + Repo: r, PeerHost: h, Routing: dhtt, Identity: p, diff --git a/util/testutil/datastore.go b/util/testutil/datastore.go new file mode 100644 index 000000000..d635df428 --- /dev/null +++ b/util/testutil/datastore.go @@ -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())) +} From 3dd68ba5c500d3d6315797c6bd77bb65486202e3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 11:59:46 -0800 Subject: [PATCH 05/16] fix(core_io/Add): by default, use pinner @whyrusleeping @jbenet does passing this argument effectively instruct the dagbuilder to pin recursively? --- core/io/add.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/io/add.go b/core/io/add.go index 384cbba90..b12bc6380 100644 --- a/core/io/add.go +++ b/core/io/add.go @@ -25,7 +25,7 @@ func Add(n *core.IpfsNode, r io.Reader) (u.Key, error) { dagNode, err := importer.BuildDagFromReader( r, n.DAG, - nil, + n.Pinning.GetManual(), // Fix this interface chunk.DefaultSplitter, ) if err != nil { From ffe6f9a949ef0105afd74f1fc48ef909f13449f2 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 12:06:25 -0800 Subject: [PATCH 06/16] doc(core_io/Add) @jbenet wasn't sure about the terminology here. I'm certain what I wrote is not entirely correct. Feel free to edit. --- core/io/add.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/io/add.go b/core/io/add.go index b12bc6380..50b8832fb 100644 --- a/core/io/add.go +++ b/core/io/add.go @@ -20,6 +20,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +// Add builds a merkledag from the a reader, pinning all objects to the local +// datastore. Returns a key representing the root node. func Add(n *core.IpfsNode, r io.Reader) (u.Key, error) { // TODO more attractive function signature importer.BuildDagFromReader dagNode, err := importer.BuildDagFromReader( From 1291470bf0a53f02e6b485b3bb7a778ac7db93cd Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 12:09:01 -0800 Subject: [PATCH 07/16] use core_io/Add in commands/init/writeWelcomeFile --- cmd/ipfs/init.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index 7afa23e70..b09083af2 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -10,8 +10,7 @@ import ( cmds "github.com/jbenet/go-ipfs/commands" core "github.com/jbenet/go-ipfs/core" corecmds "github.com/jbenet/go-ipfs/core/commands" - imp "github.com/jbenet/go-ipfs/importer" - chunk "github.com/jbenet/go-ipfs/importer/chunk" + core_io "github.com/jbenet/go-ipfs/core/io" ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" repo "github.com/jbenet/go-ipfs/repo" @@ -117,7 +116,6 @@ func doInit(repoRoot string, force bool, nBitsForKeypair int) (interface{}, erro // addTheWelcomeFile adds a file containing the welcome message to the newly // minted node. On success, it calls onSuccess func addTheWelcomeFile(repoRoot string) error { - // TODO extract this file creation operation into a function ctx, cancel := context.WithCancel(context.Background()) defer cancel() r := fsrepo.At(repoRoot) @@ -132,13 +130,7 @@ func addTheWelcomeFile(repoRoot string) error { // Set up default file reader := bytes.NewBufferString(welcomeMsg) - - defnd, err := imp.BuildDagFromReader(reader, nd.DAG, nd.Pinning.GetManual(), chunk.DefaultSplitter) - if err != nil { - return err - } - - k, err := defnd.Key() + k, err := core_io.Add(nd, reader) if err != nil { return fmt.Errorf("failed to write test file: %s", err) } From deb1bbe74f636b1ad8bd1e054a1a7cd63ae6dccd Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 12:10:18 -0800 Subject: [PATCH 08/16] fix(command/init) rm stale comment --- cmd/ipfs/init.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index b09083af2..e652fd23a 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -114,7 +114,7 @@ func doInit(repoRoot string, force bool, nBitsForKeypair int) (interface{}, erro } // addTheWelcomeFile adds a file containing the welcome message to the newly -// minted node. On success, it calls onSuccess +// minted node. func addTheWelcomeFile(repoRoot string) error { ctx, cancel := context.WithCancel(context.Background()) defer cancel() From 1edc5c0a65c12d91982cff8da516a2f75f5939ed Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Thu, 15 Jan 2015 16:06:26 -0800 Subject: [PATCH 09/16] refactor(core) Close in teardown This declarative style is simpler to compose than the imperative wiring up of objects. + pass context to StartOnlineServices as parameter. one by one, trying to remove dependencies on node state so these initialization steps can be broken down. --- core/core.go | 63 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/core/core.go b/core/core.go index 28c53b5c6..09ce82af1 100644 --- a/core/core.go +++ b/core/core.go @@ -2,6 +2,7 @@ package core import ( "fmt" + "io" "time" context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" @@ -100,11 +101,22 @@ type Mounts struct { type ConfigOption func(ctx context.Context) (*IpfsNode, error) -func NewIPFSNode(ctx context.Context, option ConfigOption) (*IpfsNode, error) { +func NewIPFSNode(parent context.Context, option ConfigOption) (*IpfsNode, error) { + ctxg := ctxgroup.WithContext(parent) + ctx := ctxg.Context() + success := false // flip to true after all sub-system inits succeed + defer func() { + if !success { + ctxg.Close() + } + }() + node, err := option(ctx) if err != nil { return nil, err } + node.ContextGroup = ctxg + ctxg.SetTeardown(node.teardown) // Need to make sure it's perfectly clear 1) which variables are expected // to be initialized at this point, and 2) which variables will be @@ -123,6 +135,7 @@ func NewIPFSNode(ctx context.Context, option ConfigOption) (*IpfsNode, error) { node.Pinning = pin.NewPinner(node.Repo.Datastore(), node.DAG) } node.Resolver = &path.Resolver{DAG: node.DAG} + success = true return node, nil } @@ -138,13 +151,6 @@ func Online(r repo.Repo) ConfigOption { func Standard(r repo.Repo, online bool) ConfigOption { return func(ctx context.Context) (n *IpfsNode, err error) { - success := false // flip to true after all sub-system inits succeed - defer func() { - if !success && n != nil { - n.Close() - } - }() - if r == nil { return nil, debugerror.Errorf("repo required") } @@ -158,9 +164,6 @@ func Standard(r repo.Repo, online bool) ConfigOption { Repo: r, } - n.ContextGroup = ctxgroup.WithContextAndTeardown(ctx, n.teardown) - ctx = n.ContextGroup.Context() - // setup Peerstore n.Peerstore = peer.NewPeerstore() @@ -176,20 +179,18 @@ func Standard(r repo.Repo, online bool) ConfigOption { // setup online services if online { - if err := n.StartOnlineServices(); err != nil { + if err := n.StartOnlineServices(ctx); err != nil { return nil, err // debugerror.Wraps. } } else { n.Exchange = offline.Exchange(n.Blockstore) } - success = true return n, nil } } -func (n *IpfsNode) StartOnlineServices() error { - ctx := n.Context() +func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { if n.PeerHost != nil { // already online. return debugerror.New("node already online") @@ -200,7 +201,7 @@ func (n *IpfsNode) StartOnlineServices() error { return err } - peerhost, err := constructPeerHost(ctx, n.ContextGroup, n.Repo.Config(), n.Identity, n.Peerstore) + peerhost, err := constructPeerHost(ctx, n.Repo.Config(), n.Identity, n.Peerstore) if err != nil { return debugerror.Wrap(err) } @@ -210,7 +211,7 @@ func (n *IpfsNode) StartOnlineServices() error { n.Diagnostics = diag.NewDiagnostics(n.Identity, n.PeerHost) // setup routing service - dhtRouting, err := constructDHTRouting(ctx, n.ContextGroup, n.PeerHost, n.Repo.Datastore()) + dhtRouting, err := constructDHTRouting(ctx, n.PeerHost, n.Repo.Datastore()) if err != nil { return debugerror.Wrap(err) } @@ -250,9 +251,27 @@ func (n *IpfsNode) StartOnlineServices() error { return nil } +// teardown closes children func (n *IpfsNode) teardown() error { - if err := n.Repo.Close(); err != nil { - return err + var errs []error + closers := []io.Closer{ + n.Repo, + } + if n.DHT != nil { + closers = append(closers, n.DHT) + } + if n.PeerHost != nil { + closers = append(closers, n.PeerHost) + } + for _, closer := range closers { + if closer != nil { + if err := closer.Close(); err != nil { + errs = append(errs, err) + } + } + } + if len(errs) > 0 { + return errs[0] } return nil } @@ -351,7 +370,7 @@ func listenAddresses(cfg *config.Config) ([]ma.Multiaddr, error) { } // isolates the complex initialization steps -func constructPeerHost(ctx context.Context, ctxg ctxgroup.ContextGroup, cfg *config.Config, id peer.ID, ps peer.Peerstore) (p2phost.Host, error) { +func constructPeerHost(ctx context.Context, cfg *config.Config, id peer.ID, ps peer.Peerstore) (p2phost.Host, error) { listenAddrs, err := listenAddresses(cfg) if err != nil { return nil, debugerror.Wrap(err) @@ -369,7 +388,6 @@ func constructPeerHost(ctx context.Context, ctxg ctxgroup.ContextGroup, cfg *con if err != nil { return nil, debugerror.Wrap(err) } - ctxg.AddChildGroup(network.CtxGroup()) peerhost := p2pbhost.New(network) // explicitly set these as our listen addrs. @@ -384,9 +402,8 @@ func constructPeerHost(ctx context.Context, ctxg ctxgroup.ContextGroup, cfg *con return peerhost, nil } -func constructDHTRouting(ctx context.Context, ctxg ctxgroup.ContextGroup, host p2phost.Host, ds datastore.ThreadSafeDatastore) (*dht.IpfsDHT, error) { +func constructDHTRouting(ctx context.Context, host p2phost.Host, ds datastore.ThreadSafeDatastore) (*dht.IpfsDHT, error) { dhtRouting := dht.NewDHT(ctx, host, ds) dhtRouting.Validators[IpnsValidatorTag] = namesys.ValidateIpnsRecord - ctxg.AddChildGroup(dhtRouting) return dhtRouting, nil } From de45277883e96d03e2a9bb2ce6ace1ad63d71696 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 02:41:24 -0800 Subject: [PATCH 10/16] doc(core, main) --- cmd/ipfs/main.go | 2 +- core/core.go | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) 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 } } From 19c2c6556f1bc6e7f0add861332b798cd587731b Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 02:52:31 -0800 Subject: [PATCH 11/16] fix(core) don't assume Repo won't be nil --- core/core.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/core.go b/core/core.go index 2478f493b..e0efb527d 100644 --- a/core/core.go +++ b/core/core.go @@ -265,9 +265,9 @@ func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { // teardown closes children func (n *IpfsNode) teardown() error { - var errs []error - closers := []io.Closer{ - n.Repo, + var closers []io.Closer + if n.Repo != nil { + closers = append(closers, n.Repo) } if n.DHT != nil { closers = append(closers, n.DHT) @@ -275,6 +275,7 @@ func (n *IpfsNode) teardown() error { if n.PeerHost != nil { closers = append(closers, n.PeerHost) } + var errs []error for _, closer := range closers { if closer != nil { if err := closer.Close(); err != nil { From 15a6237ffc198a0e750f013ab9ad7ba7e6ec5caa Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 02:56:41 -0800 Subject: [PATCH 12/16] fix(core) improve documentation and describe behavior of function --- core/core.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/core.go b/core/core.go index e0efb527d..d78046386 100644 --- a/core/core.go +++ b/core/core.go @@ -263,8 +263,11 @@ func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { return nil } -// teardown closes children +// teardown closes owned children. If any errors occur, this function returns +// the first error. func (n *IpfsNode) teardown() error { + // owned objects are closed in this teardown to ensure that they're closed + // regardless of which constructor was used to add them to the node. var closers []io.Closer if n.Repo != nil { closers = append(closers, n.Repo) @@ -277,10 +280,8 @@ func (n *IpfsNode) teardown() error { } var errs []error for _, closer := range closers { - if closer != nil { - if err := closer.Close(); err != nil { - errs = append(errs, err) - } + if err := closer.Close(); err != nil { + errs = append(errs, err) } } if len(errs) > 0 { From c1ff2149f1f0101d0627281dc9f56926caef46eb Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 02:57:56 -0800 Subject: [PATCH 13/16] doc(core) add TODO --- core/core.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/core.go b/core/core.go index d78046386..176d35e47 100644 --- a/core/core.go +++ b/core/core.go @@ -299,6 +299,8 @@ func (n *IpfsNode) OnlineMode() bool { } } +// TODO expose way to resolve path name + func (n *IpfsNode) Resolve(k util.Key) (*merkledag.Node, error) { return (&path.Resolver{n.DAG}).ResolvePath(k.String()) } From a025fc9adffefed5e9d25a0f8421ec6c8b5ea03d Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 02:59:32 -0800 Subject: [PATCH 14/16] refactor(core) switch style to type assertions @jbenet cool with this? --- core/core.go | 22 +++++++++++----------- test/epictest/core.go | 1 - 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/core/core.go b/core/core.go index 176d35e47..7cd6b8eec 100644 --- a/core/core.go +++ b/core/core.go @@ -84,10 +84,6 @@ type IpfsNode struct { ctxgroup.ContextGroup - // dht allows node to Bootstrap when dht is present - // TODO privatize before merging. This is here temporarily during the - // migration of the TestNet constructor - DHT *dht.IpfsDHT mode mode } @@ -227,7 +223,6 @@ func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { if err != nil { return debugerror.Wrap(err) } - n.DHT = dhtRouting n.Routing = dhtRouting // setup exchange service @@ -255,11 +250,12 @@ func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { } bootstrapPeers = append(bootstrapPeers, p) } - go superviseConnections(ctx, n.PeerHost, n.DHT, n.Peerstore, bootstrapPeers) - // Start up reprovider system + go superviseConnections(ctx, n.PeerHost, dhtRouting, n.Peerstore, bootstrapPeers) + n.Reprovider = rp.NewReprovider(n.Routing, n.Blockstore) go n.Reprovider.ProvideEvery(ctx, time.Hour*12) + return nil } @@ -272,8 +268,10 @@ func (n *IpfsNode) teardown() error { if n.Repo != nil { closers = append(closers, n.Repo) } - if n.DHT != nil { - closers = append(closers, n.DHT) + if n.Routing != nil { + if dht, ok := n.Routing.(*dht.IpfsDHT); ok { + closers = append(closers, dht) + } } if n.PeerHost != nil { closers = append(closers, n.PeerHost) @@ -310,8 +308,10 @@ func (n *IpfsNode) Bootstrap(ctx context.Context, peers []peer.PeerInfo) error { // TODO what should return value be when in offlineMode? - if n.DHT != nil { - return bootstrap(ctx, n.PeerHost, n.DHT, n.Peerstore, peers) + if n.Routing != nil { + if dht, ok := n.Routing.(*dht.IpfsDHT); ok { + return bootstrap(ctx, n.PeerHost, dht, n.Peerstore, peers) + } } return nil } diff --git a/test/epictest/core.go b/test/epictest/core.go index 23a4a6ffc..675d1e7ed 100644 --- a/test/epictest/core.go +++ b/test/epictest/core.go @@ -46,7 +46,6 @@ func MocknetTestRepo(p peer.ID, h host.Host, conf testutil.LatencyConfig) core.C PeerHost: h, Routing: dhtt, Identity: p, - DHT: dhtt, }, nil } } From b0596cd4ff0bca3b0b43a9f430d355e29f47acb3 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Fri, 16 Jan 2015 18:04:40 -0800 Subject: [PATCH 15/16] rename coreio to coreunix --- cmd/ipfs/init.go | 4 ++-- core/{io => coreunix}/add.go | 13 +------------ core/{io => coreunix}/cat.go | 13 +------------ test/epictest/addcat_test.go | 6 +++--- test/epictest/three_legged_cat_test.go | 6 +++--- 5 files changed, 10 insertions(+), 32 deletions(-) rename core/{io => coreunix}/add.go (71%) rename core/{io => coreunix}/cat.go (54%) diff --git a/cmd/ipfs/init.go b/cmd/ipfs/init.go index e652fd23a..0fe8fdaef 100644 --- a/cmd/ipfs/init.go +++ b/cmd/ipfs/init.go @@ -10,7 +10,7 @@ import ( cmds "github.com/jbenet/go-ipfs/commands" core "github.com/jbenet/go-ipfs/core" corecmds "github.com/jbenet/go-ipfs/core/commands" - core_io "github.com/jbenet/go-ipfs/core/io" + coreunix "github.com/jbenet/go-ipfs/core/coreunix" ci "github.com/jbenet/go-ipfs/p2p/crypto" peer "github.com/jbenet/go-ipfs/p2p/peer" repo "github.com/jbenet/go-ipfs/repo" @@ -130,7 +130,7 @@ func addTheWelcomeFile(repoRoot string) error { // Set up default file reader := bytes.NewBufferString(welcomeMsg) - k, err := core_io.Add(nd, reader) + k, err := coreunix.Add(nd, reader) if err != nil { return fmt.Errorf("failed to write test file: %s", err) } diff --git a/core/io/add.go b/core/coreunix/add.go similarity index 71% rename from core/io/add.go rename to core/coreunix/add.go index 50b8832fb..ade57652b 100644 --- a/core/io/add.go +++ b/core/coreunix/add.go @@ -1,15 +1,4 @@ -package core_io - -// TODO rename package to something that doesn't conflict with io/ioutil. -// Pretty names are hard to find. -// -// Candidates: -// -// go-ipfs/core/unix -// go-ipfs/core/io -// go-ipfs/core/ioutil -// go-ipfs/core/coreio -// go-ipfs/core/coreunix +package coreunix import ( "io" diff --git a/core/io/cat.go b/core/coreunix/cat.go similarity index 54% rename from core/io/cat.go rename to core/coreunix/cat.go index 0e0f2712a..8ba4d2917 100644 --- a/core/io/cat.go +++ b/core/coreunix/cat.go @@ -1,15 +1,4 @@ -package core_io - -// TODO rename package to something that doesn't conflict with io/ioutil. -// Pretty names are hard to find. -// -// Candidates: -// -// go-ipfs/core/unix -// go-ipfs/core/io -// go-ipfs/core/ioutil -// go-ipfs/core/coreio -// go-ipfs/core/coreunix +package coreunix import ( "io" diff --git a/test/epictest/addcat_test.go b/test/epictest/addcat_test.go index d3a99e932..b18c98644 100644 --- a/test/epictest/addcat_test.go +++ b/test/epictest/addcat_test.go @@ -12,7 +12,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" random "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-random" "github.com/jbenet/go-ipfs/core" - core_io "github.com/jbenet/go-ipfs/core/io" + coreunix "github.com/jbenet/go-ipfs/core/coreunix" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" @@ -115,12 +115,12 @@ func DirectAddCat(data []byte, conf testutil.LatencyConfig) error { catter.Bootstrap(ctx, []peer.PeerInfo{adder.Peerstore.PeerInfo(adder.Identity)}) adder.Bootstrap(ctx, []peer.PeerInfo{catter.Peerstore.PeerInfo(catter.Identity)}) - keyAdded, err := core_io.Add(adder, bytes.NewReader(data)) + keyAdded, err := coreunix.Add(adder, bytes.NewReader(data)) if err != nil { return err } - readerCatted, err := core_io.Cat(catter, keyAdded) + readerCatted, err := coreunix.Cat(catter, keyAdded) if err != nil { return err } diff --git a/test/epictest/three_legged_cat_test.go b/test/epictest/three_legged_cat_test.go index b33b07077..2926abb7a 100644 --- a/test/epictest/three_legged_cat_test.go +++ b/test/epictest/three_legged_cat_test.go @@ -8,7 +8,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" core "github.com/jbenet/go-ipfs/core" - core_io "github.com/jbenet/go-ipfs/core/io" + coreunix "github.com/jbenet/go-ipfs/core/coreunix" mocknet "github.com/jbenet/go-ipfs/p2p/net/mock" "github.com/jbenet/go-ipfs/p2p/peer" errors "github.com/jbenet/go-ipfs/util/debugerror" @@ -62,12 +62,12 @@ func RunThreeLeggedCat(data []byte, conf testutil.LatencyConfig) error { adder.Bootstrap(ctx, []peer.PeerInfo{boostrapInfo}) catter.Bootstrap(ctx, []peer.PeerInfo{boostrapInfo}) - keyAdded, err := core_io.Add(adder, bytes.NewReader(data)) + keyAdded, err := coreunix.Add(adder, bytes.NewReader(data)) if err != nil { return err } - readerCatted, err := core_io.Cat(catter, keyAdded) + readerCatted, err := coreunix.Cat(catter, keyAdded) if err != nil { return err } From 797aad91378e0fd0ff3d510e40adbdd6797e4a3a Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sat, 17 Jan 2015 03:42:27 -0800 Subject: [PATCH 16/16] refactor(core) extract const --- core/core.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.go b/core/core.go index 7cd6b8eec..ce7a61440 100644 --- a/core/core.go +++ b/core/core.go @@ -42,6 +42,7 @@ import ( const IpnsValidatorTag = "ipns" const kSizeBlockstoreWriteCache = 100 +const kReprovideFrequency = time.Hour * 12 var log = eventlog.Logger("core") @@ -254,7 +255,7 @@ func (n *IpfsNode) StartOnlineServices(ctx context.Context) error { go superviseConnections(ctx, n.PeerHost, dhtRouting, n.Peerstore, bootstrapPeers) n.Reprovider = rp.NewReprovider(n.Routing, n.Blockstore) - go n.Reprovider.ProvideEvery(ctx, time.Hour*12) + go n.Reprovider.ProvideEvery(ctx, kReprovideFrequency) return nil }