Skip to content

Commit 2011946

Browse files
authored
Merge branch 'develop' into fix/nakamoto-downloader-at-reward-cycle-boundary
2 parents 616345b + 4bceb29 commit 2011946

File tree

15 files changed

+311
-472
lines changed

15 files changed

+311
-472
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ and this project adheres to the versioning scheme outlined in the [README.md](RE
1717
- `get-tenure-info?` added
1818
- `get-block-info?` removed
1919
- Added `/v3/signer/{signer_pubkey}/{reward_cycle}` endpoint
20+
- Added optional `timeout_ms` to `events_observer` configuration
2021

2122
## [2.5.0.0.7]
2223

stacks-common/src/libcommon.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ pub mod consts {
8484

8585
/// this should be updated to the latest network epoch version supported by
8686
/// this node. this will be checked by the `validate_epochs()` method.
87-
pub const PEER_NETWORK_EPOCH: u32 = PEER_VERSION_EPOCH_2_5 as u32;
87+
pub const PEER_NETWORK_EPOCH: u32 = PEER_VERSION_EPOCH_3_0 as u32;
8888

8989
/// set the fourth byte of the peer version
9090
pub const PEER_VERSION_MAINNET: u32 = PEER_VERSION_MAINNET_MAJOR | PEER_NETWORK_EPOCH;

testnet/stacks-node/src/config.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1128,11 +1128,10 @@ impl Config {
11281128
.map(|e| EventKeyType::from_string(e).unwrap())
11291129
.collect();
11301130

1131-
let endpoint = format!("{}", observer.endpoint);
1132-
11331131
observers.insert(EventObserverConfig {
1134-
endpoint,
1132+
endpoint: observer.endpoint,
11351133
events_keys,
1134+
timeout_ms: observer.timeout_ms.unwrap_or(1_000),
11361135
});
11371136
}
11381137
observers
@@ -1146,6 +1145,7 @@ impl Config {
11461145
events_observers.insert(EventObserverConfig {
11471146
endpoint: val,
11481147
events_keys: vec![EventKeyType::AnyEvent],
1148+
timeout_ms: 1_000,
11491149
});
11501150
()
11511151
}
@@ -2921,12 +2921,14 @@ impl AtlasConfigFile {
29212921
pub struct EventObserverConfigFile {
29222922
pub endpoint: String,
29232923
pub events_keys: Vec<String>,
2924+
pub timeout_ms: Option<u64>,
29242925
}
29252926

29262927
#[derive(Clone, Default, Debug, Hash, PartialEq, Eq, PartialOrd)]
29272928
pub struct EventObserverConfig {
29282929
pub endpoint: String,
29292930
pub events_keys: Vec<EventKeyType>,
2931+
pub timeout_ms: u64,
29302932
}
29312933

29322934
#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd)]

testnet/stacks-node/src/event_dispatcher.rs

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ use super::config::{EventKeyType, EventObserverConfig};
6969
#[derive(Debug, Clone)]
7070
struct EventObserver {
7171
endpoint: String,
72+
timeout: Duration,
7273
}
7374

7475
struct ReceiptPayloadInfo<'a> {
@@ -335,8 +336,7 @@ impl EventObserver {
335336
.parse()
336337
.unwrap_or(PeerHost::DNS(host.to_string(), port));
337338

338-
let backoff = Duration::from_millis(1000); // 1 second
339-
339+
let mut backoff = Duration::from_millis(100);
340340
loop {
341341
let mut request = StacksHttpRequest::new_for_peer(
342342
peerhost.clone(),
@@ -347,7 +347,7 @@ impl EventObserver {
347347
.unwrap_or_else(|_| panic!("FATAL: failed to encode infallible data as HTTP request"));
348348
request.add_header("Connection".into(), "close".into());
349349

350-
match send_http_request(host, port, request, backoff) {
350+
match send_http_request(host, port, request, self.timeout) {
351351
Ok(response) => {
352352
if response.preamble().status_code == 200 {
353353
debug!(
@@ -368,6 +368,7 @@ impl EventObserver {
368368
}
369369
}
370370
sleep(backoff);
371+
backoff *= 2;
371372
}
372373
}
373374

@@ -1406,6 +1407,7 @@ impl EventDispatcher {
14061407
info!("Registering event observer at: {}", conf.endpoint);
14071408
let event_observer = EventObserver {
14081409
endpoint: conf.endpoint.clone(),
1410+
timeout: Duration::from_millis(conf.timeout_ms),
14091411
};
14101412

14111413
let observer_index = self.registered_observers.len() as u16;
@@ -1498,6 +1500,7 @@ mod test {
14981500
fn build_block_processed_event() {
14991501
let observer = EventObserver {
15001502
endpoint: "nowhere".to_string(),
1503+
timeout: Duration::from_secs(3),
15011504
};
15021505

15031506
let filtered_events = vec![];
@@ -1558,6 +1561,7 @@ mod test {
15581561
fn test_block_processed_event_nakamoto() {
15591562
let observer = EventObserver {
15601563
endpoint: "nowhere".to_string(),
1564+
timeout: Duration::from_secs(3),
15611565
};
15621566

15631567
let filtered_events = vec![];
@@ -1699,6 +1703,7 @@ mod test {
16991703

17001704
let observer = EventObserver {
17011705
endpoint: format!("127.0.0.1:{}", port),
1706+
timeout: Duration::from_secs(3),
17021707
};
17031708

17041709
let payload = json!({"key": "value"});
@@ -1749,6 +1754,7 @@ mod test {
17491754

17501755
let observer = EventObserver {
17511756
endpoint: format!("127.0.0.1:{}", port),
1757+
timeout: Duration::from_secs(3),
17521758
};
17531759

17541760
let payload = json!({"key": "value"});
@@ -1759,4 +1765,69 @@ mod test {
17591765
rx.recv_timeout(Duration::from_secs(5))
17601766
.expect("Server did not receive request in time");
17611767
}
1768+
1769+
#[test]
1770+
fn test_send_payload_timeout() {
1771+
let port = get_random_port();
1772+
let timeout = Duration::from_secs(3);
1773+
1774+
// Set up a channel to notify when the server has processed the request
1775+
let (tx, rx) = channel();
1776+
1777+
// Start a mock server in a separate thread
1778+
let server = Server::http(format!("127.0.0.1:{}", port)).unwrap();
1779+
thread::spawn(move || {
1780+
let mut attempt = 0;
1781+
let mut _request_holder = None;
1782+
while let Ok(request) = server.recv() {
1783+
attempt += 1;
1784+
if attempt == 1 {
1785+
debug!("Mock server received request attempt 1");
1786+
// Do not reply, forcing the sender to timeout and retry,
1787+
// but don't drop the request or it will receive a 500 error,
1788+
_request_holder = Some(request);
1789+
} else {
1790+
debug!("Mock server received request attempt 2");
1791+
// Simulate a successful response on the second attempt
1792+
let response = Response::from_string("HTTP/1.1 200 OK");
1793+
request.respond(response).unwrap();
1794+
1795+
// Notify the test that the request was processed successfully
1796+
tx.send(()).unwrap();
1797+
break;
1798+
}
1799+
}
1800+
});
1801+
1802+
let observer = EventObserver {
1803+
endpoint: format!("127.0.0.1:{}", port),
1804+
timeout,
1805+
};
1806+
1807+
let payload = json!({"key": "value"});
1808+
1809+
// Record the time before sending the payload
1810+
let start_time = Instant::now();
1811+
1812+
// Call the function being tested
1813+
observer.send_payload(&payload, "/test");
1814+
1815+
// Record the time after the function returns
1816+
let elapsed_time = start_time.elapsed();
1817+
1818+
println!("Elapsed time: {:?}", elapsed_time);
1819+
assert!(
1820+
elapsed_time >= timeout,
1821+
"Expected a timeout, but the function returned too quickly"
1822+
);
1823+
1824+
assert!(
1825+
elapsed_time < timeout + Duration::from_secs(1),
1826+
"Expected a timeout, but the function took too long"
1827+
);
1828+
1829+
// Wait for the server to process the request
1830+
rx.recv_timeout(Duration::from_secs(5))
1831+
.expect("Server did not receive request in time");
1832+
}
17621833
}

testnet/stacks-node/src/tests/epoch_205.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,10 @@ fn test_exact_block_costs() {
109109
.collect();
110110

111111
test_observer::spawn();
112-
conf.events_observers.insert(EventObserverConfig {
113-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
114-
events_keys: vec![EventKeyType::AnyEvent, EventKeyType::MinedBlocks],
115-
});
112+
test_observer::register(
113+
&mut conf,
114+
&[EventKeyType::AnyEvent, EventKeyType::MinedBlocks],
115+
);
116116

117117
let mut btcd_controller = BitcoinCoreController::new(conf.clone());
118118
btcd_controller
@@ -335,10 +335,7 @@ fn test_dynamic_db_method_costs() {
335335
};
336336

337337
test_observer::spawn();
338-
conf.events_observers.insert(EventObserverConfig {
339-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
340-
events_keys: vec![EventKeyType::AnyEvent],
341-
});
338+
test_observer::register_any(&mut conf);
342339

343340
let mut btcd_controller = BitcoinCoreController::new(conf.clone());
344341
btcd_controller
@@ -772,10 +769,7 @@ fn test_cost_limit_switch_version205() {
772769
});
773770

774771
test_observer::spawn();
775-
conf.events_observers.insert(EventObserverConfig {
776-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
777-
events_keys: vec![EventKeyType::AnyEvent],
778-
});
772+
test_observer::register_any(&mut conf);
779773

780774
let mut btcd_controller = BitcoinCoreController::new(conf.clone());
781775
btcd_controller
@@ -1029,10 +1023,7 @@ fn bigger_microblock_streams_in_2_05() {
10291023
conf.burnchain.pox_2_activation = Some(10_003);
10301024

10311025
test_observer::spawn();
1032-
conf.events_observers.insert(EventObserverConfig {
1033-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
1034-
events_keys: vec![EventKeyType::AnyEvent],
1035-
});
1026+
test_observer::register_any(&mut conf);
10361027

10371028
let mut btcd_controller = BitcoinCoreController::new(conf.clone());
10381029
btcd_controller

testnet/stacks-node/src/tests/epoch_21.rs

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,7 @@ fn advance_to_2_1(
7171
conf.burnchain.peer_host = "localhost".to_string();
7272
conf.initial_balances.append(&mut initial_balances);
7373
conf.miner.block_reward_recipient = block_reward_recipient;
74-
75-
conf.events_observers.insert(EventObserverConfig {
76-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
77-
events_keys: vec![EventKeyType::AnyEvent],
78-
});
74+
test_observer::register_any(&mut conf);
7975

8076
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
8177
epochs[1].end_height = epoch_2_05;
@@ -576,10 +572,7 @@ fn transition_fixes_bitcoin_rigidity() {
576572
];
577573

578574
conf.initial_balances.append(&mut initial_balances);
579-
conf.events_observers.insert(EventObserverConfig {
580-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
581-
events_keys: vec![EventKeyType::AnyEvent],
582-
});
575+
test_observer::register_any(&mut conf);
583576

584577
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
585578
epochs[1].end_height = epoch_2_05;
@@ -1472,11 +1465,7 @@ fn transition_removes_pox_sunset() {
14721465
let (mut conf, miner_account) = neon_integration_test_conf();
14731466

14741467
test_observer::spawn();
1475-
1476-
conf.events_observers.insert(EventObserverConfig {
1477-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
1478-
events_keys: vec![EventKeyType::AnyEvent],
1479-
});
1468+
test_observer::register_any(&mut conf);
14801469

14811470
conf.initial_balances.push(InitialBalance {
14821471
address: spender_addr.clone(),
@@ -1787,11 +1776,7 @@ fn transition_empty_blocks() {
17871776
conf.burnchain.epochs = Some(epochs);
17881777

17891778
test_observer::spawn();
1790-
1791-
conf.events_observers.insert(EventObserverConfig {
1792-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
1793-
events_keys: vec![EventKeyType::AnyEvent],
1794-
});
1779+
test_observer::register_any(&mut conf);
17951780

17961781
let keychain = Keychain::default(conf.node.seed.clone());
17971782
let http_origin = format!("http://{}", &conf.node.rpc_bind);
@@ -4737,10 +4722,7 @@ fn trait_invocation_cross_epoch() {
47374722
amount: 200_000_000,
47384723
}];
47394724
conf.initial_balances.append(&mut initial_balances);
4740-
conf.events_observers.insert(EventObserverConfig {
4741-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
4742-
events_keys: vec![EventKeyType::AnyEvent],
4743-
});
4725+
test_observer::register_any(&mut conf);
47444726
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
47454727
epochs[1].end_height = epoch_2_05;
47464728
epochs[2].start_height = epoch_2_05;
@@ -4982,11 +4964,7 @@ fn test_v1_unlock_height_with_current_stackers() {
49824964
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
49834965

49844966
test_observer::spawn();
4985-
4986-
conf.events_observers.insert(EventObserverConfig {
4987-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
4988-
events_keys: vec![EventKeyType::AnyEvent],
4989-
});
4967+
test_observer::register_any(&mut conf);
49904968
conf.initial_balances.append(&mut initial_balances);
49914969

49924970
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
@@ -5247,11 +5225,7 @@ fn test_v1_unlock_height_with_delay_and_current_stackers() {
52475225
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
52485226

52495227
test_observer::spawn();
5250-
5251-
conf.events_observers.insert(EventObserverConfig {
5252-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
5253-
events_keys: vec![EventKeyType::AnyEvent],
5254-
});
5228+
test_observer::register_any(&mut conf);
52555229
conf.initial_balances.append(&mut initial_balances);
52565230

52575231
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();

testnet/stacks-node/src/tests/epoch_22.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,11 +134,7 @@ fn disable_pox() {
134134
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
135135

136136
test_observer::spawn();
137-
138-
conf.events_observers.insert(EventObserverConfig {
139-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
140-
events_keys: vec![EventKeyType::AnyEvent],
141-
});
137+
test_observer::register_any(&mut conf);
142138
conf.initial_balances.append(&mut initial_balances);
143139

144140
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
@@ -671,6 +667,7 @@ fn pox_2_unlock_all() {
671667
conf.events_observers.insert(EventObserverConfig {
672668
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
673669
events_keys: vec![EventKeyType::AnyEvent],
670+
timeout_ms: 1000,
674671
});
675672
conf.initial_balances.append(&mut initial_balances);
676673

testnet/stacks-node/src/tests/epoch_23.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,7 @@ fn trait_invocation_behavior() {
100100
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
101101

102102
test_observer::spawn();
103-
104-
conf.events_observers.insert(EventObserverConfig {
105-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
106-
events_keys: vec![EventKeyType::AnyEvent],
107-
});
103+
test_observer::register_any(&mut conf);
108104
conf.initial_balances.append(&mut initial_balances);
109105

110106
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();

testnet/stacks-node/src/tests/epoch_24.rs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,7 @@ fn fix_to_pox_contract() {
152152
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
153153

154154
test_observer::spawn();
155-
156-
conf.events_observers.insert(EventObserverConfig {
157-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
158-
events_keys: vec![EventKeyType::AnyEvent],
159-
});
155+
test_observer::register_any(&mut conf);
160156
conf.initial_balances.append(&mut initial_balances);
161157

162158
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();
@@ -791,11 +787,7 @@ fn verify_auto_unlock_behavior() {
791787
conf.miner.subsequent_attempt_time_ms = i64::MAX as u64;
792788

793789
test_observer::spawn();
794-
795-
conf.events_observers.insert(EventObserverConfig {
796-
endpoint: format!("localhost:{}", test_observer::EVENT_OBSERVER_PORT),
797-
events_keys: vec![EventKeyType::AnyEvent],
798-
});
790+
test_observer::register_any(&mut conf);
799791
conf.initial_balances.append(&mut initial_balances);
800792

801793
let mut epochs = core::STACKS_EPOCHS_REGTEST.to_vec();

0 commit comments

Comments
 (0)