Skip to content

Commit f3420aa

Browse files
authored
Merge pull request #10288 from f321x/debug_failing_regtest
ci/regtest: fix flaky regtest test lnwatcher_waits_until_fees_go_down
2 parents f756e46 + ce7774e commit f3420aa

File tree

7 files changed

+73
-3
lines changed

7 files changed

+73
-3
lines changed

.cirrus.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,16 @@ task:
183183
- tests/regtest/run_bitcoind.sh
184184
electrumx_service_background_script:
185185
- tests/regtest/run_electrumx.sh
186+
# if any test fails, the test will get aborted (--failfast) and the wallet directories will be
187+
# available for download in the Cirrus UI
186188
regtest_script:
187189
- sleep 10s
188-
- python3 -m unittest tests/regtest.py
190+
- python3 -m unittest tests/regtest.py --failfast || TEST_EXIT_CODE=$?
191+
- tar -czf test_wallets.tar.gz /tmp/alice /tmp/bob /tmp/carol || true
192+
- exit ${TEST_EXIT_CODE:-0}
193+
on_failure:
194+
wallet_artifacts:
195+
path: "test_wallets.tar.gz"
189196
env:
190197
LD_LIBRARY_PATH: contrib/_saved_secp256k1_build/
191198
ELECTRUM_REQUIREMENTS: contrib/requirements/requirements.txt

