fix providers code, cant use cids as lru keys

This commit is contained in:
Jeromy 2016-09-30 10:56:47 -07:00
parent e00b3ca0a4
commit 1ac83501a2
2 changed files with 27 additions and 26 deletions

View File

@ -94,7 +94,7 @@ func (pm *ProviderManager) providersForKey(k *cid.Cid) ([]peer.ID, error) {
}
func (pm *ProviderManager) getProvSet(k *cid.Cid) (*providerSet, error) {
cached, ok := pm.providers.Get(k)
cached, ok := pm.providers.Get(k.KeyString())
if ok {
return cached.(*providerSet), nil
}
@ -105,7 +105,7 @@ func (pm *ProviderManager) getProvSet(k *cid.Cid) (*providerSet, error) {
}
if len(pset.providers) > 0 {
pm.providers.Add(k, pset)
pm.providers.Add(k.KeyString(), pset)
}
return pset, nil
@ -161,10 +161,10 @@ func readTimeValue(i interface{}) (time.Time, error) {
}
func (pm *ProviderManager) addProv(k *cid.Cid, p peer.ID) error {
iprovs, ok := pm.providers.Get(k)
iprovs, ok := pm.providers.Get(k.KeyString())
if !ok {
iprovs = newProviderSet()
pm.providers.Add(k, iprovs)
pm.providers.Add(k.KeyString(), iprovs)
}
provs := iprovs.(*providerSet)
now := time.Now()
@ -183,7 +183,7 @@ func writeProviderEntry(dstore ds.Datastore, k *cid.Cid, p peer.ID, t time.Time)
}
func (pm *ProviderManager) deleteProvSet(k *cid.Cid) error {
pm.providers.Remove(k)
pm.providers.Remove(k.KeyString())
res, err := pm.dstore.Query(dsq.Query{
KeysOnly: true,
@ -277,13 +277,13 @@ func (pm *ProviderManager) run() {
if time.Now().Sub(t) > ProvideValidity {
delete(provs.set, p)
} else {
log.Error("filtered key: ", t)
filtered = append(filtered, p)
}
}
if len(filtered) > 0 {
provs.providers = filtered
} else {
provs.providers = filtered
if len(filtered) == 0 {
err := pm.deleteProvSet(k)
if err != nil {
log.Error("error deleting provider set: ", err)

View File

@ -5,8 +5,9 @@ import (
"testing"
"time"
cid "github.com/ipfs/go-cid"
ds "github.com/ipfs/go-datastore"
key "github.com/ipfs/go-key"
u "github.com/ipfs/go-ipfs-util"
peer "github.com/ipfs/go-libp2p-peer"
context "golang.org/x/net/context"
)
@ -15,7 +16,7 @@ func TestProviderManager(t *testing.T) {
ctx := context.Background()
mid := peer.ID("testing")
p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
a := key.Key("test")
a := cid.NewCidV0(u.Hash([]byte("test")))
p.AddProvider(ctx, a, peer.ID("testingprovider"))
resp := p.GetProviders(ctx, a)
if len(resp) != 1 {
@ -35,15 +36,15 @@ func TestProvidersDatastore(t *testing.T) {
defer p.proc.Close()
friend := peer.ID("friend")
var keys []key.Key
var cids []*cid.Cid
for i := 0; i < 100; i++ {
k := key.Key(fmt.Sprint(i))
keys = append(keys, k)
p.AddProvider(ctx, k, friend)
c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))
cids = append(cids, c)
p.AddProvider(ctx, c, friend)
}
for _, k := range keys {
resp := p.GetProviders(ctx, k)
for _, c := range cids {
resp := p.GetProviders(ctx, c)
if len(resp) != 1 {
t.Fatal("Could not retrieve provider.")
}
@ -56,7 +57,7 @@ func TestProvidersDatastore(t *testing.T) {
func TestProvidersSerialization(t *testing.T) {
dstore := ds.NewMapDatastore()
k := key.Key("my key!")
k := cid.NewCidV0(u.Hash(([]byte("my key!"))))
p1 := peer.ID("peer one")
p2 := peer.ID("peer two")
pt1 := time.Now()
@ -111,16 +112,16 @@ func TestProvidesExpire(t *testing.T) {
p := NewProviderManager(ctx, mid, ds.NewMapDatastore())
peers := []peer.ID{"a", "b"}
var keys []key.Key
var cids []*cid.Cid
for i := 0; i < 10; i++ {
k := key.Key(i)
keys = append(keys, k)
p.AddProvider(ctx, k, peers[0])
p.AddProvider(ctx, k, peers[1])
c := cid.NewCidV0(u.Hash([]byte(fmt.Sprint(i))))
cids = append(cids, c)
p.AddProvider(ctx, c, peers[0])
p.AddProvider(ctx, c, peers[1])
}
for i := 0; i < 10; i++ {
out := p.GetProviders(ctx, keys[i])
out := p.GetProviders(ctx, cids[i])
if len(out) != 2 {
t.Fatal("expected providers to still be there")
}
@ -128,9 +129,9 @@ func TestProvidesExpire(t *testing.T) {
time.Sleep(time.Second)
for i := 0; i < 10; i++ {
out := p.GetProviders(ctx, keys[i])
if len(out) > 2 {
t.Fatal("expected providers to be cleaned up")
out := p.GetProviders(ctx, cids[i])
if len(out) > 0 {
t.Fatal("expected providers to be cleaned up, got: ", out)
}
}