0.3.15-pre.015

This commit is contained in:
2026-09-18 21:06:58 +02:00
parent b266019ea8
commit 582a286baa
9 changed files with 323 additions and 54 deletions

View File

@@ -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;
}