Skip to content

Commit cb92db3

Browse files
committed
Introduce first strategic provider: do nothing
License: MIT Signed-off-by: Michael Avila <[email protected]>
1 parent 5fd5d44 commit cb92db3

24 files changed

+609
-406
lines changed

core/builder.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package core
33
import (
44
"context"
55

6-
"github.com/ipfs/go-metrics-interface"
7-
"go.uber.org/fx"
8-
96
"github.com/ipfs/go-ipfs/core/bootstrap"
107
"github.com/ipfs/go-ipfs/core/node"
8+
"github.com/ipfs/go-metrics-interface"
9+
"go.uber.org/fx"
1110
)
1211

1312
type BuildCfg = node.BuildCfg // Alias for compatibility until we properly refactor the constructor interface

core/commands/bitswap.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ Trigger reprovider to announce our data to network.
234234
return ErrNotOnline
235235
}
236236

237-
err = nd.Reprovider.Trigger(req.Context)
237+
err = nd.Provider.Reprovide(req.Context)
238238
if err != nil {
239239
return err
240240
}

core/core.go

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727
"github.com/ipfs/go-ipfs/pin"
2828
"github.com/ipfs/go-ipfs/provider"
2929
"github.com/ipfs/go-ipfs/repo"
30-
rp "github.com/ipfs/go-ipfs/reprovide"
3130

