mirror of
https://github.com/kaspanet/kaspad.git
synced 2025-10-14 00:59:33 +00:00
[NOD-114] On start, DNSSeeder should update its addresses more frequently (#250)
* [NOD-114] Added a minimum address amount GetAddrs. * [NOD-114] Added smallNetwork intervals for when the network is small. * [NOD-114] Fixed bad minimum address calculation.
This commit is contained in:
parent
7353a49469
commit
c5827febf7
@ -160,6 +160,10 @@ const (
|
|||||||
// will consider evicting an address.
|
// will consider evicting an address.
|
||||||
minBadDays = 7
|
minBadDays = 7
|
||||||
|
|
||||||
|
// getAddrMin is the least addresses that we will send in response
|
||||||
|
// to a getAddr. If we have less than this amount, we send everything.
|
||||||
|
getAddrMin = 50
|
||||||
|
|
||||||
// getAddrMax is the most addresses that we will send in response
|
// getAddrMax is the most addresses that we will send in response
|
||||||
// to a getAddr (in practise the most addresses we will return from a
|
// to a getAddr (in practise the most addresses we will return from a
|
||||||
// call to AddressCache()).
|
// call to AddressCache()).
|
||||||
@ -844,6 +848,12 @@ func (a *AddrManager) AddressCache(includeAllSubnetworks bool, subnetworkID *sub
|
|||||||
if numAddresses > getAddrMax {
|
if numAddresses > getAddrMax {
|
||||||
numAddresses = getAddrMax
|
numAddresses = getAddrMax
|
||||||
}
|
}
|
||||||
|
if len(allAddr) < getAddrMin {
|
||||||
|
numAddresses = len(allAddr)
|
||||||
|
}
|
||||||
|
if len(allAddr) > getAddrMin && numAddresses < getAddrMin {
|
||||||
|
numAddresses = getAddrMin
|
||||||
|
}
|
||||||
|
|
||||||
// Fisher-Yates shuffle the array. We only need to do the first
|
// Fisher-Yates shuffle the array. We only need to do the first
|
||||||
// `numAddresses' since we are throwing the rest.
|
// `numAddresses' since we are throwing the rest.
|
||||||
|
@ -92,8 +92,9 @@ func creep() {
|
|||||||
peers = amgr.Addresses()
|
peers = amgr.Addresses()
|
||||||
}
|
}
|
||||||
if len(peers) == 0 {
|
if len(peers) == 0 {
|
||||||
log.Printf("No stale addresses -- sleeping for 10 minutes")
|
creepIntervalInSeconds := int(amgr.creepInterval().Seconds())
|
||||||
for i := 0; i < 600; i++ {
|
log.Printf("No stale addresses -- sleeping for %d seconds", creepIntervalInSeconds)
|
||||||
|
for i := 0; i < creepIntervalInSeconds; i++ {
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
if atomic.LoadInt32(&systemShutdown) != 0 {
|
if atomic.LoadInt32(&systemShutdown) != 0 {
|
||||||
log.Printf("Creep thread shutdown")
|
log.Printf("Creep thread shutdown")
|
||||||
|
@ -45,6 +45,10 @@ const (
|
|||||||
// stale.
|
// stale.
|
||||||
defaultStaleTimeout = time.Hour
|
defaultStaleTimeout = time.Hour
|
||||||
|
|
||||||
|
// smallNetworkStaleTimeout is the time in which a host is considered
|
||||||
|
// stale if the network is small.
|
||||||
|
smallNetworkStaleTimeout = time.Second * 30
|
||||||
|
|
||||||
// dumpAddressInterval is the interval used to dump the address
|
// dumpAddressInterval is the interval used to dump the address
|
||||||
// cache to disk for future use.
|
// cache to disk for future use.
|
||||||
dumpAddressInterval = time.Second * 30
|
dumpAddressInterval = time.Second * 30
|
||||||
@ -59,6 +63,18 @@ const (
|
|||||||
// pruneExpireTimeout is the expire time in which a node is
|
// pruneExpireTimeout is the expire time in which a node is
|
||||||
// considered dead.
|
// considered dead.
|
||||||
pruneExpireTimeout = time.Hour * 8
|
pruneExpireTimeout = time.Hour * 8
|
||||||
|
|
||||||
|
// defaultCreepInterval is the interval between creep runs.
|
||||||
|
defaultCreepInterval = time.Minute * 10
|
||||||
|
|
||||||
|
// defaultCreepInterval is the interval between creep runs if the
|
||||||
|
// network is small.
|
||||||
|
smallNetworkCreepInterval = time.Second * 30
|
||||||
|
|
||||||
|
// smallNetworkNodeAmount is amount of nodes under which a network
|
||||||
|
// is considered small. A small network has shorter timeouts and
|
||||||
|
// intervals to encourage faster network growth.
|
||||||
|
smallNetworkNodeAmount = 50
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -181,8 +197,8 @@ func (m *Manager) Addresses() []*wire.NetAddress {
|
|||||||
if i == 0 {
|
if i == 0 {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if now.Sub(node.LastSuccess) < defaultStaleTimeout ||
|
if now.Sub(node.LastSuccess) < m.staleTimeout() ||
|
||||||
now.Sub(node.LastAttempt) < defaultStaleTimeout {
|
now.Sub(node.LastAttempt) < m.staleTimeout() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
addrs = append(addrs, node.Addr)
|
addrs = append(addrs, node.Addr)
|
||||||
@ -198,6 +214,22 @@ func (m *Manager) AddressCount() int {
|
|||||||
return len(m.nodes)
|
return len(m.nodes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Manager) staleTimeout() time.Duration {
|
||||||
|
if m.AddressCount() < smallNetworkNodeAmount {
|
||||||
|
return smallNetworkStaleTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultStaleTimeout
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Manager) creepInterval() time.Duration {
|
||||||
|
if m.AddressCount() < smallNetworkNodeAmount {
|
||||||
|
return smallNetworkCreepInterval
|
||||||
|
}
|
||||||
|
|
||||||
|
return defaultCreepInterval
|
||||||
|
}
|
||||||
|
|
||||||
// GoodAddresses returns good working IPs that match both the
|
// GoodAddresses returns good working IPs that match both the
|
||||||
// passed DNS query type and have the requested services.
|
// passed DNS query type and have the requested services.
|
||||||
func (m *Manager) GoodAddresses(qtype uint16, services wire.ServiceFlag, includeAllSubnetworks bool, subnetworkID *subnetworkid.SubnetworkID) []*wire.NetAddress {
|
func (m *Manager) GoodAddresses(qtype uint16, services wire.ServiceFlag, includeAllSubnetworks bool, subnetworkID *subnetworkid.SubnetworkID) []*wire.NetAddress {
|
||||||
@ -230,7 +262,7 @@ func (m *Manager) GoodAddresses(qtype uint16, services wire.ServiceFlag, include
|
|||||||
}
|
}
|
||||||
|
|
||||||
if node.LastSuccess.IsZero() ||
|
if node.LastSuccess.IsZero() ||
|
||||||
now.Sub(node.LastSuccess) > defaultStaleTimeout {
|
now.Sub(node.LastSuccess) > m.staleTimeout() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user