Fixes a bug in MockInvokeContext::get_compute_meter() and adjusts the test assert_instruction_count accordingly. (#20854)

The get_compute_meter() method created a reference to a clone instead of cloning the reference.
This commit is contained in:
Alexander Meißner 2021-10-22 09:46:47 +02:00 committed by GitHub
parent 0d4dbd5588
commit e7c9b9329d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 33 additions and 33 deletions

View File

@ -25,11 +25,11 @@ use solana_sdk::{
entrypoint::SUCCESS, entrypoint::SUCCESS,
instruction::{AccountMeta, Instruction}, instruction::{AccountMeta, Instruction},
message::Message, message::Message,
process_instruction::{InvokeContext, MockInvokeContext}, process_instruction::{InvokeContext, MockComputeMeter, MockInvokeContext},
pubkey::Pubkey, pubkey::Pubkey,
signature::{Keypair, Signer}, signature::{Keypair, Signer},
}; };
use std::{cell::RefCell, env, fs::File, io::Read, mem, path::PathBuf, sync::Arc}; use std::{cell::RefCell, env, fs::File, io::Read, mem, path::PathBuf, rc::Rc, sync::Arc};
use test::Bencher; use test::Bencher;
/// BPF program file extension /// BPF program file extension
@ -237,7 +237,7 @@ fn bench_create_vm(bencher: &mut Bencher) {
let instruction_data = vec![0u8]; let instruction_data = vec![0u8];
let mut invoke_context = MockInvokeContext::new(&loader_id, keyed_accounts); let mut invoke_context = MockInvokeContext::new(&loader_id, keyed_accounts);
invoke_context.compute_meter.remaining = BUDGET; invoke_context.compute_meter = Rc::new(RefCell::new(MockComputeMeter { remaining: BUDGET }));
// Serialize account data // Serialize account data
let keyed_accounts = invoke_context.get_keyed_accounts().unwrap(); let keyed_accounts = invoke_context.get_keyed_accounts().unwrap();
@ -296,7 +296,7 @@ fn bench_instruction_count_tuner(_bencher: &mut Bencher) {
.collect(); .collect();
let instruction_data = vec![0u8]; let instruction_data = vec![0u8];
let mut invoke_context = MockInvokeContext::new(&program_id, keyed_accounts); let mut invoke_context = MockInvokeContext::new(&program_id, keyed_accounts);
invoke_context.compute_meter.remaining = BUDGET; invoke_context.compute_meter = Rc::new(RefCell::new(MockComputeMeter { remaining: BUDGET }));
// Serialize account data // Serialize account data
let (mut serialized, account_lengths) = serialize_parameters( let (mut serialized, account_lengths) = serialize_parameters(

View File

@ -1365,39 +1365,39 @@ fn assert_instruction_count() {
#[cfg(feature = "bpf_c")] #[cfg(feature = "bpf_c")]
{ {
programs.extend_from_slice(&[ programs.extend_from_slice(&[
("alloc", 1137), ("alloc", 1237),
("bpf_to_bpf", 13), ("bpf_to_bpf", 96),
("multiple_static", 8), ("multiple_static", 52),
("noop", 5), ("noop", 5),
("noop++", 5), ("noop++", 5),
("relative_call", 10), ("relative_call", 26),
("return_data", 480), ("return_data", 980),
("sanity", 169), ("sanity", 1246),
("sanity++", 168), ("sanity++", 1250),
("secp256k1_recover", 359), ("secp256k1_recover", 25357),
("sha", 1040), ("sha", 1328),
("struct_pass", 8), ("struct_pass", 108),
("struct_ret", 22), ("struct_ret", 28),
]); ]);
} }
#[cfg(feature = "bpf_rust")] #[cfg(feature = "bpf_rust")]
{ {
programs.extend_from_slice(&[ programs.extend_from_slice(&[
("solana_bpf_rust_128bit", 584), ("solana_bpf_rust_128bit", 584),
("solana_bpf_rust_alloc", 7143), ("solana_bpf_rust_alloc", 7388),
("solana_bpf_rust_custom_heap", 522), ("solana_bpf_rust_custom_heap", 512),
("solana_bpf_rust_dep_crate", 47), ("solana_bpf_rust_dep_crate", 47),
("solana_bpf_rust_external_spend", 504), ("solana_bpf_rust_external_spend", 483),
("solana_bpf_rust_iter", 724), ("solana_bpf_rust_iter", 824),
("solana_bpf_rust_many_args", 233), ("solana_bpf_rust_many_args", 941),
("solana_bpf_rust_mem", 3119), ("solana_bpf_rust_mem", 3083),
("solana_bpf_rust_membuiltins", 4065), ("solana_bpf_rust_membuiltins", 3976),
("solana_bpf_rust_noop", 478), ("solana_bpf_rust_noop", 457),
("solana_bpf_rust_param_passing", 46), ("solana_bpf_rust_param_passing", 146),
("solana_bpf_rust_rand", 481), ("solana_bpf_rust_rand", 464),
("solana_bpf_rust_sanity", 922), ("solana_bpf_rust_sanity", 1714),
("solana_bpf_rust_secp256k1_recover", 301), ("solana_bpf_rust_secp256k1_recover", 25216),
("solana_bpf_rust_sha", 32337), ("solana_bpf_rust_sha", 30704),
]); ]);
} }

View File

@ -1328,7 +1328,7 @@ mod tests {
keyed_accounts.insert(0, (false, false, &program_key, &processor_account)); keyed_accounts.insert(0, (false, false, &program_key, &processor_account));
let mut invoke_context = let mut invoke_context =
MockInvokeContext::new(&program_key, create_keyed_accounts_unified(&keyed_accounts)); MockInvokeContext::new(&program_key, create_keyed_accounts_unified(&keyed_accounts));
invoke_context.compute_meter = MockComputeMeter::default(); invoke_context.compute_meter = Rc::new(RefCell::new(MockComputeMeter::default()));
assert_eq!( assert_eq!(
Err(InstructionError::ProgramFailedToComplete), Err(InstructionError::ProgramFailedToComplete),
super::process_instruction(1, &[], &mut invoke_context) super::process_instruction(1, &[], &mut invoke_context)

View File

@ -354,7 +354,7 @@ pub struct MockInvokeContext<'a> {
pub invoke_stack: Vec<InvokeContextStackFrame<'a>>, pub invoke_stack: Vec<InvokeContextStackFrame<'a>>,
pub logger: MockLogger, pub logger: MockLogger,
pub compute_budget: ComputeBudget, pub compute_budget: ComputeBudget,
pub compute_meter: MockComputeMeter, pub compute_meter: Rc<RefCell<dyn ComputeMeter>>,
pub programs: Vec<(Pubkey, ProcessInstructionWithContext)>, pub programs: Vec<(Pubkey, ProcessInstructionWithContext)>,
pub accounts: Vec<(Pubkey, Rc<RefCell<AccountSharedData>>)>, pub accounts: Vec<(Pubkey, Rc<RefCell<AccountSharedData>>)>,
#[allow(clippy::type_complexity)] #[allow(clippy::type_complexity)]
@ -372,9 +372,9 @@ impl<'a> MockInvokeContext<'a> {
invoke_stack: Vec::with_capacity(compute_budget.max_invoke_depth), invoke_stack: Vec::with_capacity(compute_budget.max_invoke_depth),
logger: MockLogger::default(), logger: MockLogger::default(),
compute_budget, compute_budget,
compute_meter: MockComputeMeter { compute_meter: Rc::new(RefCell::new(MockComputeMeter {
remaining: std::i64::MAX as u64, remaining: std::i64::MAX as u64,
}, })),
programs: vec![], programs: vec![],
accounts: vec![], accounts: vec![],
sysvars: RefCell::new(Vec::new()), sysvars: RefCell::new(Vec::new()),
@ -464,7 +464,7 @@ impl<'a> InvokeContext for MockInvokeContext<'a> {
Rc::new(RefCell::new(self.logger.clone())) Rc::new(RefCell::new(self.logger.clone()))
} }
fn get_compute_meter(&self) -> Rc<RefCell<dyn ComputeMeter>> { fn get_compute_meter(&self) -> Rc<RefCell<dyn ComputeMeter>> {
Rc::new(RefCell::new(self.compute_meter.clone())) self.compute_meter.clone()
} }
fn add_executor(&self, _pubkey: &Pubkey, _executor: Arc<dyn Executor>) {} fn add_executor(&self, _pubkey: &Pubkey, _executor: Arc<dyn Executor>) {}
fn get_executor(&self, _pubkey: &Pubkey) -> Option<Arc<dyn Executor>> { fn get_executor(&self, _pubkey: &Pubkey) -> Option<Arc<dyn Executor>> {