diff --git a/namesys/namesys.go b/namesys/namesys.go index d2f4a3bf7a0..3e0456ce20d 100644 --- a/namesys/namesys.go +++ b/namesys/namesys.go @@ -1,13 +1,15 @@ package namesys import ( + "context" "strings" "time" - context "context" path "github.com/ipfs/go-ipfs/path" + ds "gx/ipfs/QmRWDav6mzWseLWeYfVd5fvUKiVe9xNH29YfMF438fG364/go-datastore" routing "gx/ipfs/QmbkGVaN9W6RYJK4Ws5FvMKXKDqdRQ5snhtaa92qP6L8eU/go-libp2p-routing" + peer "gx/ipfs/QmfMmLGoKzCHDN7cGgk64PJr4iipzidDRME8HABSJqvmhC/go-libp2p-peer" ci "gx/ipfs/QmfWDLQjGjVe4fr5CoztYW2DYYjRysMJrFe1RCsXLPTf46/go-libp2p-crypto" ) @@ -87,9 +89,47 @@ func (ns *mpns) resolveOnce(ctx context.Context, name string) (path.Path, error) // Publish implements Publisher func (ns *mpns) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error { - return ns.publishers["/ipns/"].Publish(ctx, name, value) + err := ns.publishers["/ipns/"].Publish(ctx, name, value) + if err != nil { + return err + } + ns.addToDHTCache(name, value, time.Now().Add(DefaultRecordTTL)) + return nil +} + +func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, value path.Path, eol time.Time) error { + err := ns.publishers["/ipns/"].PublishWithEOL(ctx, name, value, eol) + if err != nil { + return err + } + ns.addToDHTCache(name, value, eol) + return nil } -func (ns *mpns) PublishWithEOL(ctx context.Context, name ci.PrivKey, val path.Path, eol time.Time) error { - return ns.publishers["/ipns/"].PublishWithEOL(ctx, name, val, eol) +func (ns *mpns) addToDHTCache(key ci.PrivKey, value path.Path, eol time.Time) { + var err error + value, err = path.ParsePath(value.String()) + if err != nil { + log.Error("could not parse path") + return + } + + name, err := peer.IDFromPrivateKey(key) + if err != nil { + log.Error("while adding to cache, could not get peerid from private key") + return + } + + rr, ok := ns.resolvers["dht"].(*routingResolver) + if !ok { + // should never happen, purely for sanity + log.Panicf("unexpected type %T as DHT resolver.", ns.resolvers["dht"]) + } + if time.Now().Add(DefaultResolverCacheTTL).Before(eol) { + eol = time.Now().Add(DefaultResolverCacheTTL) + } + rr.cache.Add(name.Pretty(), cacheEntry{ + val: value, + eol: eol, + }) } diff --git a/namesys/publisher.go b/namesys/publisher.go index 795023c83c6..54a0e834ef5 100644 --- a/namesys/publisher.go +++ b/namesys/publisher.go @@ -32,7 +32,8 @@ var ErrExpiredRecord = errors.New("expired record") // unknown validity type. var ErrUnrecognizedValidity = errors.New("unrecognized validity type") -var PublishPutValTimeout = time.Minute +const PublishPutValTimeout = time.Minute +const DefaultRecordTTL = 24 * time.Hour // ipnsPublisher is capable of publishing and resolving names to the IPFS // routing system. @@ -53,7 +54,7 @@ func NewRoutingPublisher(route routing.ValueStore, ds ds.Datastore) *ipnsPublish // and publishes it out to the routing system func (p *ipnsPublisher) Publish(ctx context.Context, k ci.PrivKey, value path.Path) error { log.Debugf("Publish %s", value) - return p.PublishWithEOL(ctx, k, value, time.Now().Add(time.Hour*24)) + return p.PublishWithEOL(ctx, k, value, time.Now().Add(DefaultRecordTTL)) } // PublishWithEOL is a temporary stand in for the ipns records implementation