Skip to content

Commit 33982e5

Browse files
jpraynaudAlenar
authored andcommitted
Enhance load tester performances
Reuse HTTP client and parallelize pre-compute of single signatures.
1 parent 55a3e08 commit 33982e5

File tree

4 files changed

+70
-42
lines changed

4 files changed

+70
-42
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mithril-common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ nom = "7.1"
3535
rand-chacha-dalek-compat = { package = "rand_chacha", version = "0.2" }
3636
rand_chacha = "0.3.1"
3737
rand_core = "0.6.3"
38+
rayon = "1.7.0"
3839
semver = "1.0"
3940
serde = { version = "1.0", features = ["derive"] }
4041
serde_bytes = "0.11.7"

mithril-common/src/test_utils/mithril_fixture.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1+
use rayon::prelude::*;
2+
use serde::{Deserialize, Serialize};
13
use std::{
24
collections::HashMap,
35
path::{Path, PathBuf},
46
sync::Arc,
57
};
68

7-
use serde::{Deserialize, Serialize};
8-
99
use crate::{
1010
certificate_chain::CertificateGenesisProducer,
1111
crypto_helper::{
@@ -176,6 +176,15 @@ impl MithrilFixture {
176176
)
177177
.unwrap()
178178
}
179+
180+
/// Make all underlying signers sign the given message, filter the resulting list to remove
181+
/// the signers that did not sign because they loosed the lottery.
182+
pub fn sign_all(&self, message: &ProtocolMessage) -> Vec<SingleSignatures> {
183+
self.signers
184+
.par_iter()
185+
.filter_map(|s| s.sign(message))
186+
.collect()
187+
}
179188
}
180189

181190
impl From<MithrilFixture> for Vec<Signer> {

mithril-test-lab/mithril-end-to-end/src/bin/load-aggregator/main.rs

Lines changed: 57 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,37 @@ where
240240
}
241241
}
242242

243+
/// Precompute all signers single signatures for the given fixture
244+
pub async fn precompute_mithril_stake_distribution_signatures(
245+
signers_fixture: &MithrilFixture,
246+
timeout: Duration,
247+
) -> StdResult<Vec<SingleSignatures>> {
248+
spin_while_waiting!(
249+
{
250+
let signers_fixture = signers_fixture.clone();
251+
let signatures = tokio::task::spawn_blocking(move || -> Vec<SingleSignatures> {
252+
let mithril_stake_distribution_message = {
253+
let mut message = ProtocolMessage::new();
254+
message.set_message_part(
255+
mithril_common::entities::ProtocolMessagePartKey::NextAggregateVerificationKey,
256+
signers_fixture.compute_and_encode_avk(),
257+
);
258+
259+
message
260+
};
261+
262+
signers_fixture.sign_all(&mithril_stake_distribution_message)
263+
})
264+
.await?;
265+
266+
Ok(signatures)
267+
},
268+
timeout,
269+
format!("Precompute signatures for MithrilStakeDistribution signed entity"),
270+
format!("Precomputing signatures timeout after {timeout:?}")
271+
)
272+
}
273+
243274
/// Wait for certificates
244275
pub async fn wait_for_certificates(
245276
aggregator: &Aggregator,
@@ -291,15 +322,17 @@ pub async fn register_signers_to_aggregator(
291322
Some(register_messages.len() as u64),
292323
ProgressDrawTarget::stdout(),
293324
);
325+
326+
let http_client = reqwest::Client::new();
327+
294328
for register in register_messages {
295329
let endpoint = aggregator.endpoint();
330+
let http_request = http_client
331+
.post(format!("{}/register-signer", endpoint))
332+
.json(&register);
333+
296334
join_set.spawn(async move {
297-
let response = reqwest::Client::new()
298-
.post(format!("{}/register-signer", endpoint))
299-
.json(&register)
300-
.send()
301-
.await
302-
.unwrap();
335+
let response = http_request.send().await.unwrap();
303336

304337
match response.status() {
305338
StatusCode::CREATED => Ok(()),
@@ -340,15 +373,17 @@ pub async fn register_signatures_to_aggregator(
340373
Some(register_messages.len() as u64),
341374
ProgressDrawTarget::stdout(),
342375
);
376+
377+
let http_client = reqwest::Client::new();
378+
343379
for register in register_messages {
344380
let endpoint = aggregator.endpoint();
381+
let http_request = http_client
382+
.post(format!("{}/register-signatures", endpoint))
383+
.json(&register);
384+
345385
join_set.spawn(async move {
346-
let response = reqwest::Client::new()
347-
.post(format!("{}/register-signatures", endpoint))
348-
.json(&register)
349-
.send()
350-
.await
351-
.unwrap();
386+
let response = http_request.send().await.unwrap();
352387

353388
match response.status() {
354389
StatusCode::CREATED => Ok(()),
@@ -522,13 +557,6 @@ async fn bootstrap_aggregator(
522557
signers_fixture: &MithrilFixture,
523558
current_epoch: &mut Epoch,
524559
) -> StdResult<Aggregator> {
525-
// let genesis_signers = {
526-
// let mut signers = signers_fixture.signers();
527-
// // Up to 100 signers for the genesis certificate to avoid registration round errors
528-
// signers.truncate(100);
529-
// signers
530-
// };
531-
532560
info!(">> Launch Aggregator");
533561
let mut aggregator = Aggregator::new(
534562
args.server_port as u64,
@@ -616,34 +644,23 @@ async fn bootstrap_aggregator(
616644
Ok(aggregator)
617645
}
618646

619-
#[tokio::main(flavor = "multi_thread", worker_threads = 20)]
647+
#[tokio::main(flavor = "multi_thread")]
620648
async fn main() -> StdResult<()> {
621649
let opts = MainOpts::parse();
622-
let _logger = init_logger(&opts);
650+
let _logger_guard = init_logger(&opts);
623651
let args = AggregatorParameters::new(&opts)?;
624652
let mut current_epoch = Epoch(1);
653+
let protocol_parameters = ProtocolParameters::new(2422, 20973, 0.20);
625654
info!(">> Starting stress test with options: {opts:?}");
626655

627656
info!(">> Creation of the Signer Key Registrations payloads");
628-
let signers_fixture =
629-
generate_signer_data(opts.num_signers, ProtocolParameters::new(5, 100, 0.65));
630-
631-
info!(">> Precompute message & signatures for MithrilStakeDistribution signed entity");
632-
let mithril_stake_distribution_message = {
633-
let mut message = ProtocolMessage::new();
634-
message.set_message_part(
635-
mithril_common::entities::ProtocolMessagePartKey::NextAggregateVerificationKey,
636-
signers_fixture.compute_and_encode_avk(),
637-
);
638-
639-
message
640-
};
641-
let mithril_stake_distribution_signatures: Vec<SingleSignatures> = signers_fixture
642-
.signers_fixture()
643-
.iter()
644-
// filter map to exclude signers that could not sign because they lost the lottery
645-
.filter_map(|s| s.sign(&mithril_stake_distribution_message))
646-
.collect();
657+
let signers_fixture = generate_signer_data(opts.num_signers, protocol_parameters);
658+
659+
let mithril_stake_distribution_signatures = precompute_mithril_stake_distribution_signatures(
660+
&signers_fixture,
661+
Duration::from_secs(180),
662+
)
663+
.await?;
647664

648665
let mut aggregator = bootstrap_aggregator(&args, &signers_fixture, &mut current_epoch).await?;
649666

0 commit comments

Comments
 (0)