mirror of
https://github.com/pezkuwichain/revive-differential-tests.git
synced 2026-06-13 23:21:04 +00:00
Allow benchmarks driver to await tx receipts
This commit is contained in:
@@ -375,6 +375,23 @@ pub struct BenchmarkingContext {
|
|||||||
#[arg(short = 'r', long = "default-repetition-count", default_value_t = 1000)]
|
#[arg(short = 'r', long = "default-repetition-count", default_value_t = 1000)]
|
||||||
pub default_repetition_count: usize,
|
pub default_repetition_count: usize,
|
||||||
|
|
||||||
|
/// This transaction controls whether the benchmarking driver should await for transactions to
|
||||||
|
/// be included in a block before moving on to the next transaction in the sequence or not.
|
||||||
|
///
|
||||||
|
/// This behavior is useful in certain cases and not so useful in others. For example, in some
|
||||||
|
/// repetition block if there's some kind of relationship between txs n and n+1 (for example a
|
||||||
|
/// mint then a transfer) then you would want to wait for the minting to happen and then move on
|
||||||
|
/// to the transfers. On the other hand, if there's no relationship between the transactions n
|
||||||
|
/// and n+1 (e.g., mint and another mint of a different token) then awaiting the first mint to
|
||||||
|
/// be included in a block might not seem necessary.
|
||||||
|
///
|
||||||
|
/// By default, this behavior is set to false to allow the benchmarking framework to saturate
|
||||||
|
/// the node's mempool as quickly as possible. However, as explained above, there are cases
|
||||||
|
/// where it's needed and certain workloads where failure to provide this argument would lead to
|
||||||
|
/// inaccurate results.
|
||||||
|
#[arg(long)]
|
||||||
|
pub await_transaction_inclusion: bool,
|
||||||
|
|
||||||
/// Configuration parameters for the corpus files to use.
|
/// Configuration parameters for the corpus files to use.
|
||||||
#[clap(flatten, next_help_heading = "Corpus Configuration")]
|
#[clap(flatten, next_help_heading = "Corpus Configuration")]
|
||||||
pub corpus_configuration: CorpusConfiguration,
|
pub corpus_configuration: CorpusConfiguration,
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ pub struct Driver<'a, I> {
|
|||||||
/// The number of steps that were executed on the driver.
|
/// The number of steps that were executed on the driver.
|
||||||
steps_executed: usize,
|
steps_executed: usize,
|
||||||
|
|
||||||
|
/// This function controls if the driver should wait for transactions to be included in a block
|
||||||
|
/// or not before proceeding forward.
|
||||||
|
await_transaction_inclusion: bool,
|
||||||
|
|
||||||
/// This is the queue of steps that are to be executed by the driver for this test case. Each
|
/// This is the queue of steps that are to be executed by the driver for this test case. Each
|
||||||
/// time `execute_step` is called one of the steps is executed.
|
/// time `execute_step` is called one of the steps is executed.
|
||||||
steps_iterator: I,
|
steps_iterator: I,
|
||||||
@@ -89,6 +93,7 @@ where
|
|||||||
private_key_allocator: Arc<Mutex<PrivateKeyAllocator>>,
|
private_key_allocator: Arc<Mutex<PrivateKeyAllocator>>,
|
||||||
cached_compiler: &CachedCompiler<'a>,
|
cached_compiler: &CachedCompiler<'a>,
|
||||||
watcher_tx: UnboundedSender<WatcherEvent>,
|
watcher_tx: UnboundedSender<WatcherEvent>,
|
||||||
|
await_transaction_inclusion: bool,
|
||||||
steps: I,
|
steps: I,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let mut this = Driver {
|
let mut this = Driver {
|
||||||
@@ -104,6 +109,7 @@ where
|
|||||||
execution_state: ExecutionState::empty(),
|
execution_state: ExecutionState::empty(),
|
||||||
steps_executed: 0,
|
steps_executed: 0,
|
||||||
steps_iterator: steps,
|
steps_iterator: steps,
|
||||||
|
await_transaction_inclusion,
|
||||||
watcher_tx,
|
watcher_tx,
|
||||||
};
|
};
|
||||||
this.init_execution_state(cached_compiler)
|
this.init_execution_state(cached_compiler)
|
||||||
@@ -166,7 +172,7 @@ where
|
|||||||
code,
|
code,
|
||||||
);
|
);
|
||||||
let receipt = self
|
let receipt = self
|
||||||
.execute_transaction(tx, None)
|
.execute_transaction(tx, None, Duration::from_secs(5 * 60))
|
||||||
.and_then(|(_, receipt_fut)| receipt_fut)
|
.and_then(|(_, receipt_fut)| receipt_fut)
|
||||||
.await
|
.await
|
||||||
.inspect_err(|err| {
|
.inspect_err(|err| {
|
||||||
@@ -365,7 +371,17 @@ where
|
|||||||
let tx = step
|
let tx = step
|
||||||
.as_transaction(self.resolver.as_ref(), self.default_resolution_context())
|
.as_transaction(self.resolver.as_ref(), self.default_resolution_context())
|
||||||
.await?;
|
.await?;
|
||||||
Ok(self.execute_transaction(tx, Some(step_path)).await?.0)
|
|
||||||
|
let (tx_hash, receipt_future) = self
|
||||||
|
.execute_transaction(tx, Some(step_path), Duration::from_secs(30 * 60))
|
||||||
|
.await?;
|
||||||
|
if self.await_transaction_inclusion {
|
||||||
|
let _ = receipt_future
|
||||||
|
.await
|
||||||
|
.context("Failed while waiting for transaction inclusion in block")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(tx_hash)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -466,6 +482,7 @@ where
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
steps.into_iter()
|
steps.into_iter()
|
||||||
},
|
},
|
||||||
|
await_transaction_inclusion: self.await_transaction_inclusion,
|
||||||
watcher_tx: self.watcher_tx.clone(),
|
watcher_tx: self.watcher_tx.clone(),
|
||||||
})
|
})
|
||||||
.map(|driver| driver.execute_all());
|
.map(|driver| driver.execute_all());
|
||||||
@@ -632,7 +649,7 @@ where
|
|||||||
};
|
};
|
||||||
|
|
||||||
let receipt = match self
|
let receipt = match self
|
||||||
.execute_transaction(tx, step_path)
|
.execute_transaction(tx, step_path, Duration::from_secs(5 * 60))
|
||||||
.and_then(|(_, receipt_fut)| receipt_fut)
|
.and_then(|(_, receipt_fut)| receipt_fut)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
@@ -683,6 +700,7 @@ where
|
|||||||
&self,
|
&self,
|
||||||
transaction: TransactionRequest,
|
transaction: TransactionRequest,
|
||||||
step_path: Option<&StepPath>,
|
step_path: Option<&StepPath>,
|
||||||
|
receipt_wait_duration: Duration,
|
||||||
) -> anyhow::Result<(TxHash, impl Future<Output = Result<TransactionReceipt>>)> {
|
) -> anyhow::Result<(TxHash, impl Future<Output = Result<TransactionReceipt>>)> {
|
||||||
let node = self.platform_information.node;
|
let node = self.platform_information.node;
|
||||||
let transaction_hash = node
|
let transaction_hash = node
|
||||||
@@ -704,7 +722,7 @@ where
|
|||||||
Ok((transaction_hash, async move {
|
Ok((transaction_hash, async move {
|
||||||
info!("Starting to poll for transaction receipt");
|
info!("Starting to poll for transaction receipt");
|
||||||
poll(
|
poll(
|
||||||
Duration::from_secs(30 * 60),
|
receipt_wait_duration,
|
||||||
PollingWaitBehavior::Constant(Duration::from_secs(1)),
|
PollingWaitBehavior::Constant(Duration::from_secs(1)),
|
||||||
|| {
|
|| {
|
||||||
async move {
|
async move {
|
||||||
|
|||||||
@@ -160,6 +160,7 @@ pub async fn handle_differential_benchmarks(
|
|||||||
private_key_allocator,
|
private_key_allocator,
|
||||||
cached_compiler.as_ref(),
|
cached_compiler.as_ref(),
|
||||||
watcher_tx.clone(),
|
watcher_tx.clone(),
|
||||||
|
context.await_transaction_inclusion,
|
||||||
test_definition
|
test_definition
|
||||||
.case
|
.case
|
||||||
.steps_iterator_for_benchmarks(context.default_repetition_count)
|
.steps_iterator_for_benchmarks(context.default_repetition_count)
|
||||||
|
|||||||
Reference in New Issue
Block a user