Skip to content
Merged
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
1,487 changes: 1 addition & 1,486 deletions UNRELEASED.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -1949,8 +1949,7 @@ object CantonConfig {
.foldLeft(c) { case (subConfig, (key, obj)) =>
subConfig.withValue(key, goVal(key, obj))
}
go(config)
.resolve()
go(config.resolve()) // Resolve the config _before_ redacting confidential information
.root()
.get("canton")
.render(CantonConfig.defaultConfigRenderer)
Expand Down
2 changes: 1 addition & 1 deletion community/app/src/test/daml/CantonLfDev/daml.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
sdk-version: 3.3.0-snapshot.20250415.13756.0.vafc5c867
sdk-version: 3.3.0-snapshot.20250502.13767.0.v2fc6c7e2
build-options:
- --target=2.dev
name: CantonLfDev
Expand Down
2 changes: 1 addition & 1 deletion community/app/src/test/daml/CantonLfV21/daml.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
sdk-version: 3.3.0-snapshot.20250415.13756.0.vafc5c867
sdk-version: 3.3.0-snapshot.20250502.13767.0.v2fc6c7e2
build-options:
- --target=2.1
- --enable-interfaces=yes
Expand Down
2 changes: 1 addition & 1 deletion community/app/src/test/daml/CantonTest/daml.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
sdk-version: 3.3.0-snapshot.20250415.13756.0.vafc5c867
sdk-version: 3.3.0-snapshot.20250502.13767.0.v2fc6c7e2
build-options:
- --target=2.1
name: CantonTests
Expand Down
2 changes: 1 addition & 1 deletion community/app/src/test/daml/CantonTestDev/daml.yaml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
sdk-version: 3.3.0-snapshot.20250415.13756.0.vafc5c867
sdk-version: 3.3.0-snapshot.20250502.13767.0.v2fc6c7e2
build-options:
- --target=2.dev
name: CantonTestsDev
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ trait SequencerOnboardingTombstoneTest
participant1.ledger_api.javaapi.commands.submit_async(
Seq(participant1.id.adminParty),
cycle,
commandId = "commandId",
commandId = "long-running-tx-id",
)

// Make sure that the participant's request has reached the sequencer
Expand Down Expand Up @@ -146,7 +146,7 @@ trait SequencerOnboardingTombstoneTest
loggerFactory.assertLogsUnorderedOptional(
{

clue("participant1 connects to sequencer2") {
clue("participant1 connects to sequencer2 the first time") {
participant1.synchronizers.reconnect_all(ignoreFailures = false)
}

Expand Down Expand Up @@ -248,7 +248,7 @@ trait SequencerOnboardingTombstoneTest
sequencer2.sequencerConnection.withAlias(SequencerAlias.tryCreate("seq2x")),
)

clue("participant1 connects to sequencer2") {
clue("participant1 connects to sequencer2 the second time") {
participant1.synchronizers.reconnect_all(ignoreFailures = false)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@ import com.digitalasset.canton.config
import com.digitalasset.canton.config.DbConfig
import com.digitalasset.canton.console.CommandFailure
import com.digitalasset.canton.console.commands.SynchronizerChoice
import com.digitalasset.canton.integration.plugins.{UseCommunityReferenceBlockSequencer, UseH2}
import com.digitalasset.canton.integration.plugins.{
UseCommunityReferenceBlockSequencer,
UseH2,
UsePostgres,
}
import com.digitalasset.canton.integration.{
CommunityIntegrationTest,
ConfigTransforms,
Expand Down Expand Up @@ -112,7 +116,7 @@ class SimpleFunctionalNodesTestH2 extends SimpleFunctionalNodesTest {
registerPlugin(new UseCommunityReferenceBlockSequencer[DbConfig.H2](loggerFactory))
}

//class SimpleFunctionalNodesTestPostgres extends SimpleFunctionalNodesTest {
// registerPlugin(new UsePostgres(loggerFactory))
// registerPlugin(new UseReferenceBlockSequencer[DbConfig.Postgres](loggerFactory))
//}
class SimpleFunctionalNodesTestPostgres extends SimpleFunctionalNodesTest {
registerPlugin(new UsePostgres(loggerFactory))
registerPlugin(new UseCommunityReferenceBlockSequencer[DbConfig.Postgres](loggerFactory))
}
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,13 @@ trait SequencerPruningIntegrationTest extends CommunityIntegrationTest with Shar
}

protected val pruningRegexWithTrafficPurchase =
"""Removed at least ([1-9]\d*) events, at least (\d+) payloads, at least ([1-9]\d*) counter checkpoints"""
"""Removed at least ([1-9]\d*) events, at least (\d+) payloads"""

protected val pruningRegex =
"""Removed at least ([1-9]\d*) events, at least (\d+) payloads, at least ([1-9]\d*) counter checkpoints"""
"""Removed at least ([1-9]\d*) events, at least (\d+) payloads"""

protected val pruningNothing =
"""Removed at least 0 events, at least 0 payloads, at least 0 counter checkpoints"""
"""Removed at least 0 events, at least 0 payloads"""

"prune only removes events up the point where all enabled clients have acknowledgements" in {
implicit env =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ import com.digitalasset.canton.sequencing.protocol.{
import com.digitalasset.canton.sequencing.traffic.TrafficReceipt
import com.digitalasset.canton.store.SequencedEventStore.{
LatestUpto,
OrdinarySequencedEvent,
PossiblyIgnoredSequencedEvent,
SequencedEventWithTraceContext,
}
import com.digitalasset.canton.synchronizer.sequencer.errors.SequencerError.InvalidAcknowledgementTimestamp
import com.digitalasset.canton.topology.MediatorGroup.MediatorGroupIndex
Expand Down Expand Up @@ -231,7 +231,7 @@ trait IgnoreSequencedEventsIntegrationTest extends CommunityIntegrationTest with
participant1.health.ping(participant1)
}

// TODO(#11834): Ignoring future events is incompatible with the counter based event ignoring/unignoring APIs,
// TODO(#25162): Ignoring future events is incompatible with the counter based event ignoring/unignoring APIs,
// because the future timestamp are unknown unlike the counters. Need to consider and implement
// a new timestamp-based API for the use case of ignoring future events, should it still be necessary.
"insert an empty ignored event, therefore ignore the next ping and then successfully ping again" ignore {
Expand Down Expand Up @@ -305,8 +305,7 @@ trait IgnoreSequencedEventsIntegrationTest extends CommunityIntegrationTest with
// Choose DeliverError as type of tampered event, because we don't expect DeliverErrors to be stored
// as part of the previous tests.
val tamperedEvent = DeliverError.create(
lastStoredEvent.counter,
None, // TODO(#11834): Make sure that ignored sequenced events works with previous timestamps
None,
lastStoredEvent.timestamp,
daId,
MessageId.tryCreate("schnitzel"),
Expand All @@ -315,7 +314,7 @@ trait IgnoreSequencedEventsIntegrationTest extends CommunityIntegrationTest with
Option.empty[TrafficReceipt],
)
val tracedSignedTamperedEvent =
OrdinarySequencedEvent(lastEvent.copy(content = tamperedEvent))(traceContext)
SequencedEventWithTraceContext(lastEvent.copy(content = tamperedEvent))(traceContext)

// Replace last event by the tamperedEvent
val p1Node = participant1.underlying.value
Expand Down Expand Up @@ -504,7 +503,7 @@ trait IgnoreSequencedEventsIntegrationTest extends CommunityIntegrationTest with
participant1.repair.ignore_events(
daId,
lastRequestSequencerCounter,
// TODO(#11834): This ignores the future event, which is incompatible with previous timestamps.
// TODO(#25162): This ignores the future event, which is incompatible with previous timestamps.
// The test work probably because the result message is ignored without prior confirmation request.
// Need to check if that is good enough and if we don't need to extend event ignoring API
// to support ignoring "future" timestamps.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,6 @@ abstract class DynamicOnboardingIntegrationTest(val name: String)
_,
_,
_,
_,
SequencerErrors.AggregateSubmissionAlreadySent(message),
_,
)
Expand All @@ -352,7 +351,7 @@ abstract class DynamicOnboardingIntegrationTest(val name: String)
)
logEntry.warningMessage should (
include(
"This sequencer cannot sign the event with counter"
"This sequencer cannot sign the event with sequencing timestamp"
) and
include(
"for member PAR::participant3"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,19 +62,19 @@ class ReferenceSequencerPruningIntegrationTest extends SequencerPruningIntegrati

override protected val pruningRegex: String =
"""Removed ([1-9]\d*) blocks
|Removed at least ([1-9]\d*) events, at least (\d+) payloads, at least ([1-9]\d*) counter checkpoints
|Removed at least ([1-9]\d*) events, at least (\d+) payloads
|Removed ([0-9]\d*) traffic purchased entries
|Removed ([1-9]\d*) traffic consumed entries""".stripMargin

override protected val pruningNothing: String =
"""Removed 0 blocks
|Removed at least 0 events, at least 0 payloads, at least 0 counter checkpoints
|Removed at least 0 events, at least 0 payloads
|Removed 0 traffic purchased entries
|Removed 0 traffic consumed entries""".stripMargin

override protected val pruningRegexWithTrafficPurchase =
"""Removed ([1-9]\d*) blocks
|Removed at least ([1-9]\d*) events, at least (\d+) payloads, at least ([1-9]\d*) counter checkpoints
|Removed at least ([1-9]\d*) events, at least (\d+) payloads
|Removed ([1-9]\d*) traffic purchased entries
|Removed ([1-9]\d*) traffic consumed entries""".stripMargin
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ import com.digitalasset.canton.{
FailOnShutdown,
MockedNodeParameters,
ProtocolVersionChecksFixtureAsyncWordSpec,
SequencerCounter,
}
import org.apache.pekko.actor.ActorSystem
import org.apache.pekko.stream.Materializer
Expand Down Expand Up @@ -611,7 +610,7 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
messages2 <- readForMembers(
List(sender, p11),
sequencer,
firstSequencerCounter = SequencerCounter.Genesis + 1,
startTimestamp = firstEventTimestamp(p11)(messages1).map(_.immediateSuccessor),
)
senderLive3 <- getStateFor(sender, sequencer)
_ =
Expand All @@ -624,10 +623,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
Seq(
// Receipt to sender for message1
EventDetails(
SequencerCounter.Genesis,
sender,
Some(request1.messageId),
Some(
previousTimestamp = None,
to = sender,
messageId = Some(request1.messageId),
trafficReceipt = Some(
TrafficReceipt(
consumedCost = NonNegativeLong.tryCreate(messageContent.length.toLong),
extraTrafficConsumed = NonNegativeLong.tryCreate(messageContent.length.toLong),
Expand All @@ -637,10 +636,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
),
// Event to p11 recipient
EventDetails(
SequencerCounter.Genesis,
p11,
None,
Option.empty[TrafficReceipt],
previousTimestamp = None,
to = p11,
messageId = None,
trafficReceipt = Option.empty[TrafficReceipt],
EnvelopeDetails(messageContent, Recipients.cc(p11)),
),
),
Expand All @@ -651,10 +650,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
Seq(
// Receipt to sender for message2
EventDetails(
SequencerCounter.Genesis + 1,
sender,
Some(request2.messageId),
Some(
previousTimestamp = messages1.headOption.map(_._2.timestamp),
to = sender,
messageId = Some(request2.messageId),
trafficReceipt = Some(
TrafficReceipt(
consumedCost = NonNegativeLong.tryCreate(messageContent2.length.toLong),
extraTrafficConsumed = NonNegativeLong.tryCreate(
Expand All @@ -666,10 +665,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
),
// Event to p11 recipient
EventDetails(
SequencerCounter.Genesis + 1,
p11,
None,
Option.empty[TrafficReceipt],
previousTimestamp = messages1.lastOption.map(_._2.timestamp),
to = p11,
messageId = None,
trafficReceipt = Option.empty[TrafficReceipt],
EnvelopeDetails(messageContent2, Recipients.cc(p11)),
),
),
Expand Down Expand Up @@ -812,10 +811,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
checkMessages(
Seq(
EventDetails(
SequencerCounter.Genesis,
sender,
Some(request1.messageId),
Some(
previousTimestamp = None,
to = sender,
messageId = Some(request1.messageId),
trafficReceipt = Some(
TrafficReceipt(
consumedCost = NonNegativeLong.tryCreate(messageContent.length.toLong),
extraTrafficConsumed = NonNegativeLong.tryCreate(messageContent.length.toLong),
Expand All @@ -824,17 +823,17 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
),
),
EventDetails(
SequencerCounter.Genesis,
p11,
None,
None,
previousTimestamp = None,
to = p11,
messageId = None,
trafficReceipt = None,
EnvelopeDetails(messageContent, recipients),
),
EventDetails(
SequencerCounter.Genesis,
p12,
None,
None,
previousTimestamp = None,
to = p12,
messageId = None,
trafficReceipt = None,
EnvelopeDetails(messageContent, recipients),
),
),
Expand Down Expand Up @@ -964,7 +963,7 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
messages2 <- readForMembers(
Seq(sender),
sequencer,
firstSequencerCounter = SequencerCounter(1),
startTimestamp = firstEventTimestamp(sender)(messages).map(_.immediateSuccessor),
)
} yield {
// First message should be rejected with and OutdatedEventCost error
Expand All @@ -984,10 +983,10 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
checkMessages(
Seq(
EventDetails(
SequencerCounter(1),
sender,
Some(request.messageId),
Some(
previousTimestamp = messages.headOption.map(_._2.timestamp),
to = sender,
messageId = Some(request.messageId),
trafficReceipt = Some(
TrafficReceipt(
consumedCost = NonNegativeLong.tryCreate(messageContent.length.toLong),
extraTrafficConsumed =
Expand Down Expand Up @@ -1118,17 +1117,18 @@ abstract class ReferenceSequencerWithTrafficControlApiTestBase
checkMessages(
Seq(
EventDetails(
SequencerCounter.Genesis,
sender,
Some(request.messageId),
Option.empty[TrafficReceipt], // Sequencers are not subject to traffic control, so even in their deliver receipt there's not traffic receipt
previousTimestamp = None,
to = sender,
messageId = Some(request.messageId),
trafficReceipt =
Option.empty[TrafficReceipt], // Sequencers are not subject to traffic control, so even in their deliver receipt there's not traffic receipt
EnvelopeDetails(messageContent, recipients),
),
EventDetails(
SequencerCounter.Genesis,
p11,
None,
None,
previousTimestamp = None,
to = p11,
messageId = None,
trafficReceipt = None,
EnvelopeDetails(messageContent, recipients),
),
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,7 @@ message CompressedBatch {
message SequencedEvent {
option (scalapb.message).companion_extends = "com.digitalasset.canton.version.StableProtoVersion";

// A sequence number for all events emitted to a subscriber. Starting at 0.
// The same event may have different counter values for different recipients.
int64 counter = 1;
reserved 1; // was the counter of the event, now unused

// The timestamp of the previous event of the member's event sequence.
// in microseconds of UTC time since Unix epoch
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,16 +121,6 @@ message TrafficControlErrorReason {

message SendAsyncResponse {}

message SubscriptionRequest {
option (scalapb.message).companion_extends = "com.digitalasset.canton.version.StableProtoVersion";

string member = 1;

// Indicates the next event to receive.
// If it refers to an event that has already been acknowledged, the sequencer may reject the request.
int64 counter = 2;
}

message SubscriptionRequestV2 {
option (scalapb.message).companion_extends = "com.digitalasset.canton.version.StableProtoVersion";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ trait Phase37Processor[RequestBatch] {
* aborts with an error.
*/
def processResult(
event: WithOpeningErrors[SignedContent[Deliver[DefaultOpenEnvelope]]]
counter: SequencerCounter,
event: WithOpeningErrors[SignedContent[Deliver[DefaultOpenEnvelope]]],
)(implicit
traceContext: TraceContext
): HandlerResult
Expand Down
Loading