Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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 org.lfdecentralizedtrust.splice.config.{
ConfigTransforms,
ParticipantClientConfig,
PruningConfig,
}
import org.lfdecentralizedtrust.splice.console.ValidatorAppBackendReference
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.{
FullClientConfig,
NonNegativeFiniteDuration,
PositiveDurationSeconds,
}
import com.digitalasset.canton.config.RequireTypes.Port
import com.digitalasset.canton.logging.SuppressionRule
import com.digitalasset.canton.util.ShowUtil.*
import org.lfdecentralizedtrust.splice.store.AppStoreWithIngestion.SpliceLedgerConnectionPriority.Low
import org.slf4j.event.Level

import scala.concurrent.duration.*

class SequencerPruningIntegrationTest
class PruningIntegrationTest
extends SvIntegrationTestBase
with WalletTestUtil
with ProcessTestUtil {
Expand Down Expand Up @@ -52,31 +62,77 @@ 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],
)
svApps = config.svApps.updatedWith(InstanceName.tryCreate("sv1")) {
_.map { config =>
config.copy(acsCommitmentReconciliationInterval =
PositiveDurationSeconds.ofSeconds(15)
)
}
)
},
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(2.seconds),
PositiveDurationSeconds.tryFromDuration(5.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(2.seconds),
PositiveDurationSeconds.tryFromDuration(5.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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import org.lfdecentralizedtrust.splice.config.{
}
import org.lfdecentralizedtrust.splice.environment.{DarResource, DarResources}
import org.lfdecentralizedtrust.splice.sv.SvAppClientConfig
import org.lfdecentralizedtrust.splice.sv.util.SvUtil
import org.lfdecentralizedtrust.splice.util.SpliceUtil

import java.nio.file.Path
Expand Down Expand Up @@ -320,6 +321,8 @@ case class SvAppBackendConfig(
// Defaults to 24h to allow for 24h between preparation and execution of an externally signed transaction
preparationTimeRecordTimeTolerance: NonNegativeFiniteDuration =
NonNegativeFiniteDuration.ofHours(24),
acsCommitmentReconciliationInterval: PositiveDurationSeconds =
SvUtil.defaultAcsCommitmentReconciliationInterval,
// Defaults to 48h as it must be at least 2x preparationTimeRecordtimeTolerance
mediatorDeduplicationTimeout: NonNegativeFiniteDuration = NonNegativeFiniteDuration.ofHours(48),
// We want to be able to override this for simtime tests
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -466,7 +466,7 @@ class SV1Initializer(
val values = initialValues.tryUpdate(
trafficControlParameters = Some(initialTrafficControlParameters),
reconciliationInterval =
PositiveSeconds.fromConfig(SvUtil.defaultAcsCommitmentReconciliationInterval),
PositiveSeconds.fromConfig(config.acsCommitmentReconciliationInterval),
acsCommitmentsCatchUp = Some(SvUtil.defaultAcsCommitmentsCatchUpParameters),
preparationTimeRecordTimeTolerance =
NonNegativeFiniteDuration.fromConfig(config.preparationTimeRecordTimeTolerance),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ object SvUtil {
// (See #12107).
val defaultAcsCommitmentReconciliationInterval: PositiveDurationSeconds =
PositiveDurationSeconds.ofMinutes(30)

val defaultAcsCommitmentsCatchUpParameters: AcsCommitmentsCatchUpParameters =
AcsCommitmentsCatchUpParameters(
// With the default reconciliation interval of 30m this corresponds to a catchup interval of 30m * 24 = 12 hours.
Expand Down
2 changes: 1 addition & 1 deletion test-full-class-names.log
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ 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
org.lfdecentralizedtrust.splice.integration.tests.ScanEventHistoryIntegrationTest
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
Expand Down
Loading