mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-10-10 20:53:02 +02:00
graph/db: use batch loading for PruneGraph
This commit is contained in:
@@ -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)
|
||||||
|
@@ -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
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user