Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
7c0c39e
perf(repair): reduce gossip churn
Apr 9, 2026
843e5eb
perf(gossip): skip equivalent pubkey refresh
Apr 9, 2026
e4173d1
perf(fec): reduce shard allocation churn
Apr 9, 2026
9ee2199
chore(runtime): clean merged test imports
Apr 9, 2026
dd1b083
chore(runtime): fix test clippy hygiene
Apr 9, 2026
9acb16e
perf(ingest): reduce batch materialization churn
Apr 9, 2026
cb2c226
perf(tx): cut submit dedupe churn
Apr 9, 2026
2560019
perf(tx): reduce all-at-once submit setup churn
Apr 9, 2026
f8f7f70
fix(tx): harden shared outcome reporter registry
Apr 9, 2026
e76478e
perf(runtime): skip unused provider tx kind classification
Apr 10, 2026
805f358
perf(shred): trim header parse overhead
Apr 10, 2026
eabdeca
perf(runtime): delay provider prefilter kind classification
Apr 10, 2026
37ef138
fix(ingest): validate recvmmsg source address length
Apr 10, 2026
6cb0635
fix(runtime): harden provider transaction payload bounds
Apr 10, 2026
64ce707
perf(runtime): reduce retention and suppression churn
Apr 10, 2026
ce4ac85
fix(tx): revert suppression cache queue churn
Apr 10, 2026
1f898cf
fix(extension): accept tcp resources concurrently
Apr 10, 2026
c71d684
fix(provider): bound websocket account payload size
Apr 10, 2026
732439d
chore(deps): refresh observer lockfile edge
Apr 10, 2026
77941c2
fix(provider): bound grpc account payload size
Apr 10, 2026
ae6399e
perf(tx): trim suppression cache eviction churn
Apr 10, 2026
944686d
perf(repair): trim outstanding request expiry churn
Apr 10, 2026
f5f27b6
fix(runtime): harden cache eviction freshness
Apr 10, 2026
26c8aaa
build(tx): update optional jito grpc tonic stack
Apr 10, 2026
8d7e159
perf(tx): reduce signature deduper lookup churn
Apr 10, 2026
a7a1abd
perf(runtime): trim dedupe refresh churn
Apr 10, 2026
f329717
perf(relay): trim shared cache replacement churn
Apr 10, 2026
4bbd199
perf(repair): index highest outstanding requests
Apr 10, 2026
a7d81d0
refactor(tests): use AsyncWriteExt imports in extension host
Apr 10, 2026
68a356a
perf(cache): trim relay and verifier allocation churn
Apr 10, 2026
0d155b6
perf(tx): preallocate signature deduper state
Apr 10, 2026
80c44c6
perf(verify): preallocate shred verifier slot state
Apr 10, 2026
1f3327b
fix(relay): dedupe range queries by shred index
Apr 10, 2026
92a931a
perf(runtime): trim replay dedupe eviction churn
Apr 10, 2026
aa98e85
perf(repair): trim source hint and peer refresh churn
Apr 10, 2026
a5a8d29
perf(repair): simplify source pubkey expansion
Apr 10, 2026
6c07bf5
perf(provider): harden slot feeds and trim udp ingress setup
Apr 10, 2026
d2e7bf1
perf(provider): cut laserstream signature churn
Apr 10, 2026
cdd2819
perf(ingest): cache udp flush config lookup
Apr 10, 2026
fac254a
perf(provider): trim grpc conversion byte parsing
Apr 10, 2026
0fa37bb
refactor(core): share support helpers and harden websocket caps
Apr 10, 2026
2ae08e9
perf(extension): cut callback isolation churn
Apr 10, 2026
7bb59f6
perf(provider): accelerate grpc transaction conversion
Apr 10, 2026
3b3f69c
perf(extension): trim udp emitter cloning
Apr 10, 2026
b4ad8a9
perf(runtime): trim serialized tx fallback churn
Apr 10, 2026
a5bd9c7
perf(runtime): reduce replay dedupe branch churn
Apr 10, 2026
129a539
refactor(support): centralize shared parsing helpers
Apr 10, 2026
3ab938c
perf(provider): trust grpc transaction signatures
Apr 10, 2026
e9eb216
perf(websocket): reuse replay http client
Apr 10, 2026
9077ee0
fix(extension): bound websocket connector frames
Apr 10, 2026
9425a01
fix(extension): normalize websocket close handling
Apr 10, 2026
5e000f1
refactor(observer): normalize import hygiene
Apr 10, 2026
c1db386
refactor(imports): normalize use semantics
Apr 10, 2026
bd9a0f7
refactor(support): centralize unix time helpers
Apr 10, 2026
194129b
fix(websocket): harden replay http status handling
Apr 10, 2026
4944f95
test(websocket): isolate grpc-only imports
Apr 10, 2026
0efaa63
refactor(provider): share slot status pruning helper
Apr 10, 2026
950aaa8
refactor(time): share unix timestamp helpers
Apr 10, 2026
491453e
chore(tests): normalize temp ids and bench output
Apr 10, 2026
7adb055
perf(relay): preallocate range query index map
Apr 10, 2026
6b5cd5e
perf(repair): snapshot missing tracker slot priorities
Apr 10, 2026
c0e86d3
perf(runtime): keep replay dedupe keys in sof bytes
Apr 10, 2026
90c8bb6
perf(ingest): trim udp batch packet push overhead
Apr 10, 2026
a43b954
fix(websocket): normalize clean provider close frames
Apr 10, 2026
11cde13
perf(provider): hoist tx kind program ids
Apr 10, 2026
4917061
fix(provider): bound websocket replay http bodies
Apr 10, 2026
7a78103
fix(ingest): validate UDP busy-poll sockopt ranges
Apr 10, 2026
e51fc26
perf(websocket): hoist commitment conversion hot paths
Apr 10, 2026
3b7d73c
refactor(provider): share laserstream transport defaults
Apr 10, 2026
ed84716
perf(provider): reuse source refs across stream updates
Apr 10, 2026
ff7dbdf
fix(provider): share yellowstone bootstrap path
Apr 10, 2026
c27227c
fix(websocket): acknowledge pings before subscription ack
Apr 10, 2026
f44a014
build(provider): patch helius laserstream dependency
Apr 10, 2026
fa7d8e7
perf(websocket): trim provider source clone churn
Apr 10, 2026
fc459b3
perf(provider): avoid immediate session keepalive ping
Apr 10, 2026
fca433a
fix(runtime): harden provider and udp tuning helpers
Apr 10, 2026
413b107
fix(websocket): reject replay http redirects
Apr 10, 2026
731e207
refactor(websocket): share subscription ack wait loop
Apr 10, 2026
2780f11
refactor(laserstream): share client config helpers
Apr 10, 2026
3ba2696
fix(extension): retry interrupted ingress reads
Apr 10, 2026
6fecec6
fix(ingest): retry interrupted UDP syscalls
Apr 10, 2026
bcfa32a
refactor(ingest): clean UDP receiver imports
Apr 10, 2026
1dd1158
fix(websocket): bound replay HTTP request stalls
Apr 10, 2026
a029027
perf(provider): preallocate grpc slot status maps
Apr 10, 2026
f8c5028
perf(provider): hoist transaction classifier program ids
Apr 10, 2026
bc9da8c
perf(runtime): fast-path serialized provider accepts
Apr 10, 2026
ddf4ad0
perf(runtime): delay serialized signature extraction
Apr 10, 2026
b6d2d8b
perf(provider): reuse grpc outer transaction signatures
Apr 10, 2026
0f224ad
refactor(support): share saturating duration millis helper
Apr 10, 2026
3647e45
perf(provider): trim grpc conversion and prefilter churn
Apr 10, 2026
e36db97
perf(provider): trim grpc signature conversion branches
Apr 10, 2026
2219404
perf(ingest): trim udp packet push branching
Apr 10, 2026
24c9619
fix(extension): harden runtime resource validation
Apr 10, 2026
56d40ec
chore(release): bump workspace to 0.18.2
Apr 10, 2026
f4c9f4c
chore(release): bump sof-support to 0.18.2
Apr 10, 2026
84555f6
fix(tx): harden rpc blockhash responses
Apr 10, 2026
fb7efd3
fix(tx): bound submit http responses
Apr 10, 2026
9e0fefc
fix(provider): prevent reconnect spin loops
Apr 10, 2026
f5d73f6
chore(tx): normalize http hardening formatting
Apr 10, 2026
11f11b0
fix(provider): clamp zero keepalive intervals
Apr 10, 2026
b58a9b8
fix(extension): bound connector startup hangs
Apr 10, 2026
5fc5778
fix(derived-state): bound checkpoint load size
Apr 10, 2026
7aa10e4
fix(derived-state): reject oversized replay records
Apr 10, 2026
2f538dd
fix(observability): bound slow request reads
Apr 10, 2026
ca50ab9
fix(websocket): bound connect handshake hangs
Apr 10, 2026
7f72471
fix(observability): bound slow response writes
Apr 10, 2026
477b2b0
fix(tx): clamp zero transport timeouts
Apr 10, 2026
4339e3e
fix(provider): clamp zero grpc timeouts
Apr 10, 2026
18effd8
fix(extension): reject zero read buffers
Apr 10, 2026
96ede58
fix(provider): clamp zero stall timeouts
Apr 10, 2026
9bebf56
fix(websocket): bound subscription ack waits
Apr 10, 2026
1bdb21f
fix(tx): clamp zero direct submit timeouts
Apr 10, 2026
42dbe74
fix(extension): clamp zero host timeouts
Apr 10, 2026
ad4cdaa
fix(derived-state): reject oversized checkpoint writes
Apr 10, 2026
8626455
fix(derived-state): reject oversized replay writes
Apr 10, 2026
c19d7da
style(cleanup): normalize local imports in hardened paths
Apr 10, 2026
d1c140d
fix(extension): reject invalid websocket resource urls
Apr 10, 2026
66d94af
fix(extension): reject invalid shared subscriptions
Apr 10, 2026
27361db
fix(extension): reject dead observer-ingress subscriptions
Apr 10, 2026
c5c5912
fix(extension): reject impossible observer ingress selectors
Apr 10, 2026
1aa01b7
fix(tx): scope adapter cleanup imports to tests
Apr 10, 2026
0e13932
fix(ci): restore archive and fuzz smoke checks
Apr 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
445 changes: 62 additions & 383 deletions Cargo.lock

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@ members = [
"crates/sof-gossip-tuning",
"crates/sof-observer",
"crates/sof-solana-compat",
"crates/sof-support",
"crates/sof-tx",
"crates/sof-types",
]
exclude = ["crates/sof-solana-gossip"]

