update ledger tool to restore cost table from blockstore (#18489)
* update ledger tool to restore cost model from blockstore when compute-slot-cost * Move initialize_cost_table into cost_model, so the function can be tested and shared between validator and ledger-tool * refactor and simplify a test
This commit is contained in:
parent
d4ec0a6da5
commit
b6dff12923
|
@ -90,6 +90,29 @@ impl CostModel {
|
||||||
self.block_cost_limit
|
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 {
|
pub fn calculate_cost(&mut self, transaction: &Transaction) -> &TransactionCost {
|
||||||
self.transaction_cost.reset();
|
self.transaction_cost.reset();
|
||||||
|
|
||||||
|
@ -449,4 +472,23 @@ mod tests {
|
||||||
th.join().unwrap();
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ use crate::{
|
||||||
cluster_info_vote_listener::VoteTracker,
|
cluster_info_vote_listener::VoteTracker,
|
||||||
completed_data_sets_service::CompletedDataSetsService,
|
completed_data_sets_service::CompletedDataSetsService,
|
||||||
consensus::{reconcile_blockstore_roots_with_tower, Tower},
|
consensus::{reconcile_blockstore_roots_with_tower, Tower},
|
||||||
cost_model::{CostModel, ACCOUNT_MAX_COST, BLOCK_MAX_COST},
|
cost_model::CostModel,
|
||||||
rewards_recorder_service::{RewardsRecorderSender, RewardsRecorderService},
|
rewards_recorder_service::{RewardsRecorderSender, RewardsRecorderService},
|
||||||
sample_performance_service::SamplePerformanceService,
|
sample_performance_service::SamplePerformanceService,
|
||||||
serve_repair::ServeRepair,
|
serve_repair::ServeRepair,
|
||||||
|
@ -659,11 +659,9 @@ impl Validator {
|
||||||
bank_forks.read().unwrap().root_bank().deref(),
|
bank_forks.read().unwrap().root_bank().deref(),
|
||||||
));
|
));
|
||||||
|
|
||||||
let cost_model = Arc::new(RwLock::new(CostModel::new(
|
let mut cost_model = CostModel::default();
|
||||||
ACCOUNT_MAX_COST,
|
cost_model.initialize_cost_table(&blockstore.read_program_costs().unwrap());
|
||||||
BLOCK_MAX_COST,
|
let cost_model = Arc::new(RwLock::new(cost_model));
|
||||||
)));
|
|
||||||
Self::initiate_cost_model(&cost_model, &blockstore.read_program_costs().unwrap());
|
|
||||||
|
|
||||||
let (retransmit_slots_sender, retransmit_slots_receiver) = unbounded();
|
let (retransmit_slots_sender, retransmit_slots_receiver) = unbounded();
|
||||||
let (verified_vote_sender, verified_vote_receiver) = unbounded();
|
let (verified_vote_sender, verified_vote_receiver) = unbounded();
|
||||||
|
@ -897,31 +895,6 @@ impl Validator {
|
||||||
ip_echo_server.shutdown_background();
|
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 {
|
fn active_vote_account_exists_in_bank(bank: &Arc<Bank>, vote_account: &Pubkey) -> bool {
|
||||||
|
|
|
@ -14,7 +14,7 @@ use solana_clap_utils::{
|
||||||
is_parsable, is_pubkey, is_pubkey_or_keypair, is_slot, is_valid_percentage,
|
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_core::cost_tracker::CostTracker;
|
||||||
use solana_ledger::entry::Entry;
|
use solana_ledger::entry::Entry;
|
||||||
use solana_ledger::{
|
use solana_ledger::{
|
||||||
|
@ -737,10 +737,9 @@ fn compute_slot_cost(blockstore: &Blockstore, slot: Slot) -> Result<(), String>
|
||||||
let mut transactions = 0;
|
let mut transactions = 0;
|
||||||
let mut programs = 0;
|
let mut programs = 0;
|
||||||
let mut program_ids = HashMap::new();
|
let mut program_ids = HashMap::new();
|
||||||
let cost_model = Arc::new(RwLock::new(CostModel::new(
|
let mut cost_model = CostModel::default();
|
||||||
ACCOUNT_MAX_COST,
|
cost_model.initialize_cost_table(&blockstore.read_program_costs().unwrap());
|
||||||
BLOCK_MAX_COST,
|
let cost_model = Arc::new(RwLock::new(cost_model));
|
||||||
)));
|
|
||||||
let mut cost_tracker = CostTracker::new(cost_model.clone());
|
let mut cost_tracker = CostTracker::new(cost_model.clone());
|
||||||
|
|
||||||
for entry in &entries {
|
for entry in &entries {
|
||||||
|
|
Loading…
Reference in New Issue