Skip to content

Commit 99c652f

Browse files
azure-pipelines[bot]Azure Pipelines Daml Build
andauthored
update canton to 20250801.16556.v61d1aa2f (#21626)
tell-slack: canton Co-authored-by: Azure Pipelines Daml Build <[email protected]>
1 parent 58d734e commit 99c652f

File tree

71 files changed

+2582
-376
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

71 files changed

+2582
-376
lines changed

sdk/canton/community/app-base/src/main/scala/com/digitalasset/canton/admin/api/client/commands/SequencerBftPruningAdminCommands.scala

Lines changed: 108 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,14 @@
33

44
package com.digitalasset.canton.admin.api.client.commands
55

6+
import cats.syntax.either.*
67
import com.digitalasset.canton.admin.api.client.data.BftPruningStatus
8+
import com.digitalasset.canton.admin.pruning.v30.PruningSchedule
79
import com.digitalasset.canton.config.PositiveDurationSeconds
10+
import com.digitalasset.canton.sequencer.admin.v30
811
import com.digitalasset.canton.sequencer.admin.v30.SequencerBftPruningAdministrationServiceGrpc.SequencerBftPruningAdministrationServiceStub
9-
import com.digitalasset.canton.sequencer.admin.v30.{
10-
BftPruneRequest,
11-
BftPruneResponse,
12-
BftPruningStatusRequest,
13-
BftPruningStatusResponse,
14-
SequencerBftPruningAdministrationServiceGrpc,
15-
}
12+
import com.digitalasset.canton.sequencer.admin.v30.SetMinBlocksToKeepResponse
13+
import com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.BftOrdererPruningSchedule
1614
import com.digitalasset.canton.synchronizer.sequencer.block.bftordering.framework.data.BftOrderingIdentifiers.{
1715
BlockNumber,
1816
EpochNumber,
@@ -31,50 +29,138 @@ object SequencerBftPruningAdminCommands {
3129
override def createService(
3230
channel: ManagedChannel
3331
): SequencerBftPruningAdministrationServiceStub =
34-
SequencerBftPruningAdministrationServiceGrpc.stub(channel)
32+
v30.SequencerBftPruningAdministrationServiceGrpc.stub(channel)
3533
}
3634

3735
final case class Prune(retention: PositiveDurationSeconds, minBlocksToKeep: Int)
3836
extends BaseSequencerBftAdministrationCommand[
39-
BftPruneRequest,
40-
BftPruneResponse,
37+
v30.BftPruneRequest,
38+
v30.BftPruneResponse,
4139
String,
4240
] {
4341

4442
override protected def submitRequest(
4543
service: SequencerBftPruningAdministrationServiceStub,
46-
request: BftPruneRequest,
47-
): Future[BftPruneResponse] = service.bftPrune(request)
44+
request: v30.BftPruneRequest,
45+
): Future[v30.BftPruneResponse] = service.bftPrune(request)
4846

49-
override protected def createRequest(): Either[String, BftPruneRequest] =
50-
Right(BftPruneRequest(Some(retention.toProtoPrimitive), minBlocksToKeep))
47+
override protected def createRequest(): Either[String, v30.BftPruneRequest] =
48+
Right(v30.BftPruneRequest(Some(retention.toProtoPrimitive), minBlocksToKeep))
5149

52-
override protected def handleResponse(response: BftPruneResponse): Either[String, String] =
50+
override protected def handleResponse(response: v30.BftPruneResponse): Either[String, String] =
5351
Right(response.message)
5452
}
5553

5654
final case class Status()
5755
extends BaseSequencerBftAdministrationCommand[
58-
BftPruningStatusRequest,
59-
BftPruningStatusResponse,
56+
v30.BftPruningStatusRequest,
57+
v30.BftPruningStatusResponse,
6058
BftPruningStatus,
6159
] {
6260

6361
override protected def submitRequest(
6462
service: SequencerBftPruningAdministrationServiceStub,
65-
request: BftPruningStatusRequest,
66-
): Future[BftPruningStatusResponse] =
63+
request: v30.BftPruningStatusRequest,
64+
): Future[v30.BftPruningStatusResponse] =
6765
service.bftPruningStatus(request)
6866

69-
override protected def createRequest(): Either[String, BftPruningStatusRequest] = Right(
70-
BftPruningStatusRequest()
67+
override protected def createRequest(): Either[String, v30.BftPruningStatusRequest] = Right(
68+
v30.BftPruningStatusRequest()
7169
)
7270

7371
override protected def handleResponse(
74-
response: BftPruningStatusResponse
72+
response: v30.BftPruningStatusResponse
7573
): Either[String, BftPruningStatus] = Right(
7674
BftPruningStatus(EpochNumber(response.lowerBoundEpoch), BlockNumber(response.lowerBoundBlock))
7775
)
7876
}
7977

78+
final case class SetBftSchedule(
79+
cron: String,
80+
maxDuration: PositiveDurationSeconds,
81+
retention: PositiveDurationSeconds,
82+
minBlocksToKeep: Int,
83+
) extends BaseSequencerBftAdministrationCommand[
84+
v30.SetBftScheduleRequest,
85+
v30.SetBftScheduleResponse,
86+
Unit,
87+
] {
88+
override protected def createRequest(): Right[String, v30.SetBftScheduleRequest] =
89+
Right(
90+
v30.SetBftScheduleRequest(
91+
Some(
92+
v30.BftOrdererPruningSchedule(
93+
Some(
94+
PruningSchedule(
95+
cron,
96+
Some(maxDuration.toProtoPrimitive),
97+
Some(retention.toProtoPrimitive),
98+
)
99+
),
100+
minBlocksToKeep,
101+
)
102+
)
103+
)
104+
)
105+
106+
override protected def submitRequest(
107+
service: Svc,
108+
request: v30.SetBftScheduleRequest,
109+
): Future[v30.SetBftScheduleResponse] =
110+
service.setBftSchedule(request)
111+
112+
override protected def handleResponse(
113+
response: v30.SetBftScheduleResponse
114+
): Either[String, Unit] =
115+
response match {
116+
case v30.SetBftScheduleResponse() => Either.unit
117+
}
118+
}
119+
120+
final case class GetBftSchedule()
121+
extends BaseSequencerBftAdministrationCommand[
122+
v30.GetBftScheduleRequest,
123+
v30.GetBftScheduleResponse,
124+
Option[BftOrdererPruningSchedule],
125+
] {
126+
override protected def createRequest(): Right[String, v30.GetBftScheduleRequest] = Right(
127+
v30.GetBftScheduleRequest()
128+
)
129+
130+
override protected def submitRequest(
131+
service: Svc,
132+
request: v30.GetBftScheduleRequest,
133+
): Future[v30.GetBftScheduleResponse] =
134+
service.getBftSchedule(request)
135+
136+
override protected def handleResponse(
137+
response: v30.GetBftScheduleResponse
138+
): Either[String, Option[BftOrdererPruningSchedule]] =
139+
response.schedule.fold(
140+
Right(None): Either[String, Option[BftOrdererPruningSchedule]]
141+
)(BftOrdererPruningSchedule.fromProtoV30(_).bimap(_.message, Some(_)))
142+
}
143+
144+
final case class SetMinBlocksToKeep(
145+
minBlocksToKeep: Int
146+
) extends BaseSequencerBftAdministrationCommand[
147+
v30.SetMinBlocksToKeepRequest,
148+
v30.SetMinBlocksToKeepResponse,
149+
Unit,
150+
] {
151+
override protected def createRequest(): Right[String, v30.SetMinBlocksToKeepRequest] =
152+
Right(v30.SetMinBlocksToKeepRequest(minBlocksToKeep))
153+
154+
override protected def submitRequest(
155+
service: Svc,
156+
request: v30.SetMinBlocksToKeepRequest,
157+
): Future[SetMinBlocksToKeepResponse] = service.setMinBlocksToKeep(request)
158+
159+
override protected def handleResponse(
160+
response: SetMinBlocksToKeepResponse
161+
): Either[String, Unit] =
162+
response match {
163+
case v30.SetMinBlocksToKeepResponse() => Either.unit
164+
}
165+
}
80166
}

