Skip to content

Commit 38aaa4d

Browse files
committed
staticaddr: recover withdrawals in parallel
Use errgroup to publish each transaction in a separate goroutine. Publishing a transaction can take a while in neutrino mode.
1 parent 6f50b27 commit 38aaa4d

File tree

2 files changed

+39
-26
lines changed

2 files changed

+39
-26
lines changed

go.mod

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/btcsuite/btcd/btcutil v1.1.5
77
github.com/btcsuite/btcd/btcutil/psbt v1.1.10
88
github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0
9-
github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect
9+
github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318
1010
github.com/btcsuite/btcwallet v0.16.13
1111
github.com/btcsuite/btcwallet/wtxmgr v1.5.6
1212
github.com/davecgh/go-spew v1.1.1
@@ -36,15 +36,14 @@ require (
3636
github.com/urfave/cli v1.22.14
3737
go.etcd.io/bbolt v1.3.11
3838
golang.org/x/net v0.38.0
39+
golang.org/x/sync v0.12.0
3940
google.golang.org/grpc v1.64.1
4041
google.golang.org/protobuf v1.34.2
4142
gopkg.in/macaroon-bakery.v2 v2.3.0
4243
gopkg.in/macaroon.v2 v2.1.0
4344
modernc.org/sqlite v1.34.5
4445
)
4546

46-
require github.com/btcsuite/btclog/v2 v2.0.1-0.20250110154127-3ae4bf1cb318
47-
4847
require (
4948
dario.cat/mergo v1.0.1 // indirect
5049
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
@@ -56,6 +55,7 @@ require (
5655
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
5756
github.com/aead/siphash v1.0.1 // indirect
5857
github.com/beorn7/perks v1.0.1 // indirect
58+
github.com/btcsuite/btclog v0.0.0-20241003133417-09c4e92e319c // indirect
5959
github.com/btcsuite/btcwallet/wallet/txauthor v1.3.5 // indirect
6060
github.com/btcsuite/btcwallet/wallet/txrules v1.2.2 // indirect
6161
github.com/btcsuite/btcwallet/wallet/txsizes v1.2.5 // indirect
@@ -185,7 +185,6 @@ require (
185185
golang.org/x/crypto v0.36.0 // indirect
186186
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 // indirect
187187
golang.org/x/mod v0.21.0 // indirect
188-
golang.org/x/sync v0.12.0 // indirect
189188
golang.org/x/sys v0.31.0 // indirect
190189
golang.org/x/term v0.30.0 // indirect
191190
golang.org/x/text v0.23.0 // indirect

staticaddr/withdraw/manager.go

Lines changed: 36 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"github.com/lightningnetwork/lnd/lntypes"
2727
"github.com/lightningnetwork/lnd/lnwallet"
2828
"github.com/lightningnetwork/lnd/lnwallet/chainfee"
29+
"golang.org/x/sync/errgroup"
2930
)
3031

3132
var (
@@ -238,32 +239,45 @@ func (m *Manager) recoverWithdrawals(ctx context.Context) error {
238239
)
239240
}
240241

242+
// Publishing a transaction can take a while in neutrino mode, so
243+
// do it in parallel.
244+
eg := &errgroup.Group{}
245+
241246
// We can now reinstate each cluster of deposits for a withdrawal.
242-
for finalizedWithdrawalTx, deposits := range depositsByWithdrawalTx {
243-
tx := finalizedWithdrawalTx
244-
err = m.cfg.DepositManager.TransitionDeposits(
245-
ctx, deposits, deposit.OnWithdrawInitiated,
246-
deposit.Withdrawing,
247-
)
248-
if err != nil {
249-
return err
250-
}
247+
for tx, deposits := range depositsByWithdrawalTx {
248+
eg.Go(func() error {
249+
err := m.cfg.DepositManager.TransitionDeposits(
250+
ctx, deposits, deposit.OnWithdrawInitiated,
251+
deposit.Withdrawing,
252+
)
253+
if err != nil {
254+
return err
255+
}
251256

252-
_, err = m.publishFinalizedWithdrawalTx(ctx, tx)
253-
if err != nil {
254-
return err
255-
}
257+
_, err = m.publishFinalizedWithdrawalTx(ctx, tx)
258+
if err != nil {
259+
return err
260+
}
256261

257-
err = m.handleWithdrawal(
258-
ctx, deposits, tx.TxHash(), tx.TxOut[0].PkScript,
259-
)
260-
if err != nil {
261-
return err
262-
}
262+
err = m.handleWithdrawal(
263+
ctx, deposits, tx.TxHash(),
264+
tx.TxOut[0].PkScript,
265+
)
266+
if err != nil {
267+
return err
268+
}
263269

264-
m.mu.Lock()
265-
m.finalizedWithdrawalTxns[tx.TxHash()] = tx
266-
m.mu.Unlock()
270+
m.mu.Lock()
271+
m.finalizedWithdrawalTxns[tx.TxHash()] = tx
272+
m.mu.Unlock()
273+
274+
return nil
275+
})
276+
}
277+
278+
// Wait for all goroutines to report back.
279+
if err := eg.Wait(); err != nil {
280+
return fmt.Errorf("error recovering withdrawals: %w", err)
267281
}
268282

269283
return nil

0 commit comments

Comments
 (0)