mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-01 10:49:24 +08:00
Merge pull request #3501 from ipfs/feat/namesys/publish-cache
namesys: add entry to DHT cache after publish
This commit is contained in:
@ -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, val path.Path, eol time.Time) error {
|
||||
return ns.publishers["/ipns/"].PublishWithEOL(ctx, name, val, eol)
|
||||
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) 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,
|
||||
})
|
||||
}
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user