0.3.15-pre.015
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
// file: crates/ksp-onchain-transport-lib/unit_tests/grpc_stream.rs
|
||||
// version: 6
|
||||
// version: 7
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
enum FixtureMode {
|
||||
@@ -501,21 +501,32 @@ async fn yellowstone_session_drop_best_effort_half_closes_request_stream() {
|
||||
}
|
||||
|
||||
#[tokio::test(flavor = "current_thread")]
|
||||
async fn yellowstone_slow_receiver_overflow_is_terminal_and_observable() {
|
||||
async fn yellowstone_slow_receiver_applies_bounded_backpressure_without_terminal_overflow() {
|
||||
let server = FixtureServer::start(FixtureMode::Flood).await;
|
||||
let defaults = crate::YellowstoneGrpcSessionSettings::default();
|
||||
let settings = fixture_settings(server.endpoint_url.as_str(), 8, 2, defaults.max_inbound_message_size_bytes(), defaults.max_outbound_message_size_bytes());
|
||||
let channel = crate::YellowstoneGrpcChannel::connect(&settings).await.expect("fixture channel must connect");
|
||||
let mut session = channel.open_standard_subscribe(initial_request()).await.expect("fixture Subscribe stream must open");
|
||||
tokio::time::sleep(std::time::Duration::from_millis(20)).await;
|
||||
assert!(session.next_update().await.expect("first queued update must remain readable").is_some());
|
||||
assert!(session.next_update().await.expect("second queued update must remain readable").is_some());
|
||||
let error = session.next_update().await.expect_err("overflow must become terminal after bounded queued updates drain");
|
||||
assert_eq!(error.code(), crate::ERROR_CODE_GRPC_BACKPRESSURE_OVERFLOW);
|
||||
let rendered = format!("{error:?} {session:?}");
|
||||
assert!(!rendered.contains("GRPC-STREAM-SECRET-CANARY"));
|
||||
assert!(!rendered.contains(server.endpoint_url.as_str()));
|
||||
let _ = session.close().await;
|
||||
assert_eq!(session.snapshot().state(), crate::YellowstoneGrpcSubscribeState::Active);
|
||||
assert_eq!(session.snapshot().terminal_error_code(), std::option::Option::None);
|
||||
for expected_slot in 1_000_u64..1_003_u64 {
|
||||
let update = tokio::time::timeout(std::time::Duration::from_secs(1), session.next_update())
|
||||
.await
|
||||
.expect("bounded backpressure must resume after consumer capacity returns")
|
||||
.expect("slow consumer must not receive a local overflow error")
|
||||
.expect("flood fixture must continue delivering queued updates");
|
||||
match update {
|
||||
crate::YellowstoneSubscribeUpdate::Slot(value) => assert_eq!(value.slot(), expected_slot),
|
||||
_ => panic!("flood fixture must deliver slot updates"),
|
||||
}
|
||||
}
|
||||
tokio::time::sleep(std::time::Duration::from_millis(20)).await;
|
||||
assert_eq!(session.snapshot().terminal_error_code(), std::option::Option::None);
|
||||
tokio::time::timeout(std::time::Duration::from_secs(1), session.close())
|
||||
.await
|
||||
.expect("shutdown must preempt a blocked bounded update delivery")
|
||||
.expect("backpressured session must close cleanly");
|
||||
server.stop().await;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user