[patch.crates-io]
sof-solana-gossip = { path = "crates/sof-solana-gossip" }
helius-laserstream = { path = "vendor/helius-laserstream" }

[workspace.package]
edition = "2024"
Expand Down
2 changes: 1 addition & 1 deletion crates/sof-gossip-tuning/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "sof-gossip-tuning"
version = "0.18.1"
version = "0.18.2"
edition.workspace = true
description = "Typed gossip and ingest tuning presets for SOF hosts"
license = "Apache-2.0 OR MIT"
Expand Down
9 changes: 6 additions & 3 deletions crates/sof-observer/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "sof"
version = "0.18.1"
version = "0.18.2"
edition.workspace = true
description = "Solana Observer Framework for low-latency shred ingestion and plugin-driven transaction observation"
license = "Apache-2.0 OR MIT"
Expand Down Expand Up @@ -32,8 +32,9 @@ provider-websocket = []

[dependencies]
agave-transaction-view = { version = "3.1.11", features = ["agave-unstable-api"] }
sof-gossip-tuning = { version = "0.18.1", path = "../sof-gossip-tuning" }
sof-types = { version = "0.18.1", path = "../sof-types", features = ["solana-compat"] }
sof-gossip-tuning = { version = "0.18.2", path = "../sof-gossip-tuning" }
sof-support = { version = "0.18.2", path = "../sof-support" }
sof-types = { version = "0.18.2", path = "../sof-types", features = ["solana-compat"] }
solana-gossip = { package = "sof-solana-gossip", version = "3.1.11-sof.9", optional = true, features = ["agave-unstable-api"] }
solana-entry = { version = "3.1.11", features = ["agave-unstable-api"] }
solana-epoch-schedule = "3.0.0"
Expand All @@ -50,6 +51,7 @@ solana-signer = "3.0.0"
solana-streamer = "3.1.11"
solana-transaction = { version = "3.0.2", features = ["serde"] }
solana-packet = "3.0.0"
solana-system-interface = "3.1.0"
solana-vote = "3.1.11"
solana-vote-program = { version = "3.1.11", features = ["agave-unstable-api"] }
reed-solomon-erasure = { version = "6.0.0", features = ["simd-accel"] }
Expand Down Expand Up @@ -81,6 +83,7 @@ futures-channel = "0.3.32"
tokio-tungstenite = { version = "0.28", default-features = false, features = ["connect", "handshake", "rustls-tls-webpki-roots"] }
signal-hook = "0.3"
smallvec = "1.15"
ahash = "0.8.12"
xdp = { version = "0.7.3", optional = true }
yellowstone-grpc-client = { version = "12.2.0", optional = true }
yellowstone-grpc-proto = { version = "12.1.0", optional = true }
Expand Down
5 changes: 3 additions & 2 deletions crates/sof-observer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@ cargo add sof
Optional gossip bootstrap support at compile time:

