@cryptotaxi247 / kubo / commits / ff17485cb

feat: bootstrap in dht when the routing table is empty

Otherwise, we could end up with only DHT clients and never re-bootstrap. I've left the default go-ipfs bootstrapping code in for now as it's technically possible to disable the DHT entirely.

Steven Allen committed May 20, 2020 at 20:06 UTC ff17485cbb845f1d1ebf9091ff4cb36a25865481
4 files changed +58 -14
core/node/libp2p/host.go
+17 -3
@@ -10,10 +10,11 @@ import (
10 routing "github.com/libp2p/go-libp2p-core/routing"
11 record "github.com/libp2p/go-libp2p-record"
12 routedhost "github.com/libp2p/go-libp2p/p2p/host/routed"
13 - "go.uber.org/fx"
13
14 "github.com/ipfs/go-ipfs/core/node/helpers"
15 "github.com/ipfs/go-ipfs/repo"
16 +
17 + "go.uber.org/fx"
18 )
19
20 type P2PHostIn struct {
@@ -43,9 +44,22 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (out P2PHo
44 }
45
46 ctx := helpers.LifecycleCtx(mctx, lc)
47 + cfg, err := params.Repo.Config()
48 + if err != nil {
49 + return out, err
50 + }
51 + bootstrappers, err := cfg.BootstrapPeers()
52 + if err != nil {
53 + return out, err
54 + }
55
56 opts = append(opts, libp2p.Routing(func(h host.Host) (routing.PeerRouting, error) {
48 - r, err := params.RoutingOption(ctx, h, params.Repo.Datastore(), params.Validator)
57 + r, err := params.RoutingOption(
58 + ctx, h,
59 + params.Repo.Datastore(),
60 + params.Validator,
61 + bootstrappers...,
62 + )
63 out.Routing = r
64 return r, err
65 }))
@@ -58,7 +72,7 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (out P2PHo
72 // this code is necessary just for tests: mock network constructions
73 // ignore the libp2p constructor options that actually construct the routing!
74 if out.Routing == nil {
61 - r, err := params.RoutingOption(ctx, out.Host, params.Repo.Datastore(), params.Validator)
75 + r, err := params.RoutingOption(ctx, out.Host, params.Repo.Datastore(), params.Validator, bootstrappers...)
76 if err != nil {
77 return P2PHostOut{}, err
78 }
core/node/libp2p/routingopt.go
+35 -5
@@ -4,31 +4,61 @@ import (
4 "context"
5
6 "github.com/ipfs/go-datastore"
7 - nilrouting "github.com/ipfs/go-ipfs-routing/none"
7 host "github.com/libp2p/go-libp2p-core/host"
8 + "github.com/libp2p/go-libp2p-core/peer"
9 routing "github.com/libp2p/go-libp2p-core/routing"
10 dht "github.com/libp2p/go-libp2p-kad-dht"
11 dual "github.com/libp2p/go-libp2p-kad-dht/dual"
12 record "github.com/libp2p/go-libp2p-record"
13 + routinghelpers "github.com/libp2p/go-libp2p-routing-helpers"
14 )
15
15 -type RoutingOption func(context.Context, host.Host, datastore.Batching, record.Validator) (routing.Routing, error)
16 +type RoutingOption func(
17 + context.Context,
18 + host.Host,
19 + datastore.Batching,
20 + record.Validator,
21 + ...peer.AddrInfo,
22 +) (routing.Routing, error)
23
17 -func constructDHTRouting(mode dht.ModeOpt) func(ctx context.Context, host host.Host, dstore datastore.Batching, validator record.Validator) (routing.Routing, error) {
18 - return func(ctx context.Context, host host.Host, dstore datastore.Batching, validator record.Validator) (routing.Routing, error) {
24 +func constructDHTRouting(mode dht.ModeOpt) func(
25 + ctx context.Context,
26 + host host.Host,
27 + dstore datastore.Batching,
28 + validator record.Validator,
29 + bootstrapPeers ...peer.AddrInfo,
30 +) (routing.Routing, error) {
31 + return func(
32 + ctx context.Context,
33 + host host.Host,
34 + dstore datastore.Batching,
35 + validator record.Validator,
36 + bootstrapPeers ...peer.AddrInfo,
37 + ) (routing.Routing, error) {
38 return dual.New(
39 ctx, host,
40 dht.Concurrency(10),
41 dht.Mode(mode),
42 dht.Datastore(dstore),
43 dht.Validator(validator),
44 + dht.BootstrapPeers(bootstrapPeers...),
45 )
46 }
47 }
48
49 +func constructNilRouting(
50 + ctx context.Context,
51 + host host.Host,
52 + dstore datastore.Batching,
53 + validator record.Validator,
54 + bootstrapPeers ...peer.AddrInfo,
55 +) (routing.Routing, error) {
56 + return routinghelpers.Null{}, nil
57 +}
58 +
59 var (
60 DHTOption RoutingOption = constructDHTRouting(dht.ModeAuto)
61 DHTClientOption = constructDHTRouting(dht.ModeClient)
62 DHTServerOption = constructDHTRouting(dht.ModeServer)
33 - NilRouterOption = nilrouting.ConstructNilRouting
63 + NilRouterOption = constructNilRouting
64 )
go.mod
+2 -2
@@ -66,8 +66,8 @@ require (
66 github.com/libp2p/go-libp2p-core v0.5.6
67 github.com/libp2p/go-libp2p-discovery v0.4.0
68 github.com/libp2p/go-libp2p-http v0.1.5
69 - github.com/libp2p/go-libp2p-kad-dht v0.7.11
70 - github.com/libp2p/go-libp2p-kbucket v0.4.1
69 + github.com/libp2p/go-libp2p-kad-dht v0.8.0
70 + github.com/libp2p/go-libp2p-kbucket v0.4.2
71 github.com/libp2p/go-libp2p-loggables v0.1.0
72 github.com/libp2p/go-libp2p-mplex v0.2.3
73 github.com/libp2p/go-libp2p-peerstore v0.2.4
go.sum
+4 -4
@@ -592,10 +592,10 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM
592 github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
593 github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k=
594 github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k=
595 -github.com/libp2p/go-libp2p-kad-dht v0.7.11 h1:MP0DEuxO/Blg1AklIVV1P4R5xtYX+ZyXBCtEN7f60yQ=
596 -github.com/libp2p/go-libp2p-kad-dht v0.7.11/go.mod h1:1ht6+bG3Or+fNNERWPYmLacs6TN0CxBkFB5IKIWWwOI=
597 -github.com/libp2p/go-libp2p-kbucket v0.4.1 h1:6FyzbQuGLPzbMv3HiD232zqscIz5iB8ppJwb380+OGI=
598 -github.com/libp2p/go-libp2p-kbucket v0.4.1/go.mod h1:7sCeZx2GkNK1S6lQnGUW5JYZCFPnXzAZCCBBS70lytY=
595 +github.com/libp2p/go-libp2p-kad-dht v0.8.0 h1:vfqDTa/dUlNVlK3nL1b9pTMV9/hhIr4sDjUVk0VEtFQ=
596 +github.com/libp2p/go-libp2p-kad-dht v0.8.0/go.mod h1:u3rbYbp3CSraAHD5s81CJ3hHozKTud/UOXfAgh93Gek=
597 +github.com/libp2p/go-libp2p-kbucket v0.4.2 h1:wg+VPpCtY61bCasGRexCuXOmEmdKjN+k1w+JtTwu9gA=
598 +github.com/libp2p/go-libp2p-kbucket v0.4.2/go.mod h1:7sCeZx2GkNK1S6lQnGUW5JYZCFPnXzAZCCBBS70lytY=
599 github.com/libp2p/go-libp2p-loggables v0.0.1/go.mod h1:lDipDlBNYbpyqyPX/KcoO+eq0sJYEVR2JgOexcivchg=
600 github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8=
601 github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90=