mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-24 21:56:43 +00:00
swarm/network/kadenlia: simplify and fix code that deletes expired/unconnectable nodes
This commit is contained in:
parent
fb83c1fcec
commit
df5c8f3ab5
1 changed files with 20 additions and 17 deletions
|
|
@ -162,7 +162,7 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe
|
||||||
var interval time.Duration
|
var interval time.Duration
|
||||||
var found bool
|
var found bool
|
||||||
var count int
|
var count int
|
||||||
var purge []int
|
var purge []bool
|
||||||
var delta time.Duration
|
var delta time.Duration
|
||||||
var cursor int
|
var cursor int
|
||||||
var after time.Time
|
var after time.Time
|
||||||
|
|
@ -182,6 +182,7 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe
|
||||||
need = true
|
need = true
|
||||||
}
|
}
|
||||||
cursor = self.cursors[po]
|
cursor = self.cursors[po]
|
||||||
|
purge = make([]bool, len(dbrow))
|
||||||
|
|
||||||
// there is a missing slot - finding a node to connect to
|
// there is a missing slot - finding a node to connect to
|
||||||
// select a node record from the relavant kaddb row (of identical prox order)
|
// select a node record from the relavant kaddb row (of identical prox order)
|
||||||
|
|
@ -208,7 +209,7 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe
|
||||||
}
|
}
|
||||||
if delta > self.purgeInterval {
|
if delta > self.purgeInterval {
|
||||||
// remove node
|
// remove node
|
||||||
purge = append(purge, cursor)
|
purge[cursor] = true
|
||||||
glog.V(logger.Debug).Infof("[KΛÐ]: kaddb record %v (PO%03d:%d) unreachable since %v. Removed", node.Addr, po, cursor, node.Seen)
|
glog.V(logger.Debug).Infof("[KΛÐ]: kaddb record %v (PO%03d:%d) unreachable since %v. Removed", node.Addr, po, cursor, node.Seen)
|
||||||
continue ROW
|
continue ROW
|
||||||
}
|
}
|
||||||
|
|
@ -225,7 +226,7 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe
|
||||||
break ROW
|
break ROW
|
||||||
} // ROW
|
} // ROW
|
||||||
self.cursors[po] = cursor
|
self.cursors[po] = cursor
|
||||||
self.delete(po, purge...)
|
self.delete(po, purge)
|
||||||
if found {
|
if found {
|
||||||
return node, true, proxLimit
|
return node, true, proxLimit
|
||||||
}
|
}
|
||||||
|
|
@ -241,22 +242,23 @@ func (self *KadDb) findBest(maxBinSize int, binSize func(int) int) (node *NodeRe
|
||||||
// deletes the noderecords of a kaddb row corresponding to the indexes
|
// deletes the noderecords of a kaddb row corresponding to the indexes
|
||||||
// caller must hold the dblock
|
// caller must hold the dblock
|
||||||
// the call is unsafe, no index checks
|
// the call is unsafe, no index checks
|
||||||
func (self *KadDb) delete(row int, indexes ...int) {
|
func (self *KadDb) delete(row int, purge []bool) {
|
||||||
var prev int
|
|
||||||
var nodes []*NodeRecord
|
var nodes []*NodeRecord
|
||||||
dbrow := self.Nodes[row]
|
dbrow := self.Nodes[row]
|
||||||
for _, next := range indexes {
|
for i, del := range purge {
|
||||||
// need to adjust dbcursor
|
if i == self.cursors[row] {
|
||||||
if next <= self.cursors[row] {
|
//reset cursor
|
||||||
self.cursors[row]--
|
self.cursors[row] = len(nodes)
|
||||||
}
|
}
|
||||||
if next > 0 {
|
// delete the entry to be purged
|
||||||
nodes = append(nodes, dbrow[prev:next]...)
|
if del {
|
||||||
|
delete(self.index, dbrow[i].Addr)
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
delete(self.index, dbrow[next].Addr)
|
// otherwise append to new list
|
||||||
prev = next + 1
|
nodes = append(nodes, dbrow[i])
|
||||||
}
|
}
|
||||||
self.Nodes[row] = append(nodes, dbrow[prev:]...)
|
self.Nodes[row] = nodes
|
||||||
}
|
}
|
||||||
|
|
||||||
// save persists kaddb on disk (written to file on path in json format.
|
// save persists kaddb on disk (written to file on path in json format.
|
||||||
|
|
@ -306,14 +308,15 @@ func (self *KadDb) load(path string, cb func(*NodeRecord, Node) error) (err erro
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var n int
|
var n int
|
||||||
var purge []int
|
var purge []bool
|
||||||
for po, b := range self.Nodes {
|
for po, b := range self.Nodes {
|
||||||
|
purge = make([]bool, len(b))
|
||||||
ROW:
|
ROW:
|
||||||
for i, node := range b {
|
for i, node := range b {
|
||||||
if cb != nil {
|
if cb != nil {
|
||||||
err = cb(node, node.node)
|
err = cb(node, node.node)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
purge = append(purge, i)
|
purge[i] = true
|
||||||
continue ROW
|
continue ROW
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -323,7 +326,7 @@ func (self *KadDb) load(path string, cb func(*NodeRecord, Node) error) (err erro
|
||||||
}
|
}
|
||||||
self.index[node.Addr] = node
|
self.index[node.Addr] = node
|
||||||
}
|
}
|
||||||
self.delete(po, purge...)
|
self.delete(po, purge)
|
||||||
}
|
}
|
||||||
glog.V(logger.Info).Infof("[KΛÐ] loaded kaddb with %v nodes from %v", n, path)
|
glog.V(logger.Info).Infof("[KΛÐ] loaded kaddb with %v nodes from %v", n, path)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue