graph/db: use batch loading for PruneGraph

This commit is contained in:
Elle Mouton
2025-08-05 14:07:16 +02:00
parent 556af8e221
commit 69bcf47dca
2 changed files with 50 additions and 22 deletions

View File

@@ -2325,31 +2325,12 @@ func (s *SQLStore) PruneGraph(spentOutputs []*wire.OutPoint,
prunedNodes []route.Vertex prunedNodes []route.Vertex
) )
err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error { err := s.db.ExecTx(ctx, sqldb.WriteTxOpt(), func(db SQLQueries) error {
var chansToDelete []int64 // First, collect all channel rows that need to be pruned.
var channelRows []sqlc.GetChannelsByOutpointsRow
// Define the callback function for processing each channel.
channelCallback := func(ctx context.Context, channelCallback := func(ctx context.Context,
row sqlc.GetChannelsByOutpointsRow) error { row sqlc.GetChannelsByOutpointsRow) error {
node1, node2, err := buildNodeVertices( channelRows = append(channelRows, row)
row.Node1Pubkey, row.Node2Pubkey,
)
if err != nil {
return err
}
info, err := getAndBuildEdgeInfo(
ctx, db, s.cfg.ChainHash, row.GraphChannel,
node1, node2,
)
if err != nil {
return err
}
closedChans = append(closedChans, info)
chansToDelete = append(
chansToDelete, row.GraphChannel.ID,
)
return nil return nil
} }
@@ -2362,6 +2343,32 @@ func (s *SQLStore) PruneGraph(spentOutputs []*wire.OutPoint,
"outpoints: %w", err) "outpoints: %w", err)
} }
if len(channelRows) == 0 {
// There are no channels to prune. So we can exit early
// after updating the prune log.
err = db.UpsertPruneLogEntry(
ctx, sqlc.UpsertPruneLogEntryParams{
BlockHash: blockHash[:],
BlockHeight: int64(blockHeight),
},
)
if err != nil {
return fmt.Errorf("unable to insert prune log "+
"entry: %w", err)
}
return nil
}
// Batch build all channel edges for pruning.
var chansToDelete []int64
closedChans, chansToDelete, err = batchBuildChannelInfo(
ctx, s.cfg, db, channelRows,
)
if err != nil {
return err
}
err = s.deleteChannels(ctx, db, chansToDelete) err = s.deleteChannels(ctx, db, chansToDelete)
if err != nil { if err != nil {
return fmt.Errorf("unable to delete channels: %w", err) return fmt.Errorf("unable to delete channels: %w", err)

View File

@@ -105,3 +105,24 @@ func (r GetChannelsBySCIDWithPoliciesRow) Node1Pub() []byte {
func (r GetChannelsBySCIDWithPoliciesRow) Node2Pub() []byte { func (r GetChannelsBySCIDWithPoliciesRow) Node2Pub() []byte {
return r.GraphNode_2.PubKey return r.GraphNode_2.PubKey
} }
// Channel returns the GraphChannel associated with this interface.
//
// NOTE: This method is part of the ChannelAndNodeIDs interface.
func (r GetChannelsByOutpointsRow) Channel() GraphChannel {
return r.GraphChannel
}
// Node1Pub returns the public key of the first node as a byte slice.
//
// NOTE: This method is part of the ChannelAndNodeIDs interface.
func (r GetChannelsByOutpointsRow) Node1Pub() []byte {
return r.Node1Pubkey
}
// Node2Pub returns the public key of the second node as a byte slice.
//
// NOTE: This method is part of the ChannelAndNodeIDs interface.
func (r GetChannelsByOutpointsRow) Node2Pub() []byte {
return r.Node2Pubkey
}