Skip to content

Commit f313498

Browse files
committed
Create a task to prune EpochSettings and add it to the UpkeepService.
1 parent 4175974 commit f313498

File tree

3 files changed

+71
-31
lines changed

3 files changed

+71
-31
lines changed

mithril-aggregator/src/database/repository/epoch_settings_store.rs

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::database::query::{
1212
DeleteEpochSettingsQuery, GetEpochSettingsQuery, UpdateEpochSettingsQuery,
1313
};
1414
use crate::entities::AggregatorEpochSettings;
15+
use crate::services::EpochPruningTask;
1516
use crate::EpochSettingsStorer;
1617

1718
/// Service to deal with epoch settings (read & write).
@@ -68,17 +69,6 @@ impl EpochSettingsStorer for EpochSettingsStore {
6869
.map_err(|e| AdapterError::GeneralError(e.context("persist epoch settings failure")))?
6970
.unwrap_or_else(|| panic!("No entity returned by the persister, epoch = {epoch:?}"));
7071

71-
// Prune useless old epoch settings.
72-
if let Some(threshold) = self.retention_limit {
73-
let _ = self
74-
.connection
75-
.fetch(DeleteEpochSettingsQuery::below_epoch_threshold(
76-
epoch - threshold,
77-
))
78-
.map_err(AdapterError::QueryError)?
79-
.count();
80-
}
81-
8272
Ok(Some(epoch_settings_record.into()))
8373
}
8474

@@ -102,6 +92,25 @@ impl EpochSettingsStorer for EpochSettingsStore {
10292
}
10393
}
10494

