Skip to content

Commit a1e7cc1

Browse files
authored
boostx stats: output agent version and retrieval protocols (#1304)
* feat: boostx stats - output agent version and retrieval protocols * fix: boostx stats - count agent versions for both boost and legacy markets nodes
1 parent 7804bd3 commit a1e7cc1

File tree

1 file changed

+141
-48
lines changed

1 file changed

+141
-48
lines changed

cmd/boostx/stats_cmd.go

+141-48
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package main
22

33
import (
44
"fmt"
5+
"github.com/filecoin-project/boost/retrievalmarket/lp2pimpl"
6+
transports_types "github.com/filecoin-project/boost/retrievalmarket/types"
57
"sort"
68
"strings"
79
"sync"
@@ -21,6 +23,20 @@ var statsCmd = &cli.Command{
2123
Name: "stats",
2224
Description: "Statistics on how many SPs are running Boost",
2325
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+
},
2440
Action: func(cctx *cli.Context) error {
2541
ctx := cliutil.ReqContext(cctx)
2642

@@ -49,7 +65,7 @@ var statsCmd = &cli.Command{
4965
minerToMinerPower := make(map[address.Address]power.Claim)
5066
minerToTotalPower := make(map[address.Address]power.Claim)
5167

52-
throttle := make(chan struct{}, 50)
68+
throttle := make(chan struct{}, cctx.Int("lotus-read-concurrency"))
5369
for _, miner := range miners {
5470
throttle <- struct{}{}
5571
go func(miner address.Address) {
@@ -78,68 +94,125 @@ var statsCmd = &cli.Command{
7894
fmt.Println("Total SPs with minimum power: ", len(withMinPower))
7995

8096
var boostNodes, marketsNodes, noProtocolsNodes, indexerNodes int
81-
8297
boostRawBytePower := big.NewInt(0)
8398
boostQualityAdjPower := big.NewInt(0)
99+
agentVersions := make(map[string]int)
100+
transportProtos := make(map[string]int)
84101

85-
for _, maddr := range withMinPower {
102+
throttle = make(chan struct{}, cctx.Int("sp-query-concurrency"))
103+
for i, maddr := range withMinPower {
86104
select {
87105
case <-ctx.Done():
88106
return nil
89107
default:
90108
}
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-
}
96109

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+
}
99114

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"
103167

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+
}()
105208
if err != nil {
106-
return fmt.Errorf("getting protocols for peer %s: %w", addrInfo.ID, err)
209+
fmt.Println("Error: ", err)
107210
}
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)
141212
}
142213

214+
wg.Wait()
215+
143216
fmt.Println()
144217
fmt.Println("Total Boost nodes:", boostNodes)
145218
fmt.Println("Total Boost raw power:", boostRawBytePower)
@@ -148,6 +221,26 @@ var statsCmd = &cli.Command{
148221
fmt.Println("Total SPs with minimum power: ", len(withMinPower))
149222
fmt.Println("Total Indexer nodes:", indexerNodes)
150223

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+
151244
return nil
152245
},
153246
}

0 commit comments

Comments
 (0)