mirror of
https://github.com/pezkuwichain/revive-differential-tests.git
synced 2026-04-27 11:27:59 +00:00
Compare commits
49 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2c7e95bb4f | |||
| 2b6ee18e40 | |||
| ca1ce3e5b4 | |||
| 3d28179dde | |||
| 6303f3b917 | |||
| e434c163c7 | |||
| 404d2f7452 | |||
| 750d9fff27 | |||
| 94afdbecc7 | |||
| ce1b4862b4 | |||
| 799f07f04f | |||
| 2a1f81fb6d | |||
| 51191013c1 | |||
| c81279fc8f | |||
| 0392b6b629 | |||
| ac94c972de | |||
| 5cc814b0e0 | |||
| 0722791a28 | |||
| 52042dfff5 | |||
| e3c717f4d9 | |||
| e7ebe4fa2f | |||
| 5c957e5ac1 | |||
| a0248b58f3 | |||
| 6a9acea748 | |||
| c31c7d94f9 | |||
| dcc43d4ea6 | |||
| cb13c3c2cd | |||
| 7cda3416f0 | |||
| d7bc4f1fab | |||
| b6db597a57 | |||
| d7136d9a3d | |||
| e5a3f0aee9 | |||
| 3cdf57f7c3 | |||
| dab8ffe520 | |||
| c913a8222f | |||
| c8cef4834f | |||
| ca59a1f6a9 | |||
| adc0c44cde | |||
| 811e17136b | |||
| ba32bad6b3 | |||
| bb754cba4f | |||
| c858bbe66d | |||
| 906878f06a | |||
| 9a71369e8a | |||
| 84ab873b46 | |||
| 2ef6f7ba63 | |||
| 38e6140a7c | |||
| ca6c5529e2 | |||
| 038a2db53c |
@@ -76,7 +76,7 @@ pub struct Arguments {
|
||||
/// This argument controls which private keys the nodes should have access to and be added to
|
||||
/// its wallet signers. With a value of N, private keys (0, N] will be added to the signer set
|
||||
/// of the node.
|
||||
#[arg(long = "private-keys-count", default_value_t = 30)]
|
||||
#[arg(short, long = "private-keys-count", default_value_t = 30)]
|
||||
pub private_keys_to_add: usize,
|
||||
|
||||
/// The differential testing leader node implementation.
|
||||
|
||||
+43
-33
@@ -74,8 +74,6 @@ impl Instance {
|
||||
const GETH_STDOUT_LOG_FILE_NAME: &str = "node_stdout.log";
|
||||
const GETH_STDERR_LOG_FILE_NAME: &str = "node_stderr.log";
|
||||
|
||||
const TRANSACTION_INDEXING_ERROR: &str = "transaction indexing is in progress";
|
||||
|
||||
/// Create the node directory and call `geth init` to configure the genesis.
|
||||
#[tracing::instrument(skip_all, fields(geth_node_id = self.id))]
|
||||
fn init(&mut self, genesis: String) -> anyhow::Result<&mut Self> {
|
||||
@@ -267,45 +265,57 @@ impl EthereumNode for Instance {
|
||||
// it eventually works, but we only do that if the error we get back is the "transaction
|
||||
// indexing is in progress" error or if the receipt is None.
|
||||
//
|
||||
// Getting the transaction indexed and taking a receipt can take a long time especially
|
||||
// when a lot of transactions are being submitted to the node. Thus, while initially we
|
||||
// only allowed for 60 seconds of waiting with a 1 second delay in polling, we need to
|
||||
// allow for a larger wait time. Therefore, in here we allow for 5 minutes of waiting
|
||||
// with exponential backoff each time we attempt to get the receipt and find that it's
|
||||
// not available.
|
||||
// At the moment we do not allow for the 60 seconds to be modified and we take it as
|
||||
// being an implementation detail that's invisible to anything outside of this module.
|
||||
//
|
||||
// We allow a total of 60 retries for getting the receipt with one second between each
|
||||
// retry and the next which means that we allow for a total of 60 seconds of waiting
|
||||
// before we consider that we're unable to get the transaction receipt.
|
||||
let mut retries = 0;
|
||||
let mut total_wait_duration = Duration::from_secs(0);
|
||||
let max_allowed_wait_duration = Duration::from_secs(5 * 60);
|
||||
loop {
|
||||
if total_wait_duration >= max_allowed_wait_duration {
|
||||
tracing::error!(
|
||||
?total_wait_duration,
|
||||
?max_allowed_wait_duration,
|
||||
retry_count = retries,
|
||||
"Failed to get receipt after polling for it"
|
||||
);
|
||||
anyhow::bail!(
|
||||
"Polled for receipt for {total_wait_duration:?} but failed to get it"
|
||||
);
|
||||
}
|
||||
|
||||
match provider.get_transaction_receipt(*transaction_hash).await {
|
||||
Ok(Some(receipt)) => break Ok(receipt),
|
||||
Ok(None) => {}
|
||||
Ok(Some(receipt)) => {
|
||||
tracing::info!("Obtained the transaction receipt");
|
||||
break Ok(receipt);
|
||||
}
|
||||
Ok(None) => {
|
||||
if retries == 60 {
|
||||
tracing::error!(
|
||||
"Polled for transaction receipt for 60 seconds but failed to get it"
|
||||
);
|
||||
break Err(anyhow::anyhow!("Failed to get the transaction receipt"));
|
||||
} else {
|
||||
tracing::trace!(
|
||||
retries,
|
||||
"Sleeping for 1 second and trying to get the receipt again"
|
||||
);
|
||||
retries += 1;
|
||||
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
Err(error) => {
|
||||
let error_string = error.to_string();
|
||||
if !error_string.contains(Self::TRANSACTION_INDEXING_ERROR) {
|
||||
if error_string.contains("transaction indexing is in progress") {
|
||||
if retries == 60 {
|
||||
tracing::error!(
|
||||
"Polled for transaction receipt for 60 seconds but failed to get it"
|
||||
);
|
||||
break Err(error.into());
|
||||
} else {
|
||||
tracing::trace!(
|
||||
retries,
|
||||
"Sleeping for 1 second and trying to get the receipt again"
|
||||
);
|
||||
retries += 1;
|
||||
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
break Err(error.into());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let next_wait_duration = Duration::from_secs(2u64.pow(retries))
|
||||
.min(max_allowed_wait_duration - total_wait_duration);
|
||||
total_wait_duration += next_wait_duration;
|
||||
retries += 1;
|
||||
|
||||
tokio::time::sleep(next_wait_duration).await;
|
||||
}
|
||||
}
|
||||
})?
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user