Skip to content

Commit bc9d8c1

Browse files
authored
Merge pull request #3436 from IntersectMBO/jpraynaud/handle-aggregator-epoch-zero
feat: accelerate aggregator startup by one epoch in e2e tests
2 parents 8bbdf2d + d86100f commit bc9d8c1

15 files changed

Lines changed: 137 additions & 33 deletions

File tree

Cargo.lock

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

internal/cardano-node/mithril-cardano-node-internal-database/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ anyhow = { workspace = true }
1515
async-trait = { workspace = true }
1616
digest = { workspace = true }
1717
hex = { workspace = true }
18-
mithril-common = { path = "../../../mithril-common", version = "0.7.13" }
18+
mithril-common = { path = "../../../mithril-common", version = "0.7.14" }
1919
serde = { workspace = true }
2020
serde_json = { workspace = true }
2121
sha2 = "0.10.9"

internal/mithril-aggregator-client/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ include = ["**/*.rs", "Cargo.toml", "README.md"]
1313
[dependencies]
1414
anyhow = { workspace = true }
1515
async-trait = { workspace = true }
16-
mithril-common = { path = "../../mithril-common", version = "0.7.13" }
16+
mithril-common = { path = "../../mithril-common", version = "0.7.14" }
1717
reqwest = { workspace = true }
1818
semver = { workspace = true }
1919
serde = { workspace = true }

internal/mithril-aggregator-discovery/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ include = ["**/*.rs", "Cargo.toml", "README.md", ".gitignore"]
1414
anyhow = { workspace = true }
1515
async-trait = { workspace = true }
1616
mithril-aggregator-client = { path = "../mithril-aggregator-client", version = "0.2.4" }
17-
mithril-common = { path = "../../mithril-common", version = "0.7.13" }
17+
mithril-common = { path = "../../mithril-common", version = "0.7.14" }
1818
rand = { version = "0.10.2" }
1919
reqwest = { workspace = true }
2020
serde = { workspace = true }

internal/mithril-protocol-config/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-protocol-config"
3-
version = "0.1.11"
3+
version = "0.1.12"
44
description = "Configuraton parameters for Mithril network"
55
authors = { workspace = true }
66
edition = { workspace = true }

