Skip to content

Commit cff0080

Browse files
committed
feat: add more traces for accumulator
1 parent a378583 commit cff0080

File tree

2 files changed

+82
-3
lines changed

2 files changed

+82
-3
lines changed

runtime/src/bank.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3237,21 +3237,39 @@ impl Bank {
32373237
// If accumulator move to end of block is active update the accumulator before doing
32383238
// other tasks when freezing to avoid any conflicts.
32393239
if accumulator_moved_to_end_of_block {
3240+
let mut measure = Measure::start("accumulator");
32403241
pyth_accumulator::update_accumulator(self);
3242+
measure.stop();
3243+
3244+
debug!(
3245+
"Accumulator: Updated accumulator before freezing. Slot: {}, time: {}us",
3246+
self.slot(),
3247+
measure.as_us(),
3248+
);
32413249
} else {
32423250
info!(
32433251
"Accumulator: Skipping accumulating end of block because the feature is disabled. Slot: {}",
32443252
self.slot()
32453253
);
32463254
}
32473255

3256+
let mut measure = Measure::start("freeze");
3257+
32483258
// finish up any deferred changes to account state
32493259
self.collect_rent_eagerly(false);
32503260
self.collect_fees();
32513261
self.distribute_rent();
32523262
self.update_slot_history();
32533263
self.run_incinerator();
32543264

3265+
measure.stop();
3266+
debug!(
3267+
"Bank frozen (non-accumulator): {} slot {} time: {}us",
3268+
self.collector_id,
3269+
self.slot(),
3270+
measure.as_us()
3271+
);
3272+
32553273
// freeze is a one-way trip, idempotent
32563274
self.freeze_started.store(true, Relaxed);
32573275
*hash = self.hash_internal_state();

runtime/src/bank/pyth_accumulator.rs

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use {
99
hashers::keccak256_160::Keccak160,
1010
wormhole::{AccumulatorSequenceTracker, MessageData, PostedMessageUnreliableData},
1111
},
12+
solana_measure::measure::Measure,
1213
solana_sdk::{
1314
account::{AccountSharedData, ReadableAccount},
1415
borsh, feature_set,
@@ -136,10 +137,20 @@ pub fn update_v1(
136137

137138
let message_buffer_accounts;
138139
let v1_messages = if use_message_buffers {
140+
let mut measure = Measure::start("update_v1_load_program_accounts");
141+
139142
message_buffer_accounts = bank
140143
.get_program_accounts(&MESSAGE_BUFFER_PID, &ScanConfig::new(true))
141144
.map_err(AccumulatorUpdateErrorV1::GetProgramAccounts)?;
142145

146+
measure.stop();
147+
debug!(
148+
"Accumulator: Loaded message buffer accounts in {}us",
149+
measure.as_us()
150+
);
151+
152+
let mut measure = Measure::start("update_v1_extract_message_data");
153+
143154
let preimage = b"account:MessageBuffer";
144155
let mut expected_sighash = [0u8; 8];
145156
expected_sighash.copy_from_slice(&hashv(&[preimage]).to_bytes()[..8]);
@@ -154,7 +165,7 @@ pub fn update_v1(
154165

155166
// This code, using the offsets in each Account, extracts the various data versions from
156167
// the account. We deduplicate this result because the accumulator expects a set.
157-
message_buffer_accounts
168+
let res = message_buffer_accounts
158169
.map(|(_, account)| {
159170
let data = account.data();
160171
let mut cursor = std::io::Cursor::new(&data);
@@ -185,11 +196,21 @@ pub fn update_v1(
185196
.collect::<std::result::Result<Vec<_>, std::io::Error>>()?
186197
.into_iter()
187198
.flatten()
188-
.collect()
199+
.collect();
200+
201+
measure.stop();
202+
debug!(
203+
"Accumulator: Extracted message data in {}us",
204+
measure.as_us()
205+
);
206+
207+
res
189208
} else {
190209
Vec::new()
191210
};
192211

212+
let mut measure = Measure::start("create_message_set");
213+
193214
let mut messages = v1_messages;
194215
messages.extend(v2_messages.iter().map(|x| &**x));
195216
messages.sort_unstable();
@@ -220,11 +241,27 @@ pub fn update_v1(
220241
account
221242
};
222243

244+
measure.stop();
245+
debug!("Accumulator: Created message set in {}us", measure.as_us());
246+
223247
// Generate a Message owned by Wormhole to be sent cross-chain. This short-circuits the
224248
// Wormhole message generation code that would normally be called, but the Guardian
225249
// set filters our messages so this does not pose a security risk.
226-
if let Some(accumulator) = MerkleAccumulator::<Keccak160>::from_set(messages.into_iter()) {
250+
let mut measure = Measure::start("create_accumulator");
251+
252+
let maybe_accumulator = MerkleAccumulator::<Keccak160>::from_set(messages.into_iter());
253+
254+
measure.stop();
255+
debug!("Accumulator: Created accumulator in {}us", measure.as_us());
256+
257+
if let Some(accumulator) = maybe_accumulator {
258+
let mut measure = Measure::start("post_accumulator_attestation");
227259
post_accumulator_attestation(bank, accumulator, ring_index)?;
260+
measure.stop();
261+
debug!(
262+
"Accumulator: Posted accumulator attestation in {}us",
263+
measure.as_us()
264+
);
228265
}
229266

230267
// Write the Account Set into `accumulator_state` so that the hermes application can
@@ -233,7 +270,14 @@ pub fn update_v1(
233270
"Accumulator: Writing accumulator state to {:?}",
234271
accumulator_account
235272
);
273+
274+
let mut measure = Measure::start("store_account_and_update_capitalization");
236275
bank.store_account_and_update_capitalization(&accumulator_account, &accumulator_data);
276+
measure.stop();
277+
debug!(
278+
"Accumulator: Stored accumulator state in {}us",
279+
measure.as_us()
280+
);
237281

238282
Ok(())
239283
}
@@ -333,10 +377,20 @@ fn post_accumulator_attestation(
333377
}
334378

335379
pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV1> {
380+
let mut measure = Measure::start("update_v2_load_program_accounts");
381+
336382
let accounts = bank
337383
.get_program_accounts(&ORACLE_PID, &ScanConfig::new(true))
338384
.map_err(AccumulatorUpdateErrorV1::GetProgramAccounts)?;
339385

386+
measure.stop();
387+
debug!(
388+
"Accumulator: Loaded oracle program accounts in {}us",
389+
measure.as_us()
390+
);
391+
392+
let mut measure = Measure::start("update_v2_aggregate_price");
393+
340394
let mut any_v1_aggregations = false;
341395
let mut v2_messages = Vec::new();
342396

@@ -364,5 +418,12 @@ pub fn update_v2(bank: &Bank) -> std::result::Result<(), AccumulatorUpdateErrorV
364418
}
365419
}
366420

421+
measure.stop();
422+
debug!(
423+
"Accumulator: Aggregated oracle prices in {}us and generated {} messages",
424+
measure.as_us(),
425+
v2_messages.len()
426+
);
427+
367428
update_v1(bank, &v2_messages, any_v1_aggregations)
368429
}

0 commit comments

Comments
 (0)