diff --git a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SequencerPruningIntegrationTest.scala b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/PruningIntegrationTest.scala similarity index 61% rename from apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SequencerPruningIntegrationTest.scala rename to apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/PruningIntegrationTest.scala index 9cfab42314..3aed2450de 100644 --- a/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/SequencerPruningIntegrationTest.scala +++ b/apps/app/src/test/scala/org/lfdecentralizedtrust/splice/integration/tests/PruningIntegrationTest.scala @@ -1,21 +1,31 @@ package org.lfdecentralizedtrust.splice.integration.tests -import org.lfdecentralizedtrust.splice.config.{ConfigTransforms, ParticipantClientConfig} +import com.digitalasset.canton.admin.api.client.data.PruningSchedule +import com.digitalasset.canton.config.CantonRequireTypes.InstanceName +import com.digitalasset.canton.config.RequireTypes.Port +import com.digitalasset.canton.config.{ + FullClientConfig, + NonNegativeFiniteDuration, + PositiveDurationSeconds, +} +import com.digitalasset.canton.logging.SuppressionRule +import com.digitalasset.canton.util.ShowUtil.* +import org.lfdecentralizedtrust.splice.config.{ + ConfigTransforms, + ParticipantClientConfig, + PruningConfig, +} import org.lfdecentralizedtrust.splice.console.ValidatorAppBackendReference +import org.lfdecentralizedtrust.splice.store.AppStoreWithIngestion.SpliceLedgerConnectionPriority.Low import org.lfdecentralizedtrust.splice.sv.automation.singlesv.SequencerPruningTrigger import org.lfdecentralizedtrust.splice.sv.config.SequencerPruningConfig import org.lfdecentralizedtrust.splice.util.{ProcessTestUtil, WalletTestUtil} import org.lfdecentralizedtrust.splice.validator.automation.ReconcileSequencerConnectionsTrigger -import com.digitalasset.canton.config.CantonRequireTypes.InstanceName -import com.digitalasset.canton.config.{FullClientConfig, NonNegativeFiniteDuration} -import com.digitalasset.canton.config.RequireTypes.Port -import com.digitalasset.canton.logging.SuppressionRule -import com.digitalasset.canton.util.ShowUtil.* import org.slf4j.event.Level import scala.concurrent.duration.* -class SequencerPruningIntegrationTest +class PruningIntegrationTest extends SvIntegrationTestBase with WalletTestUtil with ProcessTestUtil { @@ -52,31 +62,70 @@ class SequencerPruningIntegrationTest )(config), (_, config) => config.copy( - validatorApps = config.validatorApps + ( - InstanceName.tryCreate("bobValidatorLocal") -> { - val bobValidatorConfig = config - .validatorApps(InstanceName.tryCreate("bobValidator")) - bobValidatorConfig - .copy( - participantClient = ParticipantClientConfig( - FullClientConfig(port = Port.tryCreate(5902)), - bobValidatorConfig.participantClient.ledgerApi.copy( - clientConfig = - bobValidatorConfig.participantClient.ledgerApi.clientConfig.copy( - port = Port.tryCreate(5901) - ) - ), - ), - // We disable the ReconcileSequencerConnectionsTrigger to prevent domain disconnections - // from interfering with traffic top-ups (see #14474) - automation = bobValidatorConfig.automation - .withPausedTrigger[ReconcileSequencerConnectionsTrigger], + validatorApps = + config.validatorApps.updatedWith(InstanceName.tryCreate("sv1Validator")) { + _.map { config => + config.copy( + // schedule needs to be defined to activate participant pruning + participantPruningSchedule = Some( + PruningConfig( + "0 /1 * * * ?", + PositiveDurationSeconds.tryFromDuration(1.seconds), + PositiveDurationSeconds.tryFromDuration(1.seconds), + ) + ) ) - } - ) + } + } + ( + InstanceName.tryCreate("bobValidatorLocal") -> { + val bobValidatorConfig = config + .validatorApps(InstanceName.tryCreate("bobValidator")) + bobValidatorConfig + .copy( + participantClient = ParticipantClientConfig( + FullClientConfig(port = Port.tryCreate(5902)), + bobValidatorConfig.participantClient.ledgerApi.copy( + clientConfig = + bobValidatorConfig.participantClient.ledgerApi.clientConfig.copy( + port = Port.tryCreate(5901) + ) + ), + ), + // We disable the ReconcileSequencerConnectionsTrigger to prevent domain disconnections + // from interfering with traffic top-ups (see #14474) + automation = bobValidatorConfig.automation + .withPausedTrigger[ReconcileSequencerConnectionsTrigger], + ) + } + ) ), ) + "participant can be pruned" should { + + "when configured, sv1 participant prunes every minute" in { implicit env => + initDsoWithSv1Only() + + clue("Check sv1 participant has the expected smallest pruning schedule") { + sv1ValidatorBackend.participantClient.pruning.get_schedule() shouldBe Some( + PruningSchedule( + "0 /1 * * * ?", + PositiveDurationSeconds.tryFromDuration(1.seconds), + PositiveDurationSeconds.tryFromDuration(1.seconds), + ) + ) + } + + eventually(timeUntilSuccess = 70.seconds) { + sv1Backend.svAutomation + .connection(Low) + // returns 0 when participant pruning is disabled + .latestPrunedOffset() + .futureValue should be > 0L + } + } + } + "sequencer can be pruned even if a participant is down" in { implicit env => clue("Initialize DSO with 2 SVs") { startAllSync( @@ -139,5 +188,4 @@ class SequencerPruningIntegrationTest timeUntilSuccess = 3.minutes, ) } - } diff --git a/test-full-class-names.log b/test-full-class-names.log index 0848e8ab08..e704225822 100644 --- a/test-full-class-names.log +++ b/test-full-class-names.log @@ -17,6 +17,7 @@ org.lfdecentralizedtrust.splice.integration.tests.FeaturedAppActivityMarkerInteg org.lfdecentralizedtrust.splice.integration.tests.GcpBucketPeriodicBackupIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.MemberTrafficIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.ParticipantPlaintextIdentitiesIntegrationTest +org.lfdecentralizedtrust.splice.integration.tests.PruningIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.RecoverExternalPartyIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.RewardExpiryIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.ScanConnectionIntegrationTest @@ -24,7 +25,6 @@ org.lfdecentralizedtrust.splice.integration.tests.ScanEventHistoryIntegrationTes org.lfdecentralizedtrust.splice.integration.tests.ScanHistoryBackfillingIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.ScanIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.ScanTxLogOwnerExpireLockIntegrationTest -org.lfdecentralizedtrust.splice.integration.tests.SequencerPruningIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.SplitwellIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.SplitwellUpgradeIntegrationTest org.lfdecentralizedtrust.splice.integration.tests.SvDevNetReonboardingIntegrationTest