Skip to content

Commit 4e5a129

Browse files
Merge pull request ipfs#21 from polezaivsani/fix/providers/bugfixes
Fix/providers/bugfixes
2 parents df7a822 + c12d865 commit 4e5a129

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

providers/providers.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ func readTimeValue(i interface{}) (time.Time, error) {
160160
func (pm *ProviderManager) addProv(k *cid.Cid, p peer.ID) error {
161161
iprovs, ok := pm.providers.Get(k.KeyString())
162162
if !ok {
163-
iprovs = newProviderSet()
163+
stored, err := loadProvSet(pm.dstore, k)
164+
if err != nil {
165+
return err
166+
}
167+
iprovs = stored
164168
pm.providers.Add(k.KeyString(), iprovs)
165169
}
166170
provs := iprovs.(*providerSet)
@@ -186,6 +190,9 @@ func (pm *ProviderManager) deleteProvSet(k *cid.Cid) error {
186190
KeysOnly: true,
187191
Prefix: mkProvKey(k),
188192
})
193+
if err != nil {
194+
return err
195+
}
189196

190197
entries, err := res.Rest()
191198
if err != nil {
@@ -288,6 +295,7 @@ func (pm *ProviderManager) run() {
288295
}
289296
}
290297
case <-pm.proc.Closing():
298+
tick.Stop()
291299
return
292300
}
293301
}

providers/providers_test.go

+23
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,26 @@ func TestLargeProvidersSet(t *testing.T) {
206206
207207
}
208208
//*/
209+
210+
func TestUponCacheMissProvidersAreReadFromDatastore(t *testing.T) {
211+
old := lruCacheSize
212+
lruCacheSize = 1
213+
defer func() { lruCacheSize = old }()
214+
ctx := context.Background()
215+
216+
p1, p2 := peer.ID("a"), peer.ID("b")
217+
c1 := cid.NewCidV1(cid.CBOR, u.Hash([]byte("1")))
218+
c2 := cid.NewCidV1(cid.CBOR, u.Hash([]byte("2")))
219+
pm := NewProviderManager(ctx, p1, ds.NewMapDatastore())
220+
221+
pm.AddProvider(ctx, c1, p1)
222+
// make the cached provider for c1 go to datastore
223+
pm.AddProvider(ctx, c2, p1)
224+
// now just offloaded record should be brought back and joined with p2
225+
pm.AddProvider(ctx, c1, p2)
226+
227+
c1Provs := pm.GetProviders(ctx, c1)
228+
if len(c1Provs) != 2 {
229+
t.Fatalf("expected c1 to be provided by 2 peers, is by %d", len(c1Provs))
230+
}
231+
}

0 commit comments

Comments
 (0)