sdk/canton/community/app-base/src/main/scala/com/digitalasset/canton/config/CantonConfig.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -998,9 +998,6 @@ object CantonConfig {
998998
lazy implicit val bftBlockOrdererP2PNetworkConfigReader
999999
: ConfigReader[BftBlockOrdererConfig.P2PNetworkConfig] =
10001000
deriveReader[BftBlockOrdererConfig.P2PNetworkConfig]
1001-
lazy implicit val bftBlockOrdererPruningConfigReader
1002-
: ConfigReader[BftBlockOrdererConfig.PruningConfig] =
1003-
deriveReader[BftBlockOrdererConfig.PruningConfig]
10041001
lazy implicit val bftBlockOrdererLeaderSelectionPolicyHowLongToBlacklistConfigReader
10051002
: ConfigReader[BftBlockOrdererConfig.LeaderSelectionPolicyConfig.HowLongToBlacklist] =
10061003
deriveEnumerationReader[BftBlockOrdererConfig.LeaderSelectionPolicyConfig.HowLongToBlacklist]
@@ -1634,9 +1631,6 @@ object CantonConfig {
16341631
lazy implicit val bftBlockOrdererBftP2PNetworkConfigWriter
16351632
: ConfigWriter[BftBlockOrdererConfig.P2PNetworkConfig] =
16361633
deriveWriter[BftBlockOrdererConfig.P2PNetworkConfig]
1637-
lazy implicit val bftBlockOrdererPruningConfigWriter
1638-
: ConfigWriter[BftBlockOrdererConfig.PruningConfig] =
1639-
deriveWriter[BftBlockOrdererConfig.PruningConfig]
16401634
lazy implicit val bftBlockOrdererLeaderSelectionPolicyHowLongToBlacklistConfigWriter
16411635
: ConfigWriter[BftBlockOrdererConfig.LeaderSelectionPolicyConfig.HowLongToBlacklist] =
16421636
deriveEnumerationWriter[BftBlockOrdererConfig.LeaderSelectionPolicyConfig.HowLongToBlacklist]

sdk/canton/community/app-base/src/main/scala/com/digitalasset/canton/console/InstanceReference.scala

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import com.digitalasset.canton.admin.api.client.commands.*
77
import com.digitalasset.canton.admin.api.client.commands.SequencerAdminCommands.LocatePruningTimestampCommand
88
import com.digitalasset.canton.admin.api.client.data.topology.ListParticipantSynchronizerPermissionResult
99
import com.digitalasset.canton.admin.api.client.data.{
10-
BftPruningStatus,
1110
MediatorStatus,
1211
NodeStatus,
1312
ParticipantStatus,
@@ -1254,32 +1253,16 @@ abstract class SequencerReference(
12541253
runner.adminCommand(SequencerBftAdminCommands.SetPerformanceMetricsEnabled(false))
12551254
}
12561255

1257-
object pruning {
1258-
@Help.Summary(
1259-
"Prune the BFT Orderer layer based on the retention period and minimum blocks to keep specified"
1260-
)
1261-
@Help.Description(
1262-
"""Prunes the BFT Orderer layer based on the retention period and minimum blocks to keep specified
1263-
| returning a description of how the operation went."""
1264-
)
1265-
def prune(retention: PositiveDurationSeconds, minBlocksToKeep: Int): String =
1266-
consoleEnvironment.run {
1267-
runner.adminCommand(SequencerBftPruningAdminCommands.Prune(retention, minBlocksToKeep))
1268-
}
1256+
@Help.Summary("Commands to prune the sequencer's BFT Orderer", FeatureFlag.Preview)
1257+
@Help.Group("BFT Orderer Pruning")
1258+
def pruning: SequencerBftPruningAdministrationGroup = pruning_
12691259

1270-
@Help.Summary("Pruning status of the BFT Orderer")
1271-
@Help.Description(
1272-
"""Provides a detailed breakdown of information required for pruning:
1273-
| - TODO(i26216): the current time according to this sequencer instance
1274-
| - the lower bound inclusive epoch number it current supports serving from
1275-
| - the lower bound inclusive block number it current supports serving from
1276-
|"""
1260+
private lazy val pruning_ =
1261+
new SequencerBftPruningAdministrationGroup(
1262+
runner,
1263+
consoleEnvironment,
1264+
loggerFactory,
12771265
)
1278-
def status(): BftPruningStatus =
1279-
consoleEnvironment.run {
1280-
runner.adminCommand(SequencerBftPruningAdminCommands.Status())
1281-
}
1282-
}
12831266

12841267
private def toInternal(endpoint: BftBlockOrdererConfig.EndpointId): P2PEndpoint.Id =
12851268
P2PEndpoint.Id(endpoint.address, endpoint.port, endpoint.tls)
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package com.digitalasset.canton.console.commands
5+
6+
import com.digitalasset.canton.admin.api.client.commands.SequencerBftPruningAdminCommands.GetBftSchedule
7+
import com.digitalasset.canton.admin.api.client.commands.{
8+
PruningSchedulerCommands,
9+
SequencerBftPruningAdminCommands,
10+
}
11+
import com.digitalasset.canton.admin.api.client.data.BftPruningStatus
12+
import com.digitalasset.canton.config.PositiveDurationSeconds
13+
import com.digitalasset.canton.console.{
14+
AdminCommandRunner,
15+
ConsoleEnvironment,
16+
FeatureFlag,
17+
FeatureFlagFilter,
18+
Help,
19+
Helpful,
20+
}
21+
import com.digitalasset.canton.logging.NamedLoggerFactory
22+
import com.digitalasset.canton.sequencer.admin.v30.SequencerBftPruningAdministrationServiceGrpc
23+
import com.digitalasset.canton.sequencer.admin.v30.SequencerBftPruningAdministrationServiceGrpc.SequencerBftPruningAdministrationServiceStub
24+
import com.digitalasset.canton.synchronizer.sequencer.block.bftordering.core.modules.pruning.BftOrdererPruningSchedule
25+
26+
class SequencerBftPruningAdministrationGroup(
27+
runner: AdminCommandRunner,
28+
consoleEnvironment: ConsoleEnvironment,
29+
loggerFactory: NamedLoggerFactory,
30+
) extends PruningSchedulerAdministration(
31+
runner,
32+
consoleEnvironment,
33+
new PruningSchedulerCommands[SequencerBftPruningAdministrationServiceStub](
34+
SequencerBftPruningAdministrationServiceGrpc.stub,
35+
_.setSchedule(_),
36+
_.clearSchedule(_),
37+
_.setCron(_),
38+
_.setMaxDuration(_),
39+
_.setRetention(_),
40+
_.getSchedule(_),
41+
),
42+
loggerFactory,
43+
)
44+
with FeatureFlagFilter
45+
with Helpful {
46+
47+
@Help.Summary(
48+
"Prune the BFT Orderer layer based on the retention period and minimum blocks to keep specified"
49+
)
50+
@Help.Description(
51+
"""Prunes the BFT Orderer layer based on the retention period and minimum blocks to keep specified
52+
| returning a description of how the operation went."""
53+
)
54+
def prune(retention: PositiveDurationSeconds, minBlocksToKeep: Int): String =
55+
consoleEnvironment.run {
56+
runner.adminCommand(SequencerBftPruningAdminCommands.Prune(retention, minBlocksToKeep))
57+
}
58+
59+
@Help.Summary("Pruning status of the BFT Orderer")
60+
@Help.Description(
61+
"""Provides a detailed breakdown of information required for pruning:
62+
| - TODO(i26216): the current time according to this sequencer instance
63+
| - the lower bound inclusive epoch number it current supports serving from
64+
| - the lower bound inclusive block number it current supports serving from
65+
|"""
66+
)
67+
def status(): BftPruningStatus =
68+
consoleEnvironment.run {
69+
runner.adminCommand(SequencerBftPruningAdminCommands.Status())
70+
}
71+
72+
@Help.Summary(
73+
"Activate automatic pruning according to the specified schedule with bft-orderer-specific options."
74+
)
75+
@Help.Description(
76+
"""Refer to the ``set_schedule`` description for information about the "cron", "max_duration", and "retention"
77+
|parameters. The "min-blocks-to-keep" option refers to how many blocks should be kept at a minimum after the
78+
|pruning operation ends, even if fewer blocks would remain based on retention alone.
79+
"""
80+
)
81+
def set_bft_schedule(
82+
cron: String,
83+
maxDuration: PositiveDurationSeconds,
84+
retention: PositiveDurationSeconds,
85+
minBlocksToKeep: Int = BftOrdererPruningSchedule.DefaultMinNumberOfBlocksToKeep,
86+
): Unit =
87+
check(FeatureFlag.Preview) {
88+
consoleEnvironment.run(
89+
runner.adminCommand(
90+
SequencerBftPruningAdminCommands.SetBftSchedule(
91+
cron,
92+
maxDuration,
93+
retention,
94+
minBlocksToKeep,
95+
)
96+
)
97+
)
98+
}
99+
100+
@Help.Summary("Inspect the automatic, bft-orderer-specific pruning schedule.")
101+
@Help.Description(
102+
"""The schedule consists of a "cron" expression and "max_duration" and "retention" durations as described in the
103+
|``get_schedule`` command description. Additionally "min_blocks_to_keep" indicates how many blocks should be kept
104+
| at a minimum after the pruning operation ends, even if fewer blocks would remain based on retention alone.
105+
"""
106+
)
107+
def get_bft_schedule(): Option[BftOrdererPruningSchedule] =
108+
consoleEnvironment.run(
109+
runner.adminCommand(GetBftSchedule())
110+
)
111+
112+
@Help.Summary(
113+
"Set min-blocks-to-keep paramater of automatic pruning schedule for the bft orderer"
114+
)
115+
def set_min_blocks_to_keep(
116+
minBlocksToKeep: Int
117+
): Unit =
118+
check(FeatureFlag.Preview) {
119+
consoleEnvironment.run(
120+
runner.adminCommand(
121+
SequencerBftPruningAdminCommands.SetMinBlocksToKeep(
122+
minBlocksToKeep
123+
)
124+
)
125+
)
126+
}
127+
128+
}

sdk/canton/community/app/src/pack/examples/11-bft-sequencer/pruning.conf

Lines changed: 0 additions & 18 deletions
This file was deleted.

sdk/canton/community/app/src/test/daml/CantonLfDev/daml.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
sdk-version: 3.4.0-snapshot.20250730.14042.0.v9209786d
1+
sdk-version: 3.4.0-snapshot.20250731.14044.0.v9ee36ae7
22
build-options:
33
- --target=2.dev
44
name: CantonLfDev

0 commit comments

Comments
 (0)