internal/mithril-protocol-config/src/http.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,7 @@ impl MithrilNetworkConfigurationProvider for HttpMithrilNetworkConfigurationProv
6464
&self,
6565
epoch: Epoch,
6666
) -> StdResult<MithrilNetworkConfiguration> {
67-
let aggregation_epoch =
68-
epoch.offset_to_signer_retrieval_epoch().with_context(|| {
69-
format!("MithrilNetworkConfigurationProvider could not compute aggregation epoch from epoch: {epoch}")
70-
})?;
67+
let aggregation_epoch = epoch.offset_to_signer_retrieval_epoch_saturating();
7168
let next_aggregation_epoch = epoch.offset_to_next_signer_retrieval_epoch();
7269
let registration_epoch = epoch.offset_to_next_signer_retrieval_epoch().next();
7370

mithril-aggregator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mithril-aggregator"
3-
version = "0.9.17"
3+
version = "0.9.18"
44
description = "A Mithril Aggregator server"
55
authors = { workspace = true }
66
edition = { workspace = true }

mithril-aggregator/src/services/epoch_service.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,10 +296,7 @@ impl EpochService for MithrilEpochService {
296296

297297
let mithril_era = self.era_checker.current_era();
298298

299-
let signer_retrieval_epoch =
300-
epoch.offset_to_signer_retrieval_epoch().with_context(|| {
301-
format!("EpochService could not compute signer retrieval epoch from epoch: {epoch}")
302-
})?;
299+
let signer_retrieval_epoch = epoch.offset_to_signer_retrieval_epoch_saturating();
303300
let next_signer_retrieval_epoch = epoch.offset_to_next_signer_retrieval_epoch();
304301
let signer_registration_epoch = epoch.offset_to_recording_epoch();
305302

@@ -957,7 +954,7 @@ mod tests {
957954

958955
async fn build(self) -> MithrilEpochService {
959956
let signer_retrieval_epoch =
960-
self.current_epoch.offset_to_signer_retrieval_epoch().unwrap();
957+
self.current_epoch.offset_to_signer_retrieval_epoch_saturating();
961958
let next_signer_retrieval_epoch =
962959
self.current_epoch.offset_to_next_signer_retrieval_epoch();
963960

@@ -1098,6 +1095,29 @@ mod tests {
10981095
);
10991096
}
11001097

1098+
#[tokio::test]
1099+
async fn inform_epoch_at_epoch_zero_retrieves_signers_at_epoch_zero() {
1100+
let epoch = Epoch(0);
1101+
let epoch_fixture = MithrilFixtureBuilder::default().with_signers(3).build();
1102+
1103+
let mut service = EpochServiceBuilder::new(epoch, epoch_fixture.clone()).build().await;
1104+
1105+
service
1106+
.inform_epoch(epoch)
1107+
.await
1108+
.expect("inform_epoch should not fail at epoch zero");
1109+
1110+
assert_eq!(epoch, service.epoch_of_current_data().unwrap());
1111+
assert_eq!(
1112+
epoch_fixture.signers(),
1113+
service.current_signers().unwrap().clone()
1114+
);
1115+
assert_eq!(
1116+
epoch_fixture.signers(),
1117+
service.next_signers().unwrap().clone()
1118+
);
1119+
}
1120+
11011121
#[tokio::test]
11021122
async fn inform_epoch_get_signed_entity_config_from_its_dependencies_and_store() {
11031123
let epoch = Epoch(5);

mithril-aggregator/src/services/network_configuration_provider.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use std::collections::BTreeSet;
22
use std::sync::Arc;
33

4-
use anyhow::Context;
54
use async_trait::async_trait;
65
use slog::{Logger, warn};
76

@@ -96,10 +95,7 @@ impl MithrilNetworkConfigurationProvider for LocalMithrilNetworkConfigurationPro
9695
&self,
9796
epoch: Epoch,
9897
) -> StdResult<MithrilNetworkConfiguration> {
99-
let aggregation_epoch =
100-
epoch.offset_to_signer_retrieval_epoch().with_context(|| {
101-
format!("MithrilNetworkConfigurationProvider could not compute aggregation epoch from epoch: {epoch}")
102-
})?;
98+
let aggregation_epoch = epoch.offset_to_signer_retrieval_epoch_saturating();
10399
let next_aggregation_epoch = epoch.offset_to_next_signer_retrieval_epoch();
104100
let registration_epoch = epoch.offset_to_next_signer_retrieval_epoch().next();
105101

mithril-aggregator/src/store/epoch_settings_storer.rs

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ pub trait EpochSettingsStorer:
4747
) -> StdResult<()> {
4848
for (epoch, epoch_configuration) in [
4949
(
50-
network_configuration.epoch.offset_to_signer_retrieval_epoch()?,
50+
network_configuration
51+
.epoch
52+
.offset_to_signer_retrieval_epoch_saturating(),
5153
&network_configuration.configuration_for_aggregation,
5254
),
5355
(
@@ -242,4 +244,43 @@ mod tests {
242244
let epoch_settings_stored = store.get_epoch_settings(epoch + 2).await.unwrap();
243245
assert!(epoch_settings_stored.is_none());
244246
}
247+
248+
#[tokio::test]
249+
async fn test_handle_discrepancies_at_startup_at_epoch_zero_clamps_the_aggregation_epoch() {
250+
let epoch_settings = AggregatorEpochSettings::dummy();
251+
let mut aggregation_epoch_settings = epoch_settings.clone();
252+
aggregation_epoch_settings.protocol_parameters.k += 15;
253+
254+
let mut next_aggregation_epoch_settings = epoch_settings.clone();
255+
next_aggregation_epoch_settings.protocol_parameters.k += 26;
256+
257+
let mut registration_epoch_settings = epoch_settings.clone();
258+
registration_epoch_settings.protocol_parameters.k += 37;
259+
260+
let epoch = Epoch(0);
261+
let store = FakeEpochSettingsStorer::new(vec![]);
262+
store
263+
.handle_discrepancies_at_startup(&MithrilNetworkConfiguration {
264+
epoch,
265+
configuration_for_aggregation: aggregation_epoch_settings
266+
.clone()
267+
.into_network_configuration_for_epoch(BTreeSet::new()),
268+
configuration_for_next_aggregation: next_aggregation_epoch_settings
269+
.into_network_configuration_for_epoch(BTreeSet::new()),
270+
configuration_for_registration: registration_epoch_settings
271+
.clone()
272+
.into_network_configuration_for_epoch(BTreeSet::new()),
273+
})
274+
.await
275+
.unwrap();
276+
277+
let epoch_settings_stored = store.get_epoch_settings(Epoch(0)).await.unwrap();
278+
assert_eq!(Some(aggregation_epoch_settings), epoch_settings_stored);
279+
280+
let epoch_settings_stored = store.get_epoch_settings(Epoch(1)).await.unwrap();
281+
assert_eq!(Some(registration_epoch_settings), epoch_settings_stored);
282+
283+
let epoch_settings_stored = store.get_epoch_settings(Epoch(2)).await.unwrap();
284+
assert!(epoch_settings_stored.is_none());
285+
}
245286
}

0 commit comments

Comments
 (0)