95+
#[async_trait]
96+
impl EpochPruningTask for EpochSettingsStore {
97+
fn pruned_data(&self) -> &'static str {
98+
"Epoch settings"
99+
}
100+
101+
/// Prune useless old epoch settings.
102+
async fn prune(&self, epoch: Epoch) -> StdResult<()> {
103+
if let Some(threshold) = self.retention_limit {
104+
self.connection
105+
.apply(DeleteEpochSettingsQuery::below_epoch_threshold(
106+
epoch - threshold,
107+
))
108+
.map_err(AdapterError::QueryError)?;
109+
}
110+
Ok(())
111+
}
112+
}
113+
105114
#[cfg(test)]
106115
mod tests {
107116
use mithril_common::entities::BlockNumber;
@@ -172,7 +181,7 @@ mod tests {
172181
}
173182

174183
#[tokio::test]
175-
async fn save_epoch_settings_prune_older_epoch_settings() {
184+
async fn prune_epoch_settings_older_than_threshold() {
176185
const EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD: u64 = 5;
177186

178187
let connection = main_db_connection().unwrap();
@@ -183,12 +192,10 @@ mod tests {
183192
);
184193

185194
store
186-
.save_epoch_settings(
187-
Epoch(2) + EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD,
188-
AggregatorEpochSettings::dummy(),
189-
)
195+
.prune(Epoch(2) + EPOCH_SETTINGS_PRUNE_EPOCH_THRESHOLD)
190196
.await
191-
.expect("saving epoch settings should not fails");
197+
.unwrap();
198+
192199
let epoch1_params = store.get_epoch_settings(Epoch(1)).await.unwrap();
193200
let epoch2_params = store.get_epoch_settings(Epoch(2)).await.unwrap();
194201

@@ -202,6 +209,27 @@ mod tests {
202209
);
203210
}
204211

212+
#[tokio::test]
213+
async fn without_threshold_nothing_is_pruned() {
214+
let connection = main_db_connection().unwrap();
215+
insert_epoch_settings(&connection, &[1, 2]).unwrap();
216+
let store = EpochSettingsStore::new(Arc::new(connection), None);
217+
218+
store.prune(Epoch(100)).await.unwrap();
219+
220+
let epoch1_params = store.get_epoch_settings(Epoch(1)).await.unwrap();
221+
let epoch2_params = store.get_epoch_settings(Epoch(2)).await.unwrap();
222+
223+
assert!(
224+
epoch1_params.is_some(),
225+
"Epoch settings at epoch 1 should have been pruned",
226+
);
227+
assert!(
228+
epoch2_params.is_some(),
229+
"Epoch settings at epoch 2 should still exist",
230+
);
231+
}
232+
205233
#[tokio::test]
206234
async fn save_epoch_settings_stores_in_database() {
207235
let connection = main_db_connection().unwrap();

mithril-aggregator/src/dependency_injection/builder.rs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ pub struct DependenciesBuilder {
133133
/// Verification key store.
134134
pub verification_key_store: Option<Arc<dyn VerificationKeyStorer>>,
135135

136-
/// Epoch settings storer.
137-
pub epoch_settings_storer: Option<Arc<dyn EpochSettingsStorer>>,
136+
/// Epoch settings store.
137+
pub epoch_settings_store: Option<Arc<EpochSettingsStore>>,
138138

139139
/// Cardano CLI Runner for the [ChainObserver]
140140
pub cardano_cli_runner: Option<Box<CardanoCliRunner>>,
@@ -261,7 +261,7 @@ impl DependenciesBuilder {
261261
certificate_repository: None,
262262
open_message_repository: None,
263263
verification_key_store: None,
264-
epoch_settings_storer: None,
264+
epoch_settings_store: None,
265265
cardano_cli_runner: None,
266266
chain_observer: None,
267267
chain_block_reader: None,
@@ -587,7 +587,7 @@ impl DependenciesBuilder {
587587
Ok(self.verification_key_store.as_ref().cloned().unwrap())
588588
}
589589

590-
async fn build_epoch_settings_storer(&mut self) -> Result<Arc<dyn EpochSettingsStorer>> {
590+
async fn build_epoch_settings_store(&mut self) -> Result<Arc<EpochSettingsStore>> {
591591
let logger = self.root_logger();
592592
let epoch_settings_store = EpochSettingsStore::new(
593593
self.get_sqlite_connection().await?,
@@ -638,12 +638,12 @@ impl DependenciesBuilder {
638638
}
639639

640640
/// Get a configured [EpochSettingsStorer].
641-
pub async fn get_epoch_settings_storer(&mut self) -> Result<Arc<dyn EpochSettingsStorer>> {
642-
if self.epoch_settings_storer.is_none() {
643-
self.epoch_settings_storer = Some(self.build_epoch_settings_storer().await?);
641+
pub async fn get_epoch_settings_store(&mut self) -> Result<Arc<EpochSettingsStore>> {
642+
if self.epoch_settings_store.is_none() {
643+
self.epoch_settings_store = Some(self.build_epoch_settings_store().await?);
644644
}
645645

646-
Ok(self.epoch_settings_storer.as_ref().cloned().unwrap())
646+
Ok(self.epoch_settings_store.as_ref().cloned().unwrap())
647647
}
648648

649649
async fn build_chain_observer(&mut self) -> Result<Arc<dyn ChainObserver>> {
@@ -1255,7 +1255,7 @@ impl DependenciesBuilder {
12551255

12561256
async fn build_epoch_service(&mut self) -> Result<EpochServiceWrapper> {
12571257
let verification_key_store = self.get_verification_key_store().await?;
1258-
let epoch_settings_storer = self.get_epoch_settings_storer().await?;
1258+
let epoch_settings_storer = self.get_epoch_settings_store().await?;
12591259
let chain_observer = self.get_chain_observer().await?;
12601260
let era_checker = self.get_era_checker().await?;
12611261
let stake_distribution_service = self.get_stake_distribution_service().await?;
@@ -1338,14 +1338,15 @@ impl DependenciesBuilder {
13381338

13391339
async fn build_upkeep_service(&mut self) -> Result<Arc<dyn UpkeepService>> {
13401340
let stake_pool_pruning_task = self.get_stake_store().await?;
1341+
let epoch_settings_pruning_task = self.get_epoch_settings_store().await?;
13411342

13421343
let upkeep_service = Arc::new(AggregatorUpkeepService::new(
13431344
self.get_sqlite_connection().await?,
13441345
self.get_sqlite_connection_cardano_transaction_pool()
13451346
.await?,
13461347
self.get_event_store_sqlite_connection().await?,
13471348
self.get_signed_entity_lock().await?,
1348-
vec![stake_pool_pruning_task],
1349+
vec![stake_pool_pruning_task, epoch_settings_pruning_task],
13491350
self.root_logger(),
13501351
));
13511352

@@ -1436,7 +1437,7 @@ impl DependenciesBuilder {
14361437
certificate_repository: self.get_certificate_repository().await?,
14371438
open_message_repository: self.get_open_message_repository().await?,
14381439
verification_key_store: self.get_verification_key_store().await?,
1439-
epoch_settings_storer: self.get_epoch_settings_storer().await?,
1440+
epoch_settings_storer: self.get_epoch_settings_store().await?,
14401441
chain_observer: self.get_chain_observer().await?,
14411442
immutable_file_observer: self.get_immutable_file_observer().await?,
14421443
digester: self.get_immutable_digester().await?,
@@ -1563,7 +1564,7 @@ impl DependenciesBuilder {
15631564
certificate_repository: self.get_certificate_repository().await?,
15641565
certificate_verifier: self.get_certificate_verifier().await?,
15651566
genesis_verifier: self.get_genesis_verifier().await?,
1566-
epoch_settings_storer: self.get_epoch_settings_storer().await?,
1567+
epoch_settings_storer: self.get_epoch_settings_store().await?,
15671568
verification_key_store: self.get_verification_key_store().await?,
15681569
};
15691570

mithril-aggregator/src/store/epoch_settings_storer.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use tokio::sync::RwLock;
66

77
use mithril_common::entities::{Epoch, ProtocolParameters};
88

9-
use crate::entities::AggregatorEpochSettings;
9+
use crate::{entities::AggregatorEpochSettings, services::EpochPruningTask};
1010

1111
/// Store and get [aggregator epoch settings][AggregatorEpochSettings] for given epoch.
1212
#[async_trait]
13-
pub trait EpochSettingsStorer: Sync + Send {
13+
pub trait EpochSettingsStorer: EpochPruningTask + Sync + Send {
1414
/// Save the given `AggregatorEpochSettings` for the given [Epoch].
1515
async fn save_epoch_settings(
1616
&self,
@@ -83,6 +83,17 @@ impl EpochSettingsStorer for FakeEpochSettingsStorer {
8383
}
8484
}
8585

86+
#[async_trait]
87+
impl EpochPruningTask for FakeEpochSettingsStorer {
88+
fn pruned_data(&self) -> &'static str {
89+
"Fake epoch settings"
90+
}
91+
92+
async fn prune(&self, _epoch: Epoch) -> StdResult<()> {
93+
Ok(())
94+
}
95+
}
96+
8697
#[cfg(test)]
8798
mod tests {
8899

0 commit comments

Comments
 (0)