Skip to content

Commit a546002

Browse files
committed
fix concurrent_openchannel test: add retry
1 parent c73908c commit a546002

File tree

2 files changed

+149
-64
lines changed

2 files changed

+149
-64
lines changed

src/test/concurrent_openchannel.rs

Lines changed: 59 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -12,92 +12,97 @@ async fn concurrent_openchannel() {
1212
const PUSH_MSAT: u64 = 20000;
1313
const ASSET_AMOUNT: u64 = 100;
1414

15-
let maker_peer_port = NODE1_PEER_PORT;
16-
let taker1_peer_port = NODE2_PEER_PORT;
17-
let taker2_peer_port = NODE3_PEER_PORT;
18-
let taker3_peer_port = NODE4_PEER_PORT;
19-
let taker4_peer_port = NODE5_PEER_PORT;
20-
let taker5_peer_port = NODE6_PEER_PORT;
15+
let node1_peer_port = NODE1_PEER_PORT;
16+
let node2_peer_port = NODE2_PEER_PORT;
17+
let node3_peer_port = NODE3_PEER_PORT;
18+
let node4_peer_port = NODE4_PEER_PORT;
19+
let node5_peer_port = NODE5_PEER_PORT;
20+
let node6_peer_port = NODE6_PEER_PORT;
2121

22-
let test_dir_maker = format!("{TEST_DIR_BASE}maker");
23-
let test_dir_taker1 = format!("{TEST_DIR_BASE}taker1");
24-
let test_dir_taker2 = format!("{TEST_DIR_BASE}taker2");
25-
let test_dir_taker3 = format!("{TEST_DIR_BASE}taker3");
26-
let test_dir_taker4 = format!("{TEST_DIR_BASE}taker4");
27-
let test_dir_taker5 = format!("{TEST_DIR_BASE}taker5");
22+
let test_dir_node1 = format!("{TEST_DIR_BASE}node1");
23+
let test_dir_node2 = format!("{TEST_DIR_BASE}node2");
24+
let test_dir_node3 = format!("{TEST_DIR_BASE}node3");
25+
let test_dir_node4 = format!("{TEST_DIR_BASE}node4");
26+
let test_dir_node5 = format!("{TEST_DIR_BASE}node5");
27+
let test_dir_node6 = format!("{TEST_DIR_BASE}node6");
2828

29-
let (maker_addr, _) = start_node(&test_dir_maker, maker_peer_port, false).await;
30-
let (taker1_addr, _) = start_node(&test_dir_taker1, taker1_peer_port, false).await;
31-
let (taker2_addr, _) = start_node(&test_dir_taker2, taker2_peer_port, false).await;
32-
let (taker3_addr, _) = start_node(&test_dir_taker3, taker3_peer_port, false).await;
33-
let (taker4_addr, _) = start_node(&test_dir_taker4, taker4_peer_port, false).await;
34-
let (taker5_addr, _) = start_node(&test_dir_taker5, taker5_peer_port, false).await;
29+
let (node1_addr, _) = start_node(&test_dir_node1, node1_peer_port, false).await;
30+
let (node2_addr, _) = start_node(&test_dir_node2, node2_peer_port, false).await;
31+
let (node3_addr, _) = start_node(&test_dir_node3, node3_peer_port, false).await;
32+
let (node4_addr, _) = start_node(&test_dir_node4, node4_peer_port, false).await;
33+
let (node5_addr, _) = start_node(&test_dir_node5, node5_peer_port, false).await;
34+
let (node6_addr, _) = start_node(&test_dir_node6, node6_peer_port, false).await;
3535

36-
fund_and_create_utxos(maker_addr, None).await;
37-
create_utxos(maker_addr, false, Some(5), Some(110000)).await;
38-
fund_and_create_utxos(taker1_addr, None).await;
39-
fund_and_create_utxos(taker2_addr, None).await;
40-
fund_and_create_utxos(taker3_addr, None).await;
41-
fund_and_create_utxos(taker4_addr, None).await;
42-
fund_and_create_utxos(taker5_addr, None).await;
36+
fund_and_create_utxos(node1_addr, None).await;
37+
create_utxos(node1_addr, false, Some(5), Some(110000)).await;
38+
fund_and_create_utxos(node2_addr, None).await;
39+
fund_and_create_utxos(node3_addr, None).await;
40+
fund_and_create_utxos(node4_addr, None).await;
41+
fund_and_create_utxos(node5_addr, None).await;
42+
fund_and_create_utxos(node6_addr, None).await;
4343

44-
let asset_id = issue_asset_nia(maker_addr).await.asset_id;
44+
let asset_id = issue_asset_nia(node1_addr).await.asset_id;
4545

46-
let _maker_pubkey = node_info(maker_addr).await.pubkey;
47-
let taker1_pubkey = node_info(taker1_addr).await.pubkey;
48-
let taker2_pubkey = node_info(taker2_addr).await.pubkey;
49-
let taker3_pubkey = node_info(taker3_addr).await.pubkey;
50-
let taker4_pubkey = node_info(taker4_addr).await.pubkey;
51-
let taker5_pubkey = node_info(taker5_addr).await.pubkey;
46+
let _node1_pubkey = node_info(node1_addr).await.pubkey;
47+
let node2_pubkey = node_info(node2_addr).await.pubkey;
48+
let node3_pubkey = node_info(node3_addr).await.pubkey;
49+
let node4_pubkey = node_info(node4_addr).await.pubkey;
50+
let node5_pubkey = node_info(node5_addr).await.pubkey;
51+
let node6_pubkey = node_info(node6_addr).await.pubkey;
5252

5353
let (_channel_mt_1, _channel_mt_2, _channel_mt_3, _channel_mt_4, _channel_mt_5) = tokio::join!(
54-
open_channel(
55-
maker_addr,
56-
&taker1_pubkey,
57-
Some(taker1_peer_port),
54+
open_channel_with_retry(
55+
node1_addr,
56+
&node2_pubkey,
57+
Some(node2_peer_port),
5858
Some(CHANNEL_CAPACITY_SAT),
5959
Some(PUSH_MSAT),
6060
Some(ASSET_AMOUNT),
6161
Some(&asset_id),
62+
20,
6263
),
63-
open_channel(
64-
maker_addr,
65-
&taker2_pubkey,
66-
Some(taker2_peer_port),
64+
open_channel_with_retry(
65+
node1_addr,
66+
&node3_pubkey,
67+
Some(node3_peer_port),
6768
Some(CHANNEL_CAPACITY_SAT),
6869
Some(PUSH_MSAT),
6970
Some(ASSET_AMOUNT),
7071
Some(&asset_id),
72+
20,
7173
),
72-
open_channel(
73-
maker_addr,
74-
&taker3_pubkey,
75-
Some(taker3_peer_port),
74+
open_channel_with_retry(
75+
node1_addr,
76+
&node4_pubkey,
77+
Some(node4_peer_port),
7678
Some(CHANNEL_CAPACITY_SAT),
7779
Some(PUSH_MSAT),
7880
Some(ASSET_AMOUNT),
7981
Some(&asset_id),
82+
20,
8083
),
81-
open_channel(
82-
maker_addr,
83-
&taker4_pubkey,
84-
Some(taker4_peer_port),
84+
open_channel_with_retry(
85+
node1_addr,
86+
&node5_pubkey,
87+
Some(node5_peer_port),
8588
Some(CHANNEL_CAPACITY_SAT),
8689
Some(PUSH_MSAT),
8790
Some(ASSET_AMOUNT),
8891
Some(&asset_id),
92+
20,
8993
),
90-
open_channel(
91-
maker_addr,
92-
&taker5_pubkey,
93-
Some(taker5_peer_port),
94+
open_channel_with_retry(
95+
node1_addr,
96+
&node6_pubkey,
97+
Some(node6_peer_port),
9498
Some(CHANNEL_CAPACITY_SAT),
9599
Some(PUSH_MSAT),
96100
Some(ASSET_AMOUNT),
97101
Some(&asset_id),
102+
20,
98103
)
99104
);
100105

101-
let maker_usable_channels = node_info(maker_addr).await.num_usable_channels;
102-
assert_eq!(maker_usable_channels, 5);
106+
let node1_usable_channels = node_info(node1_addr).await.num_usable_channels;
107+
assert_eq!(node1_usable_channels, 5);
103108
}

src/test/mod.rs

Lines changed: 90 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1055,7 +1055,55 @@ async fn open_channel(
10551055
}
10561056

10571057
#[allow(clippy::too_many_arguments)]
1058-
async fn open_channel_with_custom_data(
1058+
async fn open_channel_with_retry(
1059+
node_address: SocketAddr,
1060+
dest_peer_pubkey: &str,
1061+
dest_peer_port: Option<u16>,
1062+
capacity_sat: Option<u64>,
1063+
push_msat: Option<u64>,
1064+
asset_amount: Option<u64>,
1065+
asset_id: Option<&str>,
1066+
max_retries: u32,
1067+
) -> Channel {
1068+
let mut attempt = 0;
1069+
loop {
1070+
attempt += 1;
1071+
let result = open_channel_raw(
1072+
node_address,
1073+
dest_peer_pubkey,
1074+
dest_peer_port,
1075+
capacity_sat,
1076+
push_msat,
1077+
asset_amount,
1078+
asset_id,
1079+
None,
1080+
None,
1081+
None,
1082+
true,
1083+
)
1084+
.await;
1085+
1086+
match result {
1087+
Ok(channel) => return channel,
1088+
Err(status) if status == reqwest::StatusCode::FORBIDDEN && attempt < max_retries => {
1089+
println!(
1090+
"Channel opening in progress (attempt {}/{}), retrying in 5s...",
1091+
attempt, max_retries
1092+
);
1093+
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
1094+
}
1095+
Err(status) => {
1096+
panic!(
1097+
"Failed to open channel after {} attempts with status: {}",
1098+
attempt, status
1099+
);
1100+
}
1101+
}
1102+
}
1103+
}
1104+
1105+
#[allow(clippy::too_many_arguments)]
1106+
async fn open_channel_raw(
10591107
node_address: SocketAddr,
10601108
dest_peer_pubkey: &str,
10611109
dest_peer_port: Option<u16>,
@@ -1067,12 +1115,11 @@ async fn open_channel_with_custom_data(
10671115
fee_proportional_millionths: Option<u32>,
10681116
temporary_channel_id: Option<&str>,
10691117
with_anchors: bool,
1070-
) -> Channel {
1118+
) -> Result<Channel, reqwest::StatusCode> {
10711119
println!(
10721120
"opening channel with {asset_amount:?} of asset {asset_id:?} from node {node_address} \
10731121
to {dest_peer_pubkey}"
10741122
);
1075-
stop_mining();
10761123

10771124
let blockcount = get_block_count();
10781125
let t_0 = OffsetDateTime::now_utc();
@@ -1110,11 +1157,13 @@ async fn open_channel_with_custom_data(
11101157
.send()
11111158
.await
11121159
.unwrap();
1113-
_check_response_is_ok(res)
1114-
.await
1115-
.json::<OpenChannelResponse>()
1116-
.await
1117-
.unwrap();
1160+
1161+
let status = res.status();
1162+
if !status.is_success() {
1163+
return Err(status);
1164+
}
1165+
1166+
res.json::<OpenChannelResponse>().await.unwrap();
11181167

11191168
let t_0 = OffsetDateTime::now_utc();
11201169
let mut channel_id = None;
@@ -1131,7 +1180,7 @@ async fn open_channel_with_custom_data(
11311180
if channel.funding_txid.is_some() {
11321181
let txout = _get_txout(channel.funding_txid.as_ref().unwrap());
11331182
if !txout.is_empty() {
1134-
mine_n_blocks(true, 6);
1183+
mine_n_blocks(false, 6);
11351184
channel_id = Some(channel.channel_id.clone());
11361185
channel_funded = true;
11371186
continue;
@@ -1153,14 +1202,45 @@ async fn open_channel_with_custom_data(
11531202
.find(|c| c.channel_id == channel_id)
11541203
.unwrap();
11551204
if channel.ready {
1156-
return channel.clone();
1205+
return Ok(channel.clone());
11571206
}
11581207
if (OffsetDateTime::now_utc() - t_0).as_seconds_f32() > 10.0 {
11591208
panic!("channel is taking too long to be ready")
11601209
}
11611210
}
11621211
}
11631212

1213+
#[allow(clippy::too_many_arguments)]
1214+
async fn open_channel_with_custom_data(
1215+
node_address: SocketAddr,
1216+
dest_peer_pubkey: &str,
1217+
dest_peer_port: Option<u16>,
1218+
capacity_sat: Option<u64>,
1219+
push_msat: Option<u64>,
1220+
asset_amount: Option<u64>,
1221+
asset_id: Option<&str>,
1222+
fee_base_msat: Option<u32>,
1223+
fee_proportional_millionths: Option<u32>,
1224+
temporary_channel_id: Option<&str>,
1225+
with_anchors: bool,
1226+
) -> Channel {
1227+
open_channel_raw(
1228+
node_address,
1229+
dest_peer_pubkey,
1230+
dest_peer_port,
1231+
capacity_sat,
1232+
push_msat,
1233+
asset_amount,
1234+
asset_id,
1235+
fee_base_msat,
1236+
fee_proportional_millionths,
1237+
temporary_channel_id,
1238+
with_anchors,
1239+
)
1240+
.await
1241+
.expect("channel opening should succeed")
1242+
}
1243+
11641244
async fn post_asset_media(node_address: SocketAddr, file_path: &str) -> String {
11651245
println!("posting asset media on node {node_address}");
11661246
let file_bytes = tokio::fs::read(file_path).await.unwrap();

0 commit comments

Comments
 (0)