```toml
sof = { version = "0.18.1", features = ["gossip-bootstrap"] }
sof = { version = "0.18.2", features = ["gossip-bootstrap"] }
```

`gossip-bootstrap` uses the vendored `sof-solana-gossip` backend, but it no longer exact-pins the
Expand All @@ -590,7 +590,7 @@ Solana `3.1.11` patch line. Downstream crates can resolve newer compatible `3.1.
Optional external `kernel-bypass` ingress support:

```toml
sof = { version = "0.18.1", features = ["kernel-bypass"] }
sof = { version = "0.18.2", features = ["kernel-bypass"] }
```

The bundled `sof-solana-gossip` backend defaults to SOF's lightweight in-memory duplicate/conflict
Expand Down Expand Up @@ -1088,6 +1088,7 @@ Design references:
- Queue pressure drops hook events instead of stalling ingest.
- Typed host tuning is available through `sof-gossip-tuning` and `RuntimeSetup::with_gossip_tuning_profile(...)`.
- `RuntimeExtension` WebSocket connectors support full `ws://` / `wss://` handshake + frame decoding.
- Runtime extensions require non-empty names and resource metadata; startup rejects empty `resource_id` / shared tags and bounds `read_buffer_bytes`.
- WebSocket close frames emit `RuntimePacketEventClass::ConnectionClosed` in `on_packet_received`.
- WebSocket packet events expose `websocket_frame_type` (`Text`/`Binary`/`Ping`/`Pong`) for startup-time filtering and runtime routing.
- In gossip mode, SOF runs as an active bounded relay client by default (UDP relay + repair serve), not as an observer-only passive consumer.
Expand Down
3 changes: 3 additions & 0 deletions crates/sof-observer/fuzz/fuzz_targets/shred_fec_recover.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#![no_main]

