swarm/network/kadenlia: simplify and fix code that deletes expired/unconnectable nodes

This commit is contained in:
zelig 2016-06-14 12:43:04 +01:00
parent fb83c1fcec
commit df5c8f3ab5

View file

@ -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)