Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 40bbf99

Browse files
authored
Add fully-reproducible online tracer for banking (#29196)
* Add fully-reproducible online tracer for banking * Don't use eprintln!()... * Update programs/sbf/Cargo.lock... * Remove meaningless assert_eq * Group test-only code under aptly named mod * Remove needless overflow handling in receive_until * Delay stat aggregation as it's possible now * Use Cow to avoid needless heap allocs * Properly consume metrics action as soon as hold * Trace UnprocessedTransactionStorage::len() instead * Loosen joining api over type safety for replaystage * Introce hash event to override these when simulating * Use serde_with/serde_as instead of hacky workaround * Update another Cargo.lock... * Add detailed comment for Packet::buffer serialize * Rename sender_overhead_minimized_receiver_loop() * Use type interference for TraceError * Another minor rename * Retire now useless ForEach to simplify code * Use type alias as much as possible * Properly translate and propagate tracing errors * Clarify --enable-banking-trace with better naming * Consider unclean (signal-based) node restarts.. * Tweak logging and cli * Remove Bank events as it's not needed anymore * Make tpu own banking tracer thread * Reduce diff a bit.. * Use latest serde_with * Finally use the published rolling-file crate * Make test code change more consistent * Revive dead and non-terminating test code path... * Dispose batches early now that possible * Split off thread handle very early at ::new() * Tweak message for TooSmallDirByteLimitl * Remove too much of indirection * Remove needless pub from ::channel() * Clarify test comments * Avoid needless event creation if tracer is disabled * Write tests around file rotation and spill-over * Remove unneeded PathBuf::clone()s... * Introduce inner struct instead of tuple... * Remove unused enum BankStatus... * Avoid .unwrap() for the case of disabled tracer...
1 parent 7d28696 commit 40bbf99

26 files changed

+1276
-148
lines changed

Cargo.lock

Lines changed: 74 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

banking-bench/src/main.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use {
66
rand::{thread_rng, Rng},
77
rayon::prelude::*,
88
solana_client::connection_cache::ConnectionCache,
9-
solana_core::banking_stage::BankingStage,
9+
solana_core::{
10+
banking_stage::BankingStage,
11+
banking_trace::{BankingPacketBatch, BankingTracer, BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT},
12+
},
1013
solana_gossip::cluster_info::{ClusterInfo, Node},
1114
solana_ledger::{
1215
blockstore::Blockstore,
@@ -255,6 +258,12 @@ fn main() {
255258
.takes_value(false)
256259
.help("Skip transaction sanity execution"),
257260
)
261+
.arg(
262+
Arg::new("trace_banking")
263+
.long("trace-banking")
264+
.takes_value(false)
265+
.help("Enable banking tracing"),
266+
)
258267
.arg(
259268
Arg::new("write_lock_contention")
260269
.long("write-lock-contention")
@@ -407,9 +416,17 @@ fn main() {
407416
let leader_schedule_cache = Arc::new(LeaderScheduleCache::new_from_bank(&bank));
408417
let (exit, poh_recorder, poh_service, signal_receiver) =
409418
create_test_recorder(&bank, &blockstore, None, Some(leader_schedule_cache));
410-
let (non_vote_sender, non_vote_receiver) = unbounded();
411-
let (tpu_vote_sender, tpu_vote_receiver) = unbounded();
412-
let (gossip_vote_sender, gossip_vote_receiver) = unbounded();
419+
let (banking_tracer, tracer_thread) =
420+
BankingTracer::new(matches.is_present("trace_banking").then_some((
421+
&blockstore.banking_trace_path(),
422+
exit.clone(),
423+
BANKING_TRACE_DIR_DEFAULT_BYTE_LIMIT,
424+
)))
425+
.unwrap();
426+
let (non_vote_sender, non_vote_receiver) = banking_tracer.create_channel_non_vote();
427+
let (tpu_vote_sender, tpu_vote_receiver) = banking_tracer.create_channel_tpu_vote();
428+
let (gossip_vote_sender, gossip_vote_receiver) =
429+
banking_tracer.create_channel_gossip_vote();
413430
let cluster_info = {
414431
let keypair = Arc::new(Keypair::new());
415432
let node = Node::new_localhost_with_pubkey(&keypair.pubkey());
@@ -462,7 +479,7 @@ fn main() {
462479
timestamp(),
463480
);
464481
non_vote_sender
465-
.send((vec![packet_batch.clone()], None))
482+
.send(BankingPacketBatch::new((vec![packet_batch.clone()], None)))
466483
.unwrap();
467484
}
468485

@@ -583,6 +600,9 @@ fn main() {
583600
poh_service.join().unwrap();
584601
sleep(Duration::from_secs(1));
585602
debug!("waited for poh_service");
603+
if let Some(tracer_thread) = tracer_thread {
604+
tracer_thread.join().unwrap().unwrap();
605+
}
586606
}
587607
let _unused = Blockstore::destroy(&ledger_path);
588608
}

core/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ num_enum = "0.5.7"
3434
rand = "0.7.0"
3535
rand_chacha = "0.2.2"
3636
rayon = "1.5.3"
37+
rolling-file = "0.2.0"
3738
serde = "1.0.144"
3839
serde_derive = "1.0.103"
3940
solana-address-lookup-table-program = { path = "../programs/address-lookup-table", version = "=1.15.0" }

core/benches/banking_stage.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use {
1111
solana_client::connection_cache::ConnectionCache,
1212
solana_core::{
1313
banking_stage::{BankingStage, BankingStageStats},
14+
banking_trace::{BankingPacketBatch, BankingTracer},
1415
leader_slot_banking_stage_metrics::LeaderSlotMetricsTracker,
1516
qos_service::QosService,
1617
unprocessed_packet_batches::*,
@@ -197,9 +198,10 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
197198
// during the benchmark
198199
genesis_config.ticks_per_slot = 10_000;
199200

200-
let (non_vote_sender, non_vote_receiver) = unbounded();
201-
let (tpu_vote_sender, tpu_vote_receiver) = unbounded();
202-
let (gossip_vote_sender, gossip_vote_receiver) = unbounded();
201+
let banking_tracer = BankingTracer::new_disabled();
202+
let (non_vote_sender, non_vote_receiver) = banking_tracer.create_channel_non_vote();
203+
let (tpu_vote_sender, tpu_vote_receiver) = banking_tracer.create_channel_tpu_vote();
204+
let (gossip_vote_sender, gossip_vote_receiver) = banking_tracer.create_channel_gossip_vote();
203205

204206
let mut bank = Bank::new_for_benches(&genesis_config);
205207
// Allow arbitrary transaction processing time for the purposes of this bench
@@ -304,10 +306,16 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
304306
let mut sent = 0;
305307
if let Some(vote_packets) = &vote_packets {
306308
tpu_vote_sender
307-
.send((vote_packets[start..start + chunk_len].to_vec(), None))
309+
.send(BankingPacketBatch::new((
310+
vote_packets[start..start + chunk_len].to_vec(),
311+
None,
312+
)))
308313
.unwrap();
309314
gossip_vote_sender
310-
.send((vote_packets[start..start + chunk_len].to_vec(), None))
315+
.send(BankingPacketBatch::new((
316+
vote_packets[start..start + chunk_len].to_vec(),
317+
None,
318+
)))
311319
.unwrap();
312320
}
313321
for v in verified[start..start + chunk_len].chunks(chunk_len / num_threads) {
@@ -321,7 +329,9 @@ fn bench_banking(bencher: &mut Bencher, tx_type: TransactionType) {
321329
for xv in v {
322330
sent += xv.len();
323331
}
324-
non_vote_sender.send((v.to_vec(), None)).unwrap();
332+
non_vote_sender
333+
.send(BankingPacketBatch::new((v.to_vec(), None)))
334+
.unwrap();
325335
}
326336

327337
check_txs(&signal_receiver2, txes / CHUNKS);

0 commit comments

Comments
 (0)