@ -61,6 +61,10 @@ const (
dbVersion = 9
)
var (
errInvalidIP = errors . New ( "invalid IP" )
)
var zeroIP = make ( net . IP , 16 )
// DB is the node database, storing previously seen nodes and any collected metadata about
@ -359,16 +363,25 @@ func (db *DB) expireNodes() {
// LastPingReceived retrieves the time of the last ping packet received from
// a remote node.
func ( db * DB ) LastPingReceived ( id ID , ip net . IP ) time . Time {
if ip = ip . To16 ( ) ; ip == nil {
return time . Time { }
}
return time . Unix ( db . fetchInt64 ( nodeItemKey ( id , ip , dbNodePing ) ) , 0 )
}
// UpdateLastPingReceived updates the last time we tried contacting a remote node.
func ( db * DB ) UpdateLastPingReceived ( id ID , ip net . IP , instance time . Time ) error {
if ip = ip . To16 ( ) ; ip == nil {
return errInvalidIP
}
return db . storeInt64 ( nodeItemKey ( id , ip , dbNodePing ) , instance . Unix ( ) )
}
// LastPongReceived retrieves the time of the last successful pong from remote node.
func ( db * DB ) LastPongReceived ( id ID , ip net . IP ) time . Time {
if ip = ip . To16 ( ) ; ip == nil {
return time . Time { }
}
// Launch expirer
db . ensureExpirer ( )
return time . Unix ( db . fetchInt64 ( nodeItemKey ( id , ip , dbNodePong ) ) , 0 )
@ -376,26 +389,41 @@ func (db *DB) LastPongReceived(id ID, ip net.IP) time.Time {
// UpdateLastPongReceived updates the last pong time of a node.
func ( db * DB ) UpdateLastPongReceived ( id ID , ip net . IP , instance time . Time ) error {
if ip = ip . To16 ( ) ; ip == nil {
return errInvalidIP
}
return db . storeInt64 ( nodeItemKey ( id , ip , dbNodePong ) , instance . Unix ( ) )
}
// FindFails retrieves the number of findnode failures since bonding.
func ( db * DB ) FindFails ( id ID , ip net . IP ) int {
if ip = ip . To16 ( ) ; ip == nil {
return 0
}
return int ( db . fetchInt64 ( nodeItemKey ( id , ip , dbNodeFindFails ) ) )
}
// UpdateFindFails updates the number of findnode failures since bonding.
func ( db * DB ) UpdateFindFails ( id ID , ip net . IP , fails int ) error {
if ip = ip . To16 ( ) ; ip == nil {
return errInvalidIP
}
return db . storeInt64 ( nodeItemKey ( id , ip , dbNodeFindFails ) , int64 ( fails ) )
}
// FindFailsV5 retrieves the discv5 findnode failure counter.
func ( db * DB ) FindFailsV5 ( id ID , ip net . IP ) int {
if ip = ip . To16 ( ) ; ip == nil {
return 0
}
return int ( db . fetchInt64 ( v5Key ( id , ip , dbNodeFindFails ) ) )
}
// UpdateFindFailsV5 stores the discv5 findnode failure counter.
func ( db * DB ) UpdateFindFailsV5 ( id ID , ip net . IP , fails int ) error {
if ip = ip . To16 ( ) ; ip == nil {
return errInvalidIP
}
return db . storeInt64 ( v5Key ( id , ip , dbNodeFindFails ) , int64 ( fails ) )
}