@@ -129,11 +129,11 @@ func OnlineProviders(useStrategicProviding bool, reprovideStrategy string, repro
129
129
var keyProvider fx.Option
130
130
switch reprovideStrategy {
131
131
case "all" , "" :
132
- keyProvider = fx .Provide (provider . NewBlockstoreProvider )
132
+ keyProvider = fx .Provide (newProvidingStrategy ( false , false ) )
133
133
case "roots" :
134
- keyProvider = fx .Provide (pinnedProviderStrategy ( true ))
134
+ keyProvider = fx .Provide (newProvidingStrategy ( true , true ))
135
135
case "pinned" :
136
- keyProvider = fx .Provide (pinnedProviderStrategy ( false ))
136
+ keyProvider = fx .Provide (newProvidingStrategy ( true , false ))
137
137
default :
138
138
return fx .Error (fmt .Errorf ("unknown reprovider strategy %q" , reprovideStrategy ))
139
139
}
@@ -149,13 +149,26 @@ func OfflineProviders() fx.Option {
149
149
return fx .Provide (provider .NewNoopProvider )
150
150
}
151
151
152
- func pinnedProviderStrategy ( onlyRoots bool ) interface {} {
152
+ func newProvidingStrategy ( onlyPinned , onlyRoots bool ) interface {} {
153
153
type input struct {
154
154
fx.In
155
155
Pinner pin.Pinner
156
+ Blockstore blockstore.Blockstore
156
157
IPLDFetcher fetcher.Factory `name:"ipldFetcher"`
157
158
}
158
159
return func (in input ) provider.KeyChanFunc {
159
- return provider .NewPinnedProvider (onlyRoots , in .Pinner , in .IPLDFetcher )
160
+ if onlyRoots {
161
+ return provider .NewPinnedProvider (true , in .Pinner , in .IPLDFetcher )
162
+ }
163
+
164
+ var later provider.KeyChanFunc
165
+ if onlyPinned {
166
+ later = provider .NewPinnedProvider (false , in .Pinner , in .IPLDFetcher )
167
+ } else {
168
+ later = provider .NewBlockstoreProvider (in .Blockstore )
169
+ }
170
+
171
+ roots := provider .NewPinnedProvider (true , in .Pinner , in .IPLDFetcher )
172
+ return provider .NewPrioritizedProvider (roots , later )
160
173
}
161
174
}
0 commit comments