1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-07-01 02:23:18 +08:00

Merge pull request #2197 from ipfs/feat/faster-resolve

do resolve operations concurrently
This commit is contained in:
Juan Benet
2016-01-15 12:52:48 -05:00

View File

@ -11,6 +11,7 @@ import (
key "github.com/ipfs/go-ipfs/blocks/key" key "github.com/ipfs/go-ipfs/blocks/key"
pb "github.com/ipfs/go-ipfs/namesys/pb" pb "github.com/ipfs/go-ipfs/namesys/pb"
ci "github.com/ipfs/go-ipfs/p2p/crypto"
path "github.com/ipfs/go-ipfs/path" path "github.com/ipfs/go-ipfs/path"
routing "github.com/ipfs/go-ipfs/routing" routing "github.com/ipfs/go-ipfs/routing"
u "github.com/ipfs/go-ipfs/util" u "github.com/ipfs/go-ipfs/util"
@ -123,33 +124,51 @@ func (r *routingResolver) resolveOnce(ctx context.Context, name string) (path.Pa
hash, err := mh.FromB58String(name) hash, err := mh.FromB58String(name)
if err != nil { if err != nil {
// name should be a multihash. if it isn't, error out here.
log.Warningf("RoutingResolve: bad input hash: [%s]\n", name) log.Warningf("RoutingResolve: bad input hash: [%s]\n", name)
return "", err return "", err
} }
// name should be a multihash. if it isn't, error out here.
// use the routing system to get the name. // use the routing system to get the name.
// /ipns/<name> // /ipns/<name>
h := []byte("/ipns/" + string(hash)) h := []byte("/ipns/" + string(hash))
var entry *pb.IpnsEntry
var pubkey ci.PubKey
resp := make(chan error, 2)
go func() {
ipnsKey := key.Key(h) ipnsKey := key.Key(h)
val, err := r.routing.GetValue(ctx, ipnsKey) val, err := r.routing.GetValue(ctx, ipnsKey)
if err != nil { if err != nil {
log.Warning("RoutingResolve get failed.") log.Warning("RoutingResolve get failed.")
return "", err resp <- err
} }
entry := new(pb.IpnsEntry) entry = new(pb.IpnsEntry)
err = proto.Unmarshal(val, entry) err = proto.Unmarshal(val, entry)
if err != nil { if err != nil {
return "", err resp <- err
} }
resp <- nil
}()
go func() {
// name should be a public key retrievable from ipfs // name should be a public key retrievable from ipfs
pubkey, err := routing.GetPublicKey(r.routing, ctx, hash) pubk, err := routing.GetPublicKey(r.routing, ctx, hash)
if err != nil {
resp <- err
}
pubkey = pubk
resp <- nil
}()
for i := 0; i < 2; i++ {
err = <-resp
if err != nil { if err != nil {
return "", err return "", err
} }
}
hsh, _ := pubkey.Hash() hsh, _ := pubkey.Hash()
log.Debugf("pk hash = %s", key.Key(hsh)) log.Debugf("pk hash = %s", key.Key(hsh))