forked from gitwillsky/btsearcher
/
bucket.go
57 lines (48 loc) · 958 Bytes
/
bucket.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package dht
import (
"errors"
"time"
)
// DHT bucket
type Bucket struct {
Nodes []*ContactInfo
lastAccess time.Time
}
// New bucket
func NewBucket() *Bucket {
return &Bucket{
lastAccess: time.Now(),
}
}
// bucket len
func (b *Bucket) Len() int {
return len(b.Nodes)
}
// find node in bucket
func (b *Bucket) FindNode(id ID) (*ContactInfo, error) {
for _, v := range b.Nodes {
if v.Id.Sum() == id.Sum() {
return v, nil
}
}
return nil, errors.New("Can not find this node in the bucket.")
}
// update bucket lastchange time.
func (b *Bucket) UpdateTime(n *ContactInfo) {
b.lastAccess = time.Now()
n.lastAccess = time.Now()
}
// add node to bucket
func (b *Bucket) Add(n *ContactInfo) {
if node, err := b.FindNode(n.Id); err != nil {
// 不存在
b.Nodes = append(b.Nodes, n)
} else {
// 存在,替换掉.
node.Id = n.Id
node.IP = n.IP
node.Port = n.Port
}
// 更新该bucket的新鲜程度.
b.UpdateTime(n)
}