diff --git a/dht.go b/dht.go index 6823a54cf..489858425 100644 --- a/dht.go +++ b/dht.go @@ -71,6 +71,8 @@ type IpfsDHT struct { rtRefreshQueryTimeout time.Duration rtRefreshPeriod time.Duration triggerRtRefresh chan struct{} + + maxRecordAge time.Duration } // Assert that IPFS assumptions about interfaces aren't broken. These aren't a @@ -95,6 +97,8 @@ func New(ctx context.Context, h host.Host, options ...opts.Option) (*IpfsDHT, er dht.rtRefreshPeriod = cfg.RoutingTable.RefreshPeriod dht.rtRefreshQueryTimeout = cfg.RoutingTable.RefreshQueryTimeout + dht.maxRecordAge = cfg.MaxRecordAge + // register for network notifs. dht.host.Network().Notify((*netNotifiee)(dht)) diff --git a/handlers.go b/handlers.go index f517d0153..a0736064d 100644 --- a/handlers.go +++ b/handlers.go @@ -118,7 +118,7 @@ func (dht *IpfsDHT) checkLocalDatastore(k []byte) (*recpb.Record, error) { recordIsBad = true } - if time.Since(recvtime) > MaxRecordAge { + if time.Since(recvtime) > dht.maxRecordAge { logger.Debug("old record found, tossing.") recordIsBad = true } diff --git a/opts/options.go b/opts/options.go index 8da33eeac..e0e524c17 100644 --- a/opts/options.go +++ b/opts/options.go @@ -21,11 +21,12 @@ var ( // Options is a structure containing all the options that can be used when constructing a DHT. type Options struct { - Datastore ds.Batching - Validator record.Validator - Client bool - Protocols []protocol.ID - BucketSize int + Datastore ds.Batching + Validator record.Validator + Client bool + Protocols []protocol.ID + BucketSize int + MaxRecordAge time.Duration RoutingTable struct { RefreshQueryTimeout time.Duration @@ -59,6 +60,7 @@ var Defaults = func(o *Options) error { o.RoutingTable.RefreshQueryTimeout = 10 * time.Second o.RoutingTable.RefreshPeriod = 1 * time.Hour o.RoutingTable.AutoRefresh = true + o.MaxRecordAge = time.Hour * 36 return nil } @@ -153,6 +155,19 @@ func BucketSize(bucketSize int) Option { } } +// MaxRecordAge specifies the maximum time that any node will hold onto a record ("PutValue record") +// from the time its received. This does not apply to any other forms of validity that +// the record may contain. +// For example, a record may contain an ipns entry with an EOL saying its valid +// until the year 2020 (a great time in the future). For that record to stick around +// it must be rebroadcasted more frequently than once every 'MaxRecordAge' +func MaxRecordAge(maxAge time.Duration) Option { + return func(o *Options) error { + o.MaxRecordAge = maxAge + return nil + } +} + // DisableAutoRefresh completely disables 'auto-refresh' on the DHT routing // table. This means that we will neither refresh the routing table periodically // nor when the routing table size goes below the minimum threshold. diff --git a/records.go b/records.go index 5f641b056..7a1ee0ca0 100644 --- a/records.go +++ b/records.go @@ -3,7 +3,6 @@ package dht import ( "context" "fmt" - "time" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/routing" @@ -11,14 +10,6 @@ import ( ci "github.com/libp2p/go-libp2p-core/crypto" ) -// MaxRecordAge specifies the maximum time that any node will hold onto a record -// from the time its received. This does not apply to any other forms of validity that -// the record may contain. -// For example, a record may contain an ipns entry with an EOL saying its valid -// until the year 2020 (a great time in the future). For that record to stick around -// it must be rebroadcasted more frequently than once every 'MaxRecordAge' -const MaxRecordAge = time.Hour * 36 - type pubkrs struct { pubk ci.PubKey err error