use std::sync::Arc;

use libfuzzer_sys::fuzz_target;
use sof::{
protocol::shred_wire::{
Expand Down Expand Up @@ -230,6 +232,7 @@ fuzz_target!(|bytes: &[u8]| {
}),
ParsedShred::Code(code) => ParsedShredHeader::Code(code),
};
let packet = Arc::<[u8]>::from(packet);
let recovered = recoverer.ingest_packet(&packet, &parsed_header);
assert!(recoverer.tracked_sets() <= max_tracked_sets);

Expand Down
10 changes: 1 addition & 9 deletions crates/sof-observer/src/app/config/common.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use std::time::{Duration, SystemTime, UNIX_EPOCH};
use std::time::Duration;

pub(crate) use crate::runtime_env::read_env_var;

Expand All @@ -16,11 +16,3 @@ pub fn duration_to_ms_u64(duration: Duration) -> u64 {
millis as u64
}
}

pub fn current_unix_ms() -> u64 {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_or(0, |duration| {
duration.as_millis().min(u128::from(u64::MAX)) as u64
})
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#[cfg(feature = "gossip-bootstrap")]
use super::*;
#[cfg(feature = "gossip-bootstrap")]
use sof_support::time_support::current_unix_ms;
#[cfg(feature = "gossip-bootstrap")]
use thiserror::Error;

#[cfg(feature = "gossip-bootstrap")]
Expand Down
93 changes: 93 additions & 0 deletions crates/sof-observer/src/app/runtime/bootstrap/repair.rs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,15 @@ pub(crate) struct RepairSourceHintBuffer {
#[cfg(feature = "gossip-bootstrap")]
impl RepairSourceHintBuffer {
pub(crate) fn new(capacity: usize) -> Self {
let capacity = capacity.max(1);
Self {
counts: HashMap::with_capacity(capacity),
capacity,
}
}

#[cfg(test)]
pub(crate) fn new_baseline(capacity: usize) -> Self {
Self {
counts: HashMap::new(),
capacity: capacity.max(1),
Expand Down Expand Up @@ -335,6 +344,90 @@ pub(crate) fn spawn_repair_driver(
Ok((command_tx, result_rx, peer_snapshot, driver_handle))
}

#[cfg(all(test, feature = "gossip-bootstrap"))]
mod tests {
use std::{
env,
net::{IpAddr, Ipv4Addr, SocketAddr},
time::Instant,
};

use super::RepairSourceHintBuffer;

#[test]
#[ignore = "profiling fixture for repair source hint buffer allocation"]
fn repair_source_hint_buffer_profile_fixture() {
let iterations = env::var("SOF_REPAIR_SOURCE_HINT_PROFILE_ITERS")
.ok()
.and_then(|raw| raw.parse::<usize>().ok())
.filter(|value| *value > 0)
.unwrap_or(20_000);
let capacity = env::var("SOF_REPAIR_SOURCE_HINT_PROFILE_CAPACITY")
.ok()
.and_then(|raw| raw.parse::<usize>().ok())
.filter(|value| *value > 0)
.unwrap_or(256);
let batch_size = env::var("SOF_REPAIR_SOURCE_HINT_PROFILE_BATCH")
.ok()
.and_then(|raw| raw.parse::<usize>().ok())
.filter(|value| *value > 0)
.unwrap_or(capacity / 2);
let addresses = (0..capacity)
.map(|index| {
SocketAddr::new(
IpAddr::V4(Ipv4Addr::new(
127,
0,
u8::try_from((index / 255) % 255).unwrap_or(0),
u8::try_from((index % 255) + 1).unwrap_or(u8::MAX),
)),
u16::try_from((10_000 + index) % usize::from(u16::MAX)).unwrap_or(u16::MAX),
)
})
.collect::<Vec<_>>();
assert!(!addresses.is_empty());

let baseline_started_at = Instant::now();
for _ in 0..iterations {
let mut buffer = RepairSourceHintBuffer::new_baseline(capacity);
for addr in addresses.iter().copied() {
assert!(buffer.record(addr).is_ok());
}
let drained = buffer.drain_batch(batch_size);
assert!(!drained.is_empty());
}
let baseline_elapsed = baseline_started_at.elapsed();

let optimized_started_at = Instant::now();
for _ in 0..iterations {
let mut buffer = RepairSourceHintBuffer::new(capacity);
for addr in addresses.iter().copied() {
assert!(buffer.record(addr).is_ok());
}
let drained = buffer.drain_batch(batch_size);
assert!(!drained.is_empty());
}
let optimized_elapsed = optimized_started_at.elapsed();

let baseline_avg_ns =
baseline_elapsed.as_nanos() / u128::try_from(iterations).unwrap_or(u128::MAX);
let optimized_avg_ns =
optimized_elapsed.as_nanos() / u128::try_from(iterations).unwrap_or(u128::MAX);
let baseline_avg_us = baseline_avg_ns as f64 / 1_000.0;
let optimized_avg_us = optimized_avg_ns as f64 / 1_000.0;
println!(
"repair_source_hint_buffer_profile_fixture iterations={} baseline_us={} optimized_us={} baseline_avg_ns_per_iteration={} optimized_avg_ns_per_iteration={} baseline_avg_us_per_iteration={:.6} optimized_avg_us_per_iteration={:.6}",
iterations,
baseline_elapsed.as_micros(),
optimized_elapsed.as_micros(),
baseline_avg_ns,
optimized_avg_ns,
baseline_avg_us,
optimized_avg_us
);
}
}

#[cfg(feature = "gossip-bootstrap")]
pub(crate) fn replace_repair_driver(
repair_client: crate::repair::GossipRepairClient,
Expand Down
61 changes: 11 additions & 50 deletions crates/sof-observer/src/app/runtime/dataset/process.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ use crate::{
};
use agave_transaction_view::transaction_view::SanitizedTransactionView;
use core::mem::size_of;
use sof_support::short_vec::{
ShortVecDecodeError as PartialParseError, decode_short_u16_len, decode_short_u16_len_partial,
};
use solana_hash::Hash;
use solana_packet::PACKET_DATA_SIZE;
use solana_pubkey::Pubkey;
Expand Down Expand Up @@ -1833,50 +1836,6 @@ fn read_u64_le_partial(payload: &[u8], offset: &mut usize) -> Result<u64, Partia
Ok(u64::from_le_bytes(raw))
}

fn decode_short_u16_len(payload: &[u8], offset: &mut usize) -> Option<usize> {
let mut value = 0_usize;
let mut shift = 0_u32;
for byte_index in 0..3 {
let byte = usize::from(*payload.get(*offset)?);
*offset = (*offset).saturating_add(1);
value |= (byte & 0x7f) << shift;
if byte & 0x80 == 0 {
return Some(value);
}
shift = shift.saturating_add(7);
if byte_index == 2 {
return None;
}
}
None
}

fn decode_short_u16_len_partial(
payload: &[u8],
offset: &mut usize,
) -> Result<usize, PartialParseError> {
let mut value = 0_usize;
let mut shift = 0_u32;
for byte_index in 0..3 {
let byte = usize::from(*payload.get(*offset).ok_or(PartialParseError::Incomplete)?);
*offset = (*offset).saturating_add(1);
value |= (byte & 0x7f) << shift;
if byte & 0x80 == 0 {
return Ok(value);
}
shift = shift.saturating_add(7);
if byte_index == 2 {
return Err(PartialParseError::Invalid);
}
}
Err(PartialParseError::Invalid)
}

enum PartialParseError {
Incomplete,
Invalid,
}

fn join_payload_fragments_into(
buffer: &mut Vec<u8>,
fragments: &[SharedPayloadFragment],
Expand Down Expand Up @@ -1955,11 +1914,13 @@ mod tests {
use solana_signer::Signer as _;
use solana_transaction::Transaction;
use std::{
env,
net::{Ipv4Addr, SocketAddr, SocketAddrV4},
sync::{
Arc,
atomic::{AtomicUsize, Ordering},
},
thread,
time::{Duration, Instant},
};
use wincode::{
Expand Down Expand Up @@ -2366,7 +2327,7 @@ mod tests {
#[test]
#[ignore = "profiling fixture for perf"]
fn multi_hook_profile_fixture() {
let iterations = std::env::var("SOF_MULTI_HOOK_PROFILE_ITERS")
let iterations = env::var("SOF_MULTI_HOOK_PROFILE_ITERS")
.ok()
.and_then(|raw| raw.parse::<usize>().ok())
.filter(|value| *value > 0)
Expand Down Expand Up @@ -2442,7 +2403,7 @@ mod tests {
);
assert!(matches!(outcome, DatasetProcessOutcome::Decoded));
}
std::thread::sleep(Duration::from_millis(250));
thread::sleep(Duration::from_millis(250));
assert_eq!(dataset_decode_fail_count.load(Ordering::Relaxed), 0);
assert_eq!(tx_event_drop_count.load(Ordering::Relaxed), 0);
assert_eq!(plugin_host.dropped_event_count(), 0);
Expand Down Expand Up @@ -2474,12 +2435,12 @@ mod tests {
#[test]
#[ignore = "profiling fixture for completed-dataset prefilter decode skip A/B"]
fn completed_dataset_prefilter_profile_fixture() {
let iterations = std::env::var("SOF_COMPLETED_DATASET_PREFILTER_PROFILE_ITERS")
let iterations = env::var("SOF_COMPLETED_DATASET_PREFILTER_PROFILE_ITERS")
.ok()
.and_then(|raw| raw.parse::<usize>().ok())
.filter(|value| *value > 0)
.unwrap_or(20_000);
let mode = std::env::var("SOF_COMPLETED_DATASET_PREFILTER_PROFILE_MODE")
let mode = env::var("SOF_COMPLETED_DATASET_PREFILTER_PROFILE_MODE")
.unwrap_or_else(|_| "manual".to_owned());
let ignored_account = Pubkey::new_unique();
let payload = build_profile_payload(PROFILE_ENTRY_COUNT);
Expand Down Expand Up @@ -2529,7 +2490,7 @@ mod tests {
);
assert!(matches!(outcome, DatasetProcessOutcome::Decoded));
}
std::thread::sleep(Duration::from_millis(100));
thread::sleep(Duration::from_millis(100));
assert_eq!(dataset_decode_fail_count.load(Ordering::Relaxed), 0);
assert_eq!(tx_event_drop_count.load(Ordering::Relaxed), 0);
assert_eq!(plugin_host.dropped_event_count(), 0);
Expand Down Expand Up @@ -2697,7 +2658,7 @@ mod tests {
);

assert!(matches!(outcome, DatasetProcessOutcome::Decoded));
std::thread::sleep(Duration::from_millis(50));
thread::sleep(Duration::from_millis(50));
assert_eq!(handled.load(Ordering::Relaxed), 1);
assert_eq!(dataset_decode_fail_count.load(Ordering::Relaxed), 0);
assert_eq!(tx_event_drop_count.load(Ordering::Relaxed), 0);
Expand Down
Loading
Loading