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) { func (pm *ProviderManager) getProvSet(k *cid.Cid) (*providerSet, error) {
cached, ok := pm.providers.Get(k) cached, ok := pm.providers.Get(k.KeyString())
if ok { if ok {
return cached.(*providerSet), nil return cached.(*providerSet), nil
} }
@ -105,7 +105,7 @@ func (pm *ProviderManager) getProvSet(k *cid.Cid) (*providerSet, error) {
} }
if len(pset.providers) > 0 { if len(pset.providers) > 0 {
pm.providers.Add(k, pset) pm.providers.Add(k.KeyString(), pset)
} }
return pset, nil 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 { 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 { if !ok {
iprovs = newProviderSet() iprovs = newProviderSet()
pm.providers.Add(k, iprovs) pm.providers.Add(k.KeyString(), iprovs)
} }
provs := iprovs.(*providerSet) provs := iprovs.(*providerSet)
now := time.Now() 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 { func (pm *ProviderManager) deleteProvSet(k *cid.Cid) error {
pm.providers.Remove(k) pm.providers.Remove(k.KeyString())
res, err := pm.dstore.Query(dsq.Query{ res, err := pm.dstore.Query(dsq.Query{
KeysOnly: true, KeysOnly: true,
@ -277,13 +277,13 @@ func (pm *ProviderManager) run() {
if time.Now().Sub(t) > ProvideValidity { if time.Now().Sub(t) > ProvideValidity {
delete(provs.set, p) delete(provs.set, p)
} else { } else {
log.Error("filtered key: ", t)
filtered = append(filtered, p) filtered = append(filtered, p)
} }
} }
if len(filtered) > 0 { provs.providers = filtered
provs.providers = filtered if len(filtered) == 0 {
} else {
err := pm.deleteProvSet(k) err := pm.deleteProvSet(k)
if err != nil { if err != nil {
log.Error("error deleting provider set: ", err) log.Error("error deleting provider set: ", err)

View File

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