2021-12-16 07:01:47 -08:00
|
|
|
package endpoints
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"github.com/gagliardetto/solana-go/rpc"
|
|
|
|
"net"
|
|
|
|
"strconv"
|
|
|
|
)
|
|
|
|
|
|
|
|
const RPCLocalhost = "http://127.0.0.1:8899"
|
|
|
|
|
|
|
|
func GetNodeTPUPorts(ctx context.Context, rpcHost string, nodeIP net.IP) ([]uint16, error) {
|
|
|
|
c := rpc.New(rpcHost)
|
|
|
|
|
|
|
|
out, err := c.GetClusterNodes(ctx)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, node := range out {
|
|
|
|
if node.TPU == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
tpuAddr := *node.TPU
|
|
|
|
host, port, err := net.SplitHostPort(tpuAddr)
|
|
|
|
if err != nil {
|
2021-12-16 07:07:15 -08:00
|
|
|
return nil, fmt.Errorf("error parsing node TPU %s: %w", tpuAddr, err)
|
2021-12-16 07:01:47 -08:00
|
|
|
}
|
|
|
|
if host == nodeIP.String() {
|
|
|
|
port, err := strconv.Atoi(port)
|
|
|
|
if err != nil {
|
2021-12-16 07:07:15 -08:00
|
|
|
return nil, fmt.Errorf("error parsing node TPU %s: %w", tpuAddr, err)
|
2021-12-16 07:01:47 -08:00
|
|
|
}
|
|
|
|
return []uint16{
|
|
|
|
uint16(port), // TPU
|
|
|
|
uint16(port + 1), // TPUfwd
|
|
|
|
uint16(port + 2), // TPUvote
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil, fmt.Errorf("node %s not found in cluster", nodeIP)
|
|
|
|
}
|