@@ -2,6 +2,8 @@ package main
2
2
3
3
import (
4
4
"fmt"
5
+ "github.com/filecoin-project/boost/retrievalmarket/lp2pimpl"
6
+ transports_types "github.com/filecoin-project/boost/retrievalmarket/types"
5
7
"sort"
6
8
"strings"
7
9
"sync"
@@ -21,6 +23,20 @@ var statsCmd = &cli.Command{
21
23
Name : "stats" ,
22
24
Description : "Statistics on how many SPs are running Boost" ,
23
25
Before : before ,
26
+ Flags : []cli.Flag {
27
+ & cli.IntFlag {
28
+ Name : "lotus-read-concurrency" ,
29
+ Value : 50 ,
30
+ },
31
+ & cli.IntFlag {
32
+ Name : "sp-query-concurrency" ,
33
+ Value : 1 ,
34
+ },
35
+ & cli.IntFlag {
36
+ Name : "sp-query-max" ,
37
+ Value : 0 ,
38
+ },
39
+ },
24
40
Action : func (cctx * cli.Context ) error {
25
41
ctx := cliutil .ReqContext (cctx )
26
42
@@ -49,7 +65,7 @@ var statsCmd = &cli.Command{
49
65
minerToMinerPower := make (map [address.Address ]power.Claim )
50
66
minerToTotalPower := make (map [address.Address ]power.Claim )
51
67
52
- throttle := make (chan struct {}, 50 )
68
+ throttle := make (chan struct {}, cctx . Int ( "lotus-read-concurrency" ) )
53
69
for _ , miner := range miners {
54
70
throttle <- struct {}{}
55
71
go func (miner address.Address ) {
@@ -78,68 +94,125 @@ var statsCmd = &cli.Command{
78
94
fmt .Println ("Total SPs with minimum power: " , len (withMinPower ))
79
95
80
96
var boostNodes , marketsNodes , noProtocolsNodes , indexerNodes int
81
-
82
97
boostRawBytePower := big .NewInt (0 )
83
98
boostQualityAdjPower := big .NewInt (0 )
99
+ agentVersions := make (map [string ]int )
100
+ transportProtos := make (map [string ]int )
84
101
85
- for _ , maddr := range withMinPower {
102
+ throttle = make (chan struct {}, cctx .Int ("sp-query-concurrency" ))
103
+ for i , maddr := range withMinPower {
86
104
select {
87
105
case <- ctx .Done ():
88
106
return nil
89
107
default :
90
108
}
91
- err := func () error {
92
- addrInfo , err := cmd .GetAddrInfo (ctx , api , maddr )
93
- if err != nil {
94
- return fmt .Errorf ("getting provider multi-address: %w" , err )
95
- }
96
109
97
- log .Debugw ("connecting to storage provider" ,
98
- "id" , addrInfo .ID , "multiaddrs" , addrInfo .Addrs , "addr" , maddr )
110
+ spQueryMax := cctx .Int ("sp-query-max" )
111
+ if spQueryMax > 0 && i >= spQueryMax {
112
+ break
113
+ }
99
114
100
- if err := n .Host .Connect (ctx , * addrInfo ); err != nil {
101
- return fmt .Errorf ("connecting to peer %s: %w" , addrInfo .ID , err )
102
- }
115
+ throttle <- struct {}{}
116
+ wg .Add (1 )
117
+ go func (maddr address.Address ) {
118
+ defer wg .Done ()
119
+ defer func () {
120
+ <- throttle
121
+ }()
122
+ err := func () error {
123
+ addrInfo , err := cmd .GetAddrInfo (ctx , api , maddr )
124
+ if err != nil {
125
+ return fmt .Errorf ("getting provider multi-address: %w" , err )
126
+ }
127
+
128
+ log .Debugw ("connecting to storage provider" ,
129
+ "id" , addrInfo .ID , "multiaddrs" , addrInfo .Addrs , "addr" , maddr )
130
+
131
+ if err := n .Host .Connect (ctx , * addrInfo ); err != nil {
132
+ return fmt .Errorf ("connecting to peer %s: %w" , addrInfo .ID , err )
133
+ }
134
+
135
+ // Get peer's libp2p protocols
136
+ protos , err := n .Host .Peerstore ().GetProtocols (addrInfo .ID )
137
+ if err != nil {
138
+ return fmt .Errorf ("getting protocols for peer %s: %w" , addrInfo .ID , err )
139
+ }
140
+ sort .Strings (protos )
141
+
142
+ // Get peer's libp2p agent version
143
+ agentVersionI , err := n .Host .Peerstore ().Get (addrInfo .ID , "AgentVersion" )
144
+ if err != nil {
145
+ return fmt .Errorf ("getting agent version for peer %s: %w" , addrInfo .ID , err )
146
+ }
147
+ agentVersion , ok := agentVersionI .(string )
148
+ if ! ok {
149
+ return fmt .Errorf ("AgentVersion for peer %s is not a string: type %T" , addrInfo .ID , agentVersionI )
150
+ }
151
+
152
+ // Get SP's supported transports
153
+ var transports * transports_types.QueryResponse
154
+ if contains (protos , string (lp2pimpl .TransportsProtocolID )) {
155
+ client := lp2pimpl .NewTransportsClient (n .Host )
156
+ transports , err = client .SendQuery (ctx , addrInfo .ID )
157
+ if err != nil {
158
+ fmt .Printf ("Failed to fetch transports from peer %s: %s\n " , addrInfo .ID , err )
159
+ }
160
+ }
161
+
162
+ lk .Lock ()
163
+ var out string
164
+ out += "Provider " + maddr .String ()
165
+ if contains (protos , "/fil/storage/mk/1.2.0" ) {
166
+ out += " is running boost"
103
167
104
- protos , err := n .Host .Peerstore ().GetProtocols (addrInfo .ID )
168
+ boostNodes ++
169
+ boostQualityAdjPower = big .Add (boostQualityAdjPower , minerToMinerPower [maddr ].QualityAdjPower )
170
+ boostRawBytePower = big .Add (boostRawBytePower , minerToMinerPower [maddr ].RawBytePower )
171
+ agentVersions [agentVersion ]++
172
+ if transports != nil {
173
+ for _ , p := range transports .Protocols {
174
+ transportProtos [p .Name ]++
175
+ }
176
+ }
177
+ } else if contains (protos , "/fil/storage/mk/1.1.0" ) {
178
+ out += " is running markets"
179
+ agentVersions [agentVersion ]++
180
+ marketsNodes ++
181
+ } else {
182
+ out += " is not running markets or boost"
183
+ noProtocolsNodes ++
184
+ }
185
+ if contains (protos , "/legs/head/" ) {
186
+ out += " (with indexer)"
187
+ indexerNodes ++
188
+ }
189
+ lk .Unlock ()
190
+
191
+ out += "\n "
192
+ out += " agent version: " + agentVersion + "\n "
193
+ out += " raw power: " + minerToMinerPower [maddr ].RawBytePower .String () + "\n "
194
+ out += " quality adj power: " + minerToMinerPower [maddr ].QualityAdjPower .String () + "\n "
195
+ out += " protocols:\n "
196
+ out += " " + strings .Join (protos , "\n " ) + "\n "
197
+
198
+ if transports != nil {
199
+ out += " transports:\n "
200
+ for _ , p := range transports .Protocols {
201
+ out += " " + p .Name + "\n "
202
+ }
203
+ }
204
+
205
+ fmt .Print (out )
206
+ return nil
207
+ }()
105
208
if err != nil {
106
- return fmt .Errorf ( "getting protocols for peer %s: %w" , addrInfo . ID , err )
209
+ fmt .Println ( "Error: " , err )
107
210
}
108
- sort .Strings (protos )
109
-
110
- fmt .Print ("Provider " + maddr .String ())
111
- if contains (protos , "/fil/storage/mk/1.2.0" ) {
112
- fmt .Print (" is running boost" )
113
- fmt .Println ()
114
-
115
- fmt .Println ("boost provider " , maddr .String (), "raw power:" , minerToMinerPower [maddr ].RawBytePower )
116
- fmt .Println ("boost provider " , maddr .String (), "quality adj power:" , minerToMinerPower [maddr ].QualityAdjPower )
117
- fmt .Println ("boost provider " , maddr .String (), "protos:" , protos )
118
-
119
- boostNodes ++
120
- boostQualityAdjPower = big .Add (boostQualityAdjPower , minerToMinerPower [maddr ].QualityAdjPower )
121
- boostRawBytePower = big .Add (boostRawBytePower , minerToMinerPower [maddr ].RawBytePower )
122
- } else if contains (protos , "/fil/storage/mk/1.1.0" ) {
123
- fmt .Print (" is running markets" )
124
- marketsNodes ++
125
- } else {
126
- fmt .Print (" is running fewer protocols" )
127
- noProtocolsNodes ++
128
- }
129
- if contains (protos , "/legs/head/" ) {
130
- fmt .Print (" (with indexer)" )
131
- indexerNodes ++
132
- }
133
- fmt .Println ()
134
-
135
- return nil
136
- }()
137
- if err != nil {
138
- fmt .Println ("Error: " , err )
139
- continue
140
- }
211
+ }(maddr )
141
212
}
142
213
214
+ wg .Wait ()
215
+
143
216
fmt .Println ()
144
217
fmt .Println ("Total Boost nodes:" , boostNodes )
145
218
fmt .Println ("Total Boost raw power:" , boostRawBytePower )
@@ -148,6 +221,26 @@ var statsCmd = &cli.Command{
148
221
fmt .Println ("Total SPs with minimum power: " , len (withMinPower ))
149
222
fmt .Println ("Total Indexer nodes:" , indexerNodes )
150
223
224
+ agentVersionsOrder := make ([]string , 0 , len (agentVersions ))
225
+ for av := range agentVersions {
226
+ agentVersionsOrder = append (agentVersionsOrder , av )
227
+ }
228
+ sort .Strings (agentVersionsOrder )
229
+ fmt .Println ("Agent Versions:" )
230
+ for _ , av := range agentVersionsOrder {
231
+ fmt .Printf (" %s: %d\n " , av , agentVersions [av ])
232
+ }
233
+
234
+ transportsOrder := make ([]string , 0 , len (transportProtos ))
235
+ for transport := range transportProtos {
236
+ transportsOrder = append (transportsOrder , transport )
237
+ }
238
+ sort .Strings (transportsOrder )
239
+ fmt .Println ("Retrieval Protocol Support:" )
240
+ for _ , transport := range transportsOrder {
241
+ fmt .Printf (" %s: %d\n " , transport , transportProtos [transport ])
242
+ }
243
+
151
244
return nil
152
245
},
153
246
}
0 commit comments