3231
bserv "github.com/ipfs/go-blockservice"
3332
bstore "github.com/ipfs/go-ipfs-blockstore"
@@ -94,8 +93,7 @@ type IpfsNode struct {
9493
Routing routing.IpfsRouting `optional:"true"` // the routing system. recommend ipfs-dht
9594
Exchange exchange.Interface // the block exchange + strategy (bitswap)
9695
Namesys namesys.NameSystem // the name system, resolves paths to hashes
97-
Provider provider.Provider // the value provider system
98-
Reprovider *rp.Reprovider `optional:"true"` // the value reprovider system
96+
Provider provider.System // the value provider system
9997
IpnsRepub *ipnsrp.Republisher `optional:"true"`
10098

10199
AutoNAT *autonat.AutoNATService `optional:"true"`

core/coreapi/coreapi.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ type CoreAPI struct {
6868
namesys namesys.NameSystem
6969
routing routing.IpfsRouting
7070

71-
provider provider.Provider
71+
provider provider.System
7272

7373
pubSub *pubsub.PubSub
7474

core/node/core.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66

7+
"github.com/ipfs/go-ipfs-config"
78
"github.com/ipfs/go-ipfs/core/node/helpers"
89
"github.com/ipfs/go-ipfs/pin"
910
"github.com/ipfs/go-ipfs/repo"
@@ -59,8 +60,9 @@ func Dag(bs blockservice.BlockService) format.DAGService {
5960
}
6061

6162
// OnlineExchange creates new LibP2P backed block exchange (BitSwap)
62-
func OnlineExchange(mctx helpers.MetricsCtx, lc fx.Lifecycle, host host.Host, rt routing.IpfsRouting, bs blockstore.GCBlockstore) exchange.Interface {
63+
func OnlineExchange(mctx helpers.MetricsCtx, lc fx.Lifecycle, cfg *config.Config, host host.Host, rt routing.IpfsRouting, bs blockstore.GCBlockstore) exchange.Interface {
6364
bitswapNetwork := network.NewFromIpfsHost(host, rt)
65+
bitswap.ProvideEnabled = !cfg.Experimental.StrategicProviding
6466
exch := bitswap.New(helpers.LifecycleCtx(mctx, lc), bitswapNetwork, bs)
6567
lc.Append(fx.Hook{
6668
OnStop: func(ctx context.Context) error {

core/node/groups.go

Lines changed: 11 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,10 @@ import (
1414
pubsub "github.com/libp2p/go-libp2p-pubsub"
1515

1616
"github.com/ipfs/go-ipfs/core/node/libp2p"
17-
"github.com/ipfs/go-ipfs/p2p"
18-
"github.com/ipfs/go-ipfs/provider"
19-
"github.com/ipfs/go-ipfs/reprovide"
2017

2118
offline "github.com/ipfs/go-ipfs-exchange-offline"
2219
offroute "github.com/ipfs/go-ipfs-routing/offline"
20+
"github.com/ipfs/go-ipfs/p2p"
2321
"github.com/ipfs/go-path/resolver"
2422
uio "github.com/ipfs/go-unixfs/io"
2523
"go.uber.org/fx"
@@ -188,42 +186,6 @@ var IPNS = fx.Options(
188186
fx.Provide(RecordValidator),
189187
)
190188

191-
// Providers groups units managing provider routing records
192-
func Providers(cfg *config.Config) fx.Option {
193-
reproviderInterval := kReprovideFrequency
194-
if cfg.Reprovider.Interval != "" {
195-
dur, err := time.ParseDuration(cfg.Reprovider.Interval)
196-
if err != nil {
197-
return fx.Error(err)
198-
}
199-
200-
reproviderInterval = dur
201-
}
202-
203-
var keyProvider fx.Option
204-
switch cfg.Reprovider.Strategy {
205-
case "all":
206-
fallthrough
207-
case "":
208-
keyProvider = fx.Provide(reprovide.NewBlockstoreProvider)
209-
case "roots":
210-
keyProvider = fx.Provide(reprovide.NewPinnedProvider(true))
211-
case "pinned":
212-
keyProvider = fx.Provide(reprovide.NewPinnedProvider(false))
213-
default:
214-
return fx.Error(fmt.Errorf("unknown reprovider strategy '%s'", cfg.Reprovider.Strategy))
215-
}
216-
217-
return fx.Options(
218-
fx.Provide(ProviderQueue),
219-
fx.Provide(ProviderCtor),
220-
fx.Provide(ReproviderCtor(reproviderInterval)),
221-
keyProvider,
222-
223-
fx.Invoke(Reprovider),
224-
)
225-
}
226-
227189
// Online groups online-only units
228190
func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
229191

@@ -272,17 +234,19 @@ func Online(bcfg *BuildCfg, cfg *config.Config) fx.Option {
272234
fx.Provide(p2p.New),
273235

274236
LibP2P(bcfg, cfg),
275-
Providers(cfg),
237+
OnlineProviders(cfg),
276238
)
277239
}
278240

279241
// Offline groups offline alternatives to Online units
280-
var Offline = fx.Options(
281-
fx.Provide(offline.Exchange),
282-
fx.Provide(Namesys(0)),
283-
fx.Provide(offroute.NewOfflineRouter),
284-
fx.Provide(provider.NewOfflineProvider),
285-
)
242+
func Offline(cfg *config.Config) fx.Option {
243+
return fx.Options(
244+
fx.Provide(offline.Exchange),
245+
fx.Provide(Namesys(0)),
246+
fx.Provide(offroute.NewOfflineRouter),
247+
OfflineProviders(cfg),
248+
)
249+
}
286250

287251
// Core groups basic IPFS services
288252
var Core = fx.Options(
@@ -297,7 +261,7 @@ func Networked(bcfg *BuildCfg, cfg *config.Config) fx.Option {
297261
if bcfg.Online {
298262
return Online(bcfg, cfg)
299263
}
300-
return Offline
264+
return Offline(cfg)
301265
}
302266

303267
// IPFS builds a group of fx Options based on the passed BuildCfg

core/node/provider.go

Lines changed: 97 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,50 +2,129 @@ package node
22

33
import (
44
"context"
5+
"fmt"
56
"time"
67

7-
"github.com/libp2p/go-libp2p-routing"
88
"go.uber.org/fx"
99

10+
"github.com/ipfs/go-ipfs-config"
1011
"github.com/ipfs/go-ipfs/core/node/helpers"
1112
"github.com/ipfs/go-ipfs/provider"
13+
q "github.com/ipfs/go-ipfs/provider/queue"
14+
"github.com/ipfs/go-ipfs/provider/simple"
1215
"github.com/ipfs/go-ipfs/repo"
13-
"github.com/ipfs/go-ipfs/reprovide"
16+
"github.com/libp2p/go-libp2p-routing"
1417
)
1518

1619
const kReprovideFrequency = time.Hour * 12
1720

21+
// SIMPLE
22+
1823
// ProviderQueue creates new datastore backed provider queue
19-
func ProviderQueue(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo) (*provider.Queue, error) {
20-
return provider.NewQueue(helpers.LifecycleCtx(mctx, lc), "provider-v1", repo.Datastore())
24+
func ProviderQueue(mctx helpers.MetricsCtx, lc fx.Lifecycle, repo repo.Repo) (*q.Queue, error) {
25+
return q.NewQueue(helpers.LifecycleCtx(mctx, lc), "provider-v1", repo.Datastore())
2126
}
2227

23-
// ProviderCtor creates new record provider
24-
func ProviderCtor(mctx helpers.MetricsCtx, lc fx.Lifecycle, queue *provider.Queue, rt routing.IpfsRouting) provider.Provider {
25-
p := provider.NewProvider(helpers.LifecycleCtx(mctx, lc), queue, rt)
28+
// SimpleProviderCtor creates new record provider
29+
func SimpleProviderCtor(mctx helpers.MetricsCtx, lc fx.Lifecycle, queue *q.Queue, rt routing.IpfsRouting) provider.Provider {
30+
return simple.NewProvider(helpers.LifecycleCtx(mctx, lc), queue, rt)
31+
}
32+
33+
// SimpleReproviderCtor creates new reprovider
34+
func SimpleReproviderCtor(reproviderInterval time.Duration) func(helpers.MetricsCtx, fx.Lifecycle, routing.IpfsRouting, simple.KeyChanFunc) (provider.Reprovider, error) {
35+
return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, rt routing.IpfsRouting, keyProvider simple.KeyChanFunc) (provider.Reprovider, error) {
36+
return simple.NewReprovider(helpers.LifecycleCtx(mctx, lc), reproviderInterval, rt, keyProvider), nil
37+
}
38+
}
2639

40+
// SimpleProviderSysCtor creates new provider system
41+
func SimpleProviderSysCtor(lc fx.Lifecycle, p provider.Provider, r provider.Reprovider) provider.System {
42+
sys := provider.NewSystem(p, r)
2743
lc.Append(fx.Hook{
2844
OnStart: func(ctx context.Context) error {
29-
p.Run()
45+
sys.Run()
3046
return nil
3147
},
3248
OnStop: func(ctx context.Context) error {
33-
return p.Close()
49+
return sys.Close()
3450
},
3551
})
52+
return sys
53+
}
54+
55+
// SimpleOfflineProviderSysCtor creates a new offline provider system
56+
func SimpleOfflineProviderSysCtor(p provider.Provider, r provider.Reprovider) provider.System {
57+
return provider.NewSystem(p, r)
58+
}
59+
60+
// STRATEGIC
61+
62+
// StrategicProviderSysCtor creates new provider system
63+
func StrategicProviderSysCtor() provider.System {
64+
return provider.NewOfflineProvider()
65+
}
66+
67+
// StrategicOfflineProviderSysCtor creates a new offline provider system
68+
func StrategicOfflineProviderSysCtor() provider.System {
69+
return provider.NewOfflineProvider()
70+
}
71+
72+
// ONLINE/OFFLINE
73+
74+
// OnlineProviders groups units managing provider routing records online
75+
func OnlineProviders(cfg *config.Config) fx.Option {
76+
if cfg.Experimental.StrategicProviding {
77+
return fx.Provide(StrategicProviderSysCtor)
78+
}
3679

37-
return p
80+
return fx.Options(
81+
SimpleProviders(cfg),
82+
fx.Provide(SimpleProviderSysCtor),
83+
)
3884
}
3985

40-
// ReproviderCtor creates new reprovider
41-
func ReproviderCtor(reproviderInterval time.Duration) func(helpers.MetricsCtx, fx.Lifecycle, routing.IpfsRouting, reprovide.KeyChanFunc) (*reprovide.Reprovider, error) {
42-
return func(mctx helpers.MetricsCtx, lc fx.Lifecycle, rt routing.IpfsRouting, keyProvider reprovide.KeyChanFunc) (*reprovide.Reprovider, error) {
43-
return reprovide.NewReprovider(helpers.LifecycleCtx(mctx, lc), reproviderInterval, rt, keyProvider), nil
86+
// OfflineProviders groups units managing provider routing records offline
87+
func OfflineProviders(cfg *config.Config) fx.Option {
88+
if cfg.Experimental.StrategicProviding {
89+
return fx.Provide(StrategicOfflineProviderSysCtor)
4490
}
91+
92+
return fx.Options(
93+
SimpleProviders(cfg),
94+
fx.Provide(SimpleOfflineProviderSysCtor),
95+
)
4596
}
4697

47-
// Reprovider runs the reprovider service
48-
func Reprovider(lp lcProcess, reprovider *reprovide.Reprovider) error {
49-
lp.Append(reprovider.Run)
50-
return nil
98+
// SimpleProviders creates the simple provider/reprovider dependencies
99+
func SimpleProviders(cfg *config.Config) fx.Option {
100+
reproviderInterval := kReprovideFrequency
101+
if cfg.Reprovider.Interval != "" {
102+
dur, err := time.ParseDuration(cfg.Reprovider.Interval)
103+
if err != nil {
104+
return fx.Error(err)
105+
}
106+
107+
reproviderInterval = dur
108+
}
109+
110+
var keyProvider fx.Option
111+
switch cfg.Reprovider.Strategy {
112+
case "all":
113+
fallthrough
114+
case "":
115+
keyProvider = fx.Provide(simple.NewBlockstoreProvider)
116+
case "roots":
117+
keyProvider = fx.Provide(simple.NewPinnedProvider(true))
118+
case "pinned":
119+
keyProvider = fx.Provide(simple.NewPinnedProvider(false))
120+
default:
121+
return fx.Error(fmt.Errorf("unknown reprovider strategy '%s'", cfg.Reprovider.Strategy))
122+
}
123+
124+
return fx.Options(
125+
fx.Provide(ProviderQueue),
126+
fx.Provide(SimpleProviderCtor),
127+
keyProvider,
128+
fx.Provide(SimpleReproviderCtor(reproviderInterval)),
129+
)
51130
}

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/hashicorp/golang-lru v0.5.1
1717
github.com/hsanjuan/go-libp2p-http v0.0.2
1818
github.com/ipfs/dir-index-html v1.0.3
19-
github.com/ipfs/go-bitswap v0.0.4
19+
github.com/ipfs/go-bitswap v0.0.5
2020
github.com/ipfs/go-block-format v0.0.2
2121
github.com/ipfs/go-blockservice v0.0.3
2222
github.com/ipfs/go-cid v0.0.1
@@ -34,7 +34,7 @@ require (
3434
github.com/ipfs/go-ipfs-chunker v0.0.1
3535
github.com/ipfs/go-ipfs-cmdkit v0.0.1
3636
github.com/ipfs/go-ipfs-cmds v0.0.5
37-
github.com/ipfs/go-ipfs-config v0.0.3
37+
github.com/ipfs/go-ipfs-config v0.0.4-0.20190502164316-b06d585017ae
3838
github.com/ipfs/go-ipfs-ds-help v0.0.1
3939
github.com/ipfs/go-ipfs-exchange-interface v0.0.1
4040
github.com/ipfs/go-ipfs-exchange-offline v0.0.1

go.sum

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ github.com/ipfs/go-bitswap v0.0.3 h1:uFcSI9dkjUn67S7IM60vr2wA27aAvn8o9xYjaQCug3o
138138
github.com/ipfs/go-bitswap v0.0.3/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg=
139139
github.com/ipfs/go-bitswap v0.0.4 h1:mrS8jBd+rCgKw7Owx4RM5QBiMi9DBc1Ih9FaEBYM4/M=
140140
github.com/ipfs/go-bitswap v0.0.4/go.mod h1:jadAZYsP/tcRMl47ZhFxhaNuDQoXawT8iHMg+iFoQbg=
141+
github.com/ipfs/go-bitswap v0.0.5-0.20190430213314-d1f829bed810 h1:bZlGYwSXQ4wiewl39r2w/3GjSE/CwzKoiXVb4UeQ6hE=
142+
github.com/ipfs/go-bitswap v0.0.5-0.20190430213314-d1f829bed810/go.mod h1:fcVV/eiSBkhfkqOf+v0WjA+fZVYJV6NKZRgue2B6b34=
143+
github.com/ipfs/go-bitswap v0.0.5 h1:ccnSWMn5CwWH/8zU7UZugFeJ/ZWH2AzexKmozx+7BG8=
144+
github.com/ipfs/go-bitswap v0.0.5/go.mod h1:fcVV/eiSBkhfkqOf+v0WjA+fZVYJV6NKZRgue2B6b34=
141145
github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc=
142146
github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE=
143147
github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY=
@@ -184,8 +188,12 @@ github.com/ipfs/go-ipfs-cmds v0.0.5 h1:+blTEnA0MzkQO86WnpfGnchdojrY5wJLhsbby3/JX
184188
github.com/ipfs/go-ipfs-cmds v0.0.5/go.mod h1:1QVgxSgenZvOMGVC/XUTC7tJxRBGPLxYvpgPpCi3DUk=
185189
github.com/ipfs/go-ipfs-config v0.0.1 h1:6ED08emzI1imdsAjixFi2pEyZxTVD5ECKtCOxLBx+Uc=
186190
github.com/ipfs/go-ipfs-config v0.0.1/go.mod h1:KDbHjNyg4e6LLQSQpkgQMBz6Jf4LXiWAcmnkcwmH0DU=
191+
github.com/ipfs/go-ipfs-config v0.0.3-0.20190422204848-4aaf5baeceef h1:KEFD4DNaAuvrsN5+38l1e+yjomoegKufUtOJbKcN40k=
192+
github.com/ipfs/go-ipfs-config v0.0.3-0.20190422204848-4aaf5baeceef/go.mod h1:KDbHjNyg4e6LLQSQpkgQMBz6Jf4LXiWAcmnkcwmH0DU=
187193
github.com/ipfs/go-ipfs-config v0.0.3 h1:Ep4tRdP1iVK76BgOprD9B/qtOEdpno+1Xb57BqydgGk=
188194
github.com/ipfs/go-ipfs-config v0.0.3/go.mod h1:KDbHjNyg4e6LLQSQpkgQMBz6Jf4LXiWAcmnkcwmH0DU=
195+
github.com/ipfs/go-ipfs-config v0.0.4-0.20190502164316-b06d585017ae h1:2lzUW0VhlY+kUQCFjtBAQoFLNqS1cfWQCUmpbgNGRDI=
196+
github.com/ipfs/go-ipfs-config v0.0.4-0.20190502164316-b06d585017ae/go.mod h1:KDbHjNyg4e6LLQSQpkgQMBz6Jf4LXiWAcmnkcwmH0DU=
189197
github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=
190198
github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ=
191199
github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw=

provider/offline.go

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
11
package provider
22

3-
import "github.com/ipfs/go-cid"
3+
import (
4+
"context"
5+
"github.com/ipfs/go-cid"
6+
)
47

58
type offlineProvider struct{}
69

7-
// NewOfflineProvider creates a Provider that does nothing
8-
func NewOfflineProvider() Provider {
10+
// NewOfflineProvider creates a ProviderSystem that does nothing
11+
func NewOfflineProvider() System {
912
return &offlineProvider{}
1013
}
1114

12-
func (op *offlineProvider) Run() {}
15+
func (op *offlineProvider) Run() {
16+
}
1317

14-
func (op *offlineProvider) Provide(cid cid.Cid) error {
18+
func (op *offlineProvider) Close() error {
1519
return nil
1620
}
1721

18-
func (op *offlineProvider) Close() error {
22+
func (op *offlineProvider) Provide(_ cid.Cid) error {
23+
return nil
24+
}
25+
26+
func (op *offlineProvider) Reprovide(_ context.Context) error {
1927
return nil
2028
}

0 commit comments

Comments
 (0)