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

update ledger tool to restore cost table from blockstore #18489

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 42 additions & 0 deletions core/src/cost_model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,29 @@ impl CostModel {
self.block_cost_limit
}

pub fn initialize_cost_table(&mut self, cost_table: &[(Pubkey, u64)]) {
for (program_id, cost) in cost_table {
match self.upsert_instruction_cost(program_id, cost) {
Ok(c) => {
debug!(
"initiating cost table, instruction {:?} has cost {}",
program_id, c
);
}
Err(err) => {
debug!(
"initiating cost table, failed for instruction {:?}, err: {}",
program_id, err
);
}
}
}
debug!(
"restored cost model instruction cost table from blockstore, current values: {:?}",
self.get_instruction_cost_table()
);
}

pub fn calculate_cost(&mut self, transaction: &Transaction) -> &TransactionCost {
self.transaction_cost.reset();

Expand Down Expand Up @@ -450,4 +473,23 @@ mod tests {
th.join().unwrap();
}
}

#[test]
fn test_cost_model_init_cost_table() {
// build cost table
let cost_table = vec![
(Pubkey::new_unique(), 10),
(Pubkey::new_unique(), 20),
(Pubkey::new_unique(), 30),
];

// init cost model
let mut cost_model = CostModel::default();
cost_model.initialize_cost_table(&cost_table);

// verify
for (id, cost) in cost_table.iter() {
assert_eq!(*cost, cost_model.find_instruction_cost(id));
}
}
}
35 changes: 4 additions & 31 deletions core/src/validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use crate::{
cluster_info_vote_listener::VoteTracker,
completed_data_sets_service::CompletedDataSetsService,
consensus::{reconcile_blockstore_roots_with_tower, Tower},
cost_model::{CostModel, ACCOUNT_MAX_COST, BLOCK_MAX_COST},
cost_model::CostModel,
rewards_recorder_service::{RewardsRecorderSender, RewardsRecorderService},
sample_performance_service::SamplePerformanceService,
serve_repair::ServeRepair,
Expand Down Expand Up @@ -659,11 +659,9 @@ impl Validator {
bank_forks.read().unwrap().root_bank().deref(),
));

let cost_model = Arc::new(RwLock::new(CostModel::new(
ACCOUNT_MAX_COST,
BLOCK_MAX_COST,
)));
Self::initiate_cost_model(&cost_model, &blockstore.read_program_costs().unwrap());
let mut cost_model = CostModel::default();
cost_model.initialize_cost_table(&blockstore.read_program_costs().unwrap());
let cost_model = Arc::new(RwLock::new(cost_model));

let (retransmit_slots_sender, retransmit_slots_receiver) = unbounded();
let (verified_vote_sender, verified_vote_receiver) = unbounded();
Expand Down Expand Up @@ -897,31 +895,6 @@ impl Validator {
ip_echo_server.shutdown_background();
}
}

fn initiate_cost_model(cost_model: &RwLock<CostModel>, cost_table: &[(Pubkey, u64)]) {
let mut cost_model_mutable = cost_model.write().unwrap();
for (program_id, cost) in cost_table {
match cost_model_mutable.upsert_instruction_cost(program_id, cost) {
Ok(c) => {
debug!(
"initiating cost table, instruction {:?} has cost {}",
program_id, c
);
}
Err(err) => {
debug!(
"initiating cost table, failed for instruction {:?}, err: {}",
program_id, err
);
}
}
}
drop(cost_model_mutable);
debug!(
"restored cost model instruction cost table from blockstore, current values: {:?}",
cost_model.read().unwrap().get_instruction_cost_table()
);
}
}

fn active_vote_account_exists_in_bank(bank: &Arc<Bank>, vote_account: &Pubkey) -> bool {
Expand Down
9 changes: 4 additions & 5 deletions ledger-tool/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use solana_clap_utils::{
is_parsable, is_pubkey, is_pubkey_or_keypair, is_slot, is_valid_percentage,
},
};
use solana_core::cost_model::{CostModel, ACCOUNT_MAX_COST, BLOCK_MAX_COST};
use solana_core::cost_model::CostModel;
use solana_core::cost_tracker::CostTracker;
use solana_ledger::entry::Entry;
use solana_ledger::{
Expand Down Expand Up @@ -737,10 +737,9 @@ fn compute_slot_cost(blockstore: &Blockstore, slot: Slot) -> Result<(), String>
let mut transactions = 0;
let mut programs = 0;
let mut program_ids = HashMap::new();
let cost_model = Arc::new(RwLock::new(CostModel::new(
ACCOUNT_MAX_COST,
BLOCK_MAX_COST,
)));
let mut cost_model = CostModel::default();
cost_model.initialize_cost_table(&blockstore.read_program_costs().unwrap());
let cost_model = Arc::new(RwLock::new(cost_model));
let mut cost_tracker = CostTracker::new(cost_model.clone());

for entry in &entries {
Expand Down