graph/db: let ForEachNodeCached maybe fetch node addresses
Here we adjust the ForEachNodeCached graph DB method to pass in a node's addresses into the provided call-back if requested. This will allow us to improve the performance of node/channel iteration in the autopilot subserver.
This commit is contained in:
9 files changed
+96
-26
No files matched your search
+31
-7
@@ -1058,17 +1058,19 @@ func (s *SQLStore) ChanUpdatesInHorizon(startTime,
|
||||
}
|
||||
|
||||
// ForEachNodeCached is similar to forEachNode, but it returns DirectedChannel
|
||||
// data to the call-back.
|
||||
//
|
||||
// NOTE: The callback contents MUST not be modified.
|
||||
// data to the call-back. If withAddrs is true, then the call-back will also be
|
||||
// provided with the addresses associated with the node. The address retrieval
|
||||
// result in an additional round-trip to the database, so it should only be used
|
||||
// if the addresses are actually needed.
|
||||
//
|
||||
// NOTE: part of the V1Store interface.
|
||||
func (s *SQLStore) ForEachNodeCached(ctx context.Context,
|
||||
cb func(node route.Vertex, chans map[uint64]*DirectedChannel) error,
|
||||
reset func()) error {
|
||||
func (s *SQLStore) ForEachNodeCached(ctx context.Context, withAddrs bool,
|
||||
cb func(ctx context.Context, node route.Vertex, addrs []net.Addr,
|
||||
chans map[uint64]*DirectedChannel) error, reset func()) error {
|
||||
|
||||
type nodeCachedBatchData struct {
|
||||
features map[int64][]int
|
||||
addrs map[int64][]nodeAddress
|
||||
chanBatchData *batchChannelData
|
||||
chanMap map[int64][]sqlc.ListChannelsForNodeIDsRow
|
||||
}
|
||||
@@ -1101,6 +1103,19 @@ func (s *SQLStore) ForEachNodeCached(ctx context.Context,
|
||||
"node features: %w", err)
|
||||
}
|
||||
|
||||
// Maybe fetch the node's addresses if requested.
|
||||
var nodeAddrs map[int64][]nodeAddress
|
||||
if withAddrs {
|
||||
nodeAddrs, err = batchLoadNodeAddressesHelper(
|
||||
ctx, s.cfg.QueryCfg, db, nodeIDs,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to "+
|
||||
"batch load node "+
|
||||
"addresses: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Batch load ALL unique channels for ALL nodes in this
|
||||
// page.
|
||||
allChannels, err := db.ListChannelsForNodeIDs(
|
||||
@@ -1189,6 +1204,7 @@ func (s *SQLStore) ForEachNodeCached(ctx context.Context,
|
||||
|
||||
return &nodeCachedBatchData{
|
||||
features: nodeFeatures,
|
||||
addrs: nodeAddrs,
|
||||
chanBatchData: channelBatchData,
|
||||
chanMap: nodeChannelMap,
|
||||
}, nil
|
||||
@@ -1232,7 +1248,15 @@ func (s *SQLStore) ForEachNodeCached(ctx context.Context,
|
||||
channels[directedChan.ChannelID] = directedChan
|
||||
}
|
||||
|
||||
return cb(nodePub, channels)
|
||||
addrs, err := buildNodeAddresses(
|
||||
batchData.addrs[nodeData.ID],
|
||||
)
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to build node "+
|
||||
"addresses: %w", err)
|
||||
}
|
||||
|
||||
return cb(ctx, nodePub, addrs, channels)
|
||||
}
|
||||
|
||||
return sqldb.ExecuteCollectAndBatchWithSharedDataQuery(
|
||||
|
||||
Reference in new issue
Block a user