Skip to content

Commit 5a1184c

Browse files
committed
graph/db+sqldb: remove LEFT JOIN for fetching node addresses
In this commit, we remove the LEFT JOIN query that was used for fetching a nodes addresses. The reason it was used before was to ensure that we'd get an empty address list if the node did exist but had no addresses. This was for the purposes of the `AddrsForNode` method since it needs to return false/true to indicate if the given node exists.
1 parent 43db668 commit 5a1184c

File tree

4 files changed

+54
-67
lines changed

4 files changed

+54
-67
lines changed

graph/db/sql_store.go

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ type SQLQueries interface {
7373
DeleteExtraNodeType(ctx context.Context, arg sqlc.DeleteExtraNodeTypeParams) error
7474

7575
InsertNodeAddress(ctx context.Context, arg sqlc.InsertNodeAddressParams) error
76-
GetNodeAddressesByPubKey(ctx context.Context, arg sqlc.GetNodeAddressesByPubKeyParams) ([]sqlc.GetNodeAddressesByPubKeyRow, error)
76+
GetNodeAddresses(ctx context.Context, nodeID int64) ([]sqlc.GetNodeAddressesRow, error)
7777
DeleteNodeAddresses(ctx context.Context, nodeID int64) error
7878

7979
InsertNodeFeature(ctx context.Context, arg sqlc.InsertNodeFeatureParams) error
@@ -321,10 +321,21 @@ func (s *SQLStore) AddrsForNode(ctx context.Context,
321321
known bool
322322
)
323323
err := s.db.ExecTx(ctx, sqldb.ReadTxOpt(), func(db SQLQueries) error {
324-
var err error
325-
known, addresses, err = getNodeAddresses(
326-
ctx, db, nodePub.SerializeCompressed(),
324+
// First, check if the node exists and get its DB ID if it
325+
// does.
326+
dbID, err := db.GetNodeIDByPubKey(
327+
ctx, sqlc.GetNodeIDByPubKeyParams{
328+
Version: int16(ProtocolV1),
329+
PubKey: nodePub.SerializeCompressed(),
330+
},
327331
)
332+
if errors.Is(err, sql.ErrNoRows) {
333+
return nil
334+
}
335+
336+
known = true
337+
338+
addresses, err = getNodeAddresses(ctx, db, dbID)
328339
if err != nil {
329340
return fmt.Errorf("unable to fetch node addresses: %w",
330341
err)
@@ -3381,7 +3392,7 @@ func buildNode(ctx context.Context, db SQLQueries, dbNode *sqlc.GraphNode) (
33813392
}
33823393

33833394
// Fetch the node's addresses.
3384-
_, node.Addresses, err = getNodeAddresses(ctx, db, pub[:])
3395+
node.Addresses, err = getNodeAddresses(ctx, db, dbNode.ID)
33853396
if err != nil {
33863397
return nil, fmt.Errorf("unable to fetch node(%d) "+
33873398
"addresses: %w", dbNode.ID, err)
@@ -3685,42 +3696,26 @@ func upsertNodeAddresses(ctx context.Context, db SQLQueries, nodeID int64,
36853696
return nil
36863697
}
36873698

3688-
// getNodeAddresses fetches the addresses for a node with the given public key.
3689-
func getNodeAddresses(ctx context.Context, db SQLQueries, nodePub []byte) (bool,
3690-
[]net.Addr, error) {
3699+
// getNodeAddresses fetches the addresses for a node with the given DB ID.
3700+
func getNodeAddresses(ctx context.Context, db SQLQueries, id int64) ([]net.Addr,
3701+
error) {
36913702

3692-
// GetNodeAddressesByPubKey ensures that the addresses for a given type
3693-
// are returned in the same order as they were inserted.
3694-
rows, err := db.GetNodeAddressesByPubKey(
3695-
ctx, sqlc.GetNodeAddressesByPubKeyParams{
3696-
Version: int16(ProtocolV1),
3697-
PubKey: nodePub,
3698-
},
3699-
)
3703+
// GetNodeAddresses ensures that the addresses for a given type are
3704+
// returned in the same order as they were inserted.
3705+
rows, err := db.GetNodeAddresses(ctx, id)
37003706
if err != nil {
3701-
return false, nil, err
3702-
}
3703-
3704-
// GetNodeAddressesByPubKey uses a left join so there should always be
3705-
// at least one row returned if the node exists even if it has no
3706-
// addresses.
3707-
if len(rows) == 0 {
3708-
return false, nil, nil
3707+
return nil, err
37093708
}
37103709

37113710
addresses := make([]net.Addr, 0, len(rows))
3712-
for _, addr := range rows {
3713-
if !(addr.Type.Valid && addr.Address.Valid) {
3714-
continue
3715-
}
3716-
3717-
address := addr.Address.String
3711+
for _, row := range rows {
3712+
address := row.Address
37183713

3719-
switch dbAddressType(addr.Type.Int16) {
3714+
switch dbAddressType(row.Type) {
37203715
case addressTypeIPv4:
37213716
tcp, err := net.ResolveTCPAddr("tcp4", address)
37223717
if err != nil {
3723-
return false, nil, nil
3718+
return nil, err
37243719
}
37253720
tcp.IP = tcp.IP.To4()
37263721

@@ -3729,21 +3724,20 @@ func getNodeAddresses(ctx context.Context, db SQLQueries, nodePub []byte) (bool,
37293724
case addressTypeIPv6:
37303725
tcp, err := net.ResolveTCPAddr("tcp6", address)
37313726
if err != nil {
3732-
return false, nil, nil
3727+
return nil, err
37333728
}
37343729
addresses = append(addresses, tcp)
37353730

37363731
case addressTypeTorV3, addressTypeTorV2:
37373732
service, portStr, err := net.SplitHostPort(address)
37383733
if err != nil {
3739-
return false, nil, fmt.Errorf("unable to "+
3740-
"split tor v3 address: %v",
3741-
addr.Address)
3734+
return nil, fmt.Errorf("unable to "+
3735+
"split tor v3 address: %v", address)
37423736
}
37433737

37443738
port, err := strconv.Atoi(portStr)
37453739
if err != nil {
3746-
return false, nil, err
3740+
return nil, err
37473741
}
37483742

37493743
addresses = append(addresses, &tor.OnionAddr{
@@ -3754,17 +3748,17 @@ func getNodeAddresses(ctx context.Context, db SQLQueries, nodePub []byte) (bool,
37543748
case addressTypeOpaque:
37553749
opaque, err := hex.DecodeString(address)
37563750
if err != nil {
3757-
return false, nil, fmt.Errorf("unable to "+
3758-
"decode opaque address: %v", addr)
3751+
return nil, fmt.Errorf("unable to "+
3752+
"decode opaque address: %v", address)
37593753
}
37603754

37613755
addresses = append(addresses, &lnwire.OpaqueAddrs{
37623756
Payload: opaque,
37633757
})
37643758

37653759
default:
3766-
return false, nil, fmt.Errorf("unknown address "+
3767-
"type: %v", addr.Type)
3760+
return nil, fmt.Errorf("unknown address type: %v",
3761+
row.Type)
37683762
}
37693763
}
37703764

@@ -3774,7 +3768,7 @@ func getNodeAddresses(ctx context.Context, db SQLQueries, nodePub []byte) (bool,
37743768
addresses = nil
37753769
}
37763770

3777-
return true, addresses, nil
3771+
return addresses, nil
37783772
}
37793773

37803774
// upsertNodeExtraSignedFields updates the node's extra signed fields in the

sqldb/sqlc/graph.sql.go

Lines changed: 12 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sqldb/sqlc/querier.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

sqldb/sqlc/queries/graph.sql

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,11 @@ INSERT INTO graph_node_addresses (
134134
$1, $2, $3, $4
135135
);
136136

137-
-- name: GetNodeAddressesByPubKey :many
138-
SELECT a.type, a.address
139-
FROM graph_nodes n
140-
LEFT JOIN graph_node_addresses a ON a.node_id = n.id
141-
WHERE n.pub_key = $1 AND n.version = $2
142-
ORDER BY a.type ASC, a.position ASC;
137+
-- name: GetNodeAddresses :many
138+
SELECT type, address
139+
FROM graph_node_addresses
140+
WHERE node_id = $1
141+
ORDER BY type ASC, position ASC;
143142

144143
-- name: GetNodesByLastUpdateRange :many
145144
SELECT *

0 commit comments

Comments
 (0)