electrum/commands.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,8 @@ async def getfeerate(self):
16241624
async def test_inject_fee_etas(self, fee_est):
16251625
"""
16261626
Inject fee estimates into the network object, as if they were coming from connected servers.
1627+
`setconfig 'test_disable_automatic_fee_eta_update' true` to prevent Network from overriding
1628+
the configured fees.
16271629
Useful on regtest.
16281630
16291631
arg:str:fee_est:dict of ETA-based fee estimates, encoded as str

electrum/lnwatcher.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,12 @@ def maybe_redeem(self, sweep_info: 'SweepInfo') -> bool:
210210
try:
211211
self.lnworker.wallet.txbatcher.add_sweep_input('lnwatcher', sweep_info)
212212
except BelowDustLimit:
213+
self.logger.debug(f"maybe_redeem: BelowDustLimit: {sweep_info.name}")
213214
# utxo is considered dust at *current* fee estimates.
214215
# but maybe the fees atm are very high? We will retry later.
215216
pass
216217
except NoDynamicFeeEstimates:
218+
self.logger.debug(f"maybe_redeem: NoDynamicFeeEstimates: {sweep_info.name}")
217219
pass # will retry later
218220
if sweep_info.is_anchor():
219221
return False

electrum/network.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -612,6 +612,8 @@ def get_fee_estimates(self):
612612

613613
def update_fee_estimates(self, *, fee_est: Dict[int, int] = None):
614614
if fee_est is None:
615+
if self.config.TEST_DISABLE_AUTOMATIC_FEE_ETA_UPDATE:
616+
return
615617
fee_est = self.get_fee_estimates()
616618
for nblock_target, fee in fee_est.items():
617619
self.fee_estimates.set_data(nblock_target, fee)

electrum/simple_config.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,7 @@ def __setattr__(self, name, value):
775775
FEE_POLICY = ConfigVar('fee_policy.default', default='eta:2', type_=str) # exposed to GUI
776776
FEE_POLICY_LIGHTNING = ConfigVar('fee_policy.lnwatcher', default='eta:2', type_=str) # for txbatcher (sweeping)
777777
FEE_POLICY_SWAPS = ConfigVar('fee_policy.swaps', default='eta:2', type_=str) # for txbatcher (sweeping and sending if we are a swapserver)
778+
TEST_DISABLE_AUTOMATIC_FEE_ETA_UPDATE = ConfigVar('test_disable_automatic_fee_eta_update', default=False, type_=bool)
778779

779780
RPC_USERNAME = ConfigVar('rpcuser', default=None, type_=str)
780781
RPC_PASSWORD = ConfigVar('rpcpassword', default=None, type_=str)

electrum/txbatcher.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,10 @@ def is_dust(self, sweep_info: SweepInfo) -> bool:
272272
value = sweep_info.txin.value_sats()
273273
witness_size = len(sweep_info.txin.make_witness(71*b'\x00'))
274274
tx_size_vbytes = 84 + witness_size//4 # assumes no batching, sweep to p2wpkh
275-
self.logger.info(f'{sweep_info.name} size = {tx_size_vbytes}')
276275
fee = self.fee_policy.estimate_fee(tx_size_vbytes, network=self.wallet.network)
277-
return value - fee <= dust_threshold()
276+
is_dust = value - fee <= dust_threshold()
277+
self.logger.info(f'{sweep_info.name} size = {tx_size_vbytes}: {is_dust=}')
278+
return is_dust
278279

279280
@locked
280281
def add_sweep_input(self, sweep_info: 'SweepInfo') -> None:

tests/regtest/regtest.sh

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,17 @@ function wait_until_htlcs_settled()
2222
{
2323
msg="wait until $1's local_unsettled_sent is zero"
2424
cmd="./run_electrum --regtest -D /tmp/$1"
25+
declare -i timeout_sec=30
26+
declare -i elapsed_sec=0
27+
2528
while unsettled=$($cmd list_channels | jq '.[] | .local_unsettled_sent') && [ $unsettled != "0" ]; do
29+
if ((elapsed_sec > timeout_sec)); then
30+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
31+
exit 1
32+
fi
33+
2634
sleep 1
35+
elapsed_sec=$((elapsed_sec + 1))
2736
msg="$msg."
2837
printf "$msg\r"
2938
done
@@ -35,8 +44,17 @@ function wait_for_balance()
3544
{
3645
msg="wait until $1's balance reaches $2"
3746
cmd="./run_electrum --regtest -D /tmp/$1"
47+
declare -i timeout_sec=30
48+
declare -i elapsed_sec=0
49+
3850
while balance=$($cmd getbalance | jq '[.confirmed, .unconfirmed] | to_entries | map(select(.value != null).value) | map(tonumber) | add ') && (( $(echo "$balance < $2" | bc -l) )); do
51+
if ((elapsed_sec > timeout_sec)); then
52+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
53+
exit 1
54+
fi
55+
3956
sleep 1
57+
elapsed_sec=$((elapsed_sec + 1))
4058
msg="$msg."
4159
printf "$msg\r"
4260
done
@@ -47,8 +65,17 @@ function wait_until_channel_open()
4765
{
4866
msg="wait until $1 sees channel open"
4967
cmd="./run_electrum --regtest -D /tmp/$1"
68+
declare -i timeout_sec=30
69+
declare -i elapsed_sec=0
70+
5071
while channel_state=$($cmd list_channels | jq '.[0] | .state' | tr -d '"') && [ $channel_state != "OPEN" ]; do
72+
if ((elapsed_sec > timeout_sec)); then
73+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
74+
exit 1
75+
fi
76+
5177
sleep 1
78+
elapsed_sec=$((elapsed_sec + 1))
5279
msg="$msg."
5380
printf "$msg\r"
5481
done
@@ -59,8 +86,17 @@ function wait_until_channel_closed()
5986
{
6087
msg="wait until $1 sees channel closed"
6188
cmd="./run_electrum --regtest -D /tmp/$1"
89+
declare -i timeout_sec=30
90+
declare -i elapsed_sec=0
91+
6292
while [[ $($cmd list_channels | jq '.[0].state' | tr -d '"') != "CLOSED" ]]; do
93+
if ((elapsed_sec > timeout_sec)); then
94+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
95+
exit 1
96+
fi
97+
6398
sleep 1
99+
elapsed_sec=$((elapsed_sec + 1))
64100
msg="$msg."
65101
printf "$msg\r"
66102
done
@@ -71,8 +107,17 @@ function wait_until_preimage()
71107
{
72108
msg="wait until $1 has preimage for $2"
73109
cmd="./run_electrum --regtest -D /tmp/$1"
110+
declare -i timeout_sec=30
111+
declare -i elapsed_sec=0
112+
74113
while [[ $($cmd get_invoice $2 | jq '.preimage' | tr -d '"') == "null" ]]; do
114+
if ((elapsed_sec > timeout_sec)); then
115+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
116+
exit 1
117+
fi
118+
75119
sleep 1
120+
elapsed_sec=$((elapsed_sec + 1))
76121
msg="$msg."
77122
printf "$msg\r"
78123
done
@@ -82,8 +127,17 @@ function wait_until_preimage()
82127
function wait_until_spent()
83128
{
84129
msg="wait until $1:$2 is spent"
130+
declare -i timeout_sec=30
131+
declare -i elapsed_sec=0
132+
85133
while [[ $($bitcoin_cli gettxout $1 $2) ]]; do
134+
if ((elapsed_sec > timeout_sec)); then
135+
printf "Timeout of %i s exceeded\n" "$elapsed_sec"
136+
exit 1
137+
fi
138+
86139
sleep 1
140+
elapsed_sec=$((elapsed_sec + 1))
87141
msg="$msg."
88142
printf "$msg\r"
89143
done
@@ -331,6 +385,7 @@ if [[ $1 == "lnwatcher_waits_until_fees_go_down" ]]; then
331385
$alice setconfig test_force_disable_mpp true
332386
$alice setconfig test_force_mpp false
333387
wait_for_balance alice 1
388+
$alice setconfig test_disable_automatic_fee_eta_update true
334389
$alice test_inject_fee_etas "{2:1000}"
335390
$bob test_inject_fee_etas "{2:1000}"
336391
echo "alice opens channel"

0 commit comments

Comments
 (0)