-
Notifications
You must be signed in to change notification settings - Fork 0
/
topology.go
158 lines (139 loc) · 5.06 KB
/
topology.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
// Package topology exposes abstractions needed in
// topology-aware components.
package topology
import (
"errors"
"io"
"time"
"github.com/redesblock/mop/core/cluster"
"github.com/redesblock/mop/core/p2p"
)
var (
ErrNotFound = errors.New("no peer found")
ErrWantSelf = errors.New("node wants self")
ErrOversaturated = errors.New("oversaturated")
)
type Driver interface {
p2p.Notifier
PeerAdder
ClosestPeerer
EachPeerer
EachNeighbor
NeighborhoodDepther
SubscribeTopologyChange() (c <-chan struct{}, unsubscribe func())
io.Closer
Halter
Snapshot() *KadParams
}
type PeerAdder interface {
// AddPeers is called when peers are added to the topology backlog
AddPeers(addr ...cluster.Address)
}
type ClosestPeerer interface {
// ClosestPeer returns the closest connected peer we have in relation to a
// given chunk address.
// This function will ignore peers with addresses provided in skipPeers.
// Returns topology.ErrWantSelf in case base is the closest to the address.
ClosestPeer(addr cluster.Address, includeSelf bool, f Filter, skipPeers ...cluster.Address) (peerAddr cluster.Address, err error)
}
type EachPeerer interface {
// EachPeer iterates from closest bin to farthest
EachPeer(EachPeerFunc, Filter) error
// EachPeerRev iterates from farthest bin to closest
EachPeerRev(EachPeerFunc, Filter) error
}
type EachNeighbor interface {
// EachNeighbor iterates from closest bin to farthest within the neighborhood.
EachNeighbor(EachPeerFunc) error
// EachNeighborRev iterates from farthest bin to closest within the neighborhood.
EachNeighborRev(EachPeerFunc) error
// IsWithinDepth checks if an address is the within neighborhood.
IsWithinDepth(cluster.Address) bool
}
// Filter defines the different filters that can be used with the Peer iterators
type Filter struct {
Reachable bool
}
// EachPeerFunc is a callback that is called with a peer and its PO
type EachPeerFunc func(cluster.Address, uint8) (stop, jumpToNext bool, err error)
// PeerInfo is a view of peer information exposed to a user.
type PeerInfo struct {
Address cluster.Address `json:"address"`
Metrics *MetricSnapshotView `json:"metrics,omitempty"`
}
// MetricSnapshotView represents snapshot of metrics counters in more human readable form.
type MetricSnapshotView struct {
LastSeenTimestamp int64 `json:"lastSeenTimestamp"`
SessionConnectionRetry uint64 `json:"sessionConnectionRetry"`
ConnectionTotalDuration float64 `json:"connectionTotalDuration"`
SessionConnectionDuration float64 `json:"sessionConnectionDuration"`
SessionConnectionDirection string `json:"sessionConnectionDirection"`
LatencyEWMA int64 `json:"latencyEWMA"`
Reachability string `json:"reachability"`
}
type BinInfo struct {
BinPopulation uint `json:"population"`
BinConnected uint `json:"connected"`
DisconnectedPeers []*PeerInfo `json:"disconnectedPeers"`
ConnectedPeers []*PeerInfo `json:"connectedPeers"`
}
type KadBins struct {
Bin0 BinInfo `json:"bin_0"`
Bin1 BinInfo `json:"bin_1"`
Bin2 BinInfo `json:"bin_2"`
Bin3 BinInfo `json:"bin_3"`
Bin4 BinInfo `json:"bin_4"`
Bin5 BinInfo `json:"bin_5"`
Bin6 BinInfo `json:"bin_6"`
Bin7 BinInfo `json:"bin_7"`
Bin8 BinInfo `json:"bin_8"`
Bin9 BinInfo `json:"bin_9"`
Bin10 BinInfo `json:"bin_10"`
Bin11 BinInfo `json:"bin_11"`
Bin12 BinInfo `json:"bin_12"`
Bin13 BinInfo `json:"bin_13"`
Bin14 BinInfo `json:"bin_14"`
Bin15 BinInfo `json:"bin_15"`
Bin16 BinInfo `json:"bin_16"`
Bin17 BinInfo `json:"bin_17"`
Bin18 BinInfo `json:"bin_18"`
Bin19 BinInfo `json:"bin_19"`
Bin20 BinInfo `json:"bin_20"`
Bin21 BinInfo `json:"bin_21"`
Bin22 BinInfo `json:"bin_22"`
Bin23 BinInfo `json:"bin_23"`
Bin24 BinInfo `json:"bin_24"`
Bin25 BinInfo `json:"bin_25"`
Bin26 BinInfo `json:"bin_26"`
Bin27 BinInfo `json:"bin_27"`
Bin28 BinInfo `json:"bin_28"`
Bin29 BinInfo `json:"bin_29"`
Bin30 BinInfo `json:"bin_30"`
Bin31 BinInfo `json:"bin_31"`
}
type KadParams struct {
Base string `json:"baseAddr"` // base address string
Population int `json:"population"` // known
Connected int `json:"connected"` // connected count
Timestamp time.Time `json:"timestamp"` // now
NNLowWatermark int `json:"nnLowWatermark"` // low watermark for depth calculation
Depth uint8 `json:"depth"` // current depth
Reachability string `json:"reachability"` // current reachability status
NetworkAvailability string `json:"networkAvailability"` // network availability
Bins KadBins `json:"bins"` // individual bin info
LightNodes BinInfo `json:"lightNodes"` // light nodes bin info
}
type Halter interface {
// Halt the topology from initiating new connections
// while allowing it to still run.
Halt()
}
type NeighborhoodDepther interface {
NeighborhoodDepth() uint8
}
type SetStorageRadiuser interface {
SetStorageRadius(uint8)
}
type PeersCounter interface {
PeersCount(Filter) int
}