Skip to content

Commit acc2835

Browse files
[release-line-3.4] Update 2026-01-13.21 (#423)
Reference commit: 6e82f37059
1 parent d4c8555 commit acc2835

File tree

150 files changed

+1444
-359
lines changed

Some content is hidden

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

150 files changed

+1444
-359
lines changed

UNRELEASED.md

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,7 @@ Template for a bigger topic
1515
#### Impact and Migration
1616

1717
### Minor Improvements
18-
- Protect the admin participant from self lock-out. It is now impossible for an admin to remove own admin rights or
19-
delete itself.
20-
- LedgerAPI ListKnownParties supports an optional prefix filter argument filterParty.
21-
The respective JSON API endpoint now additionally supports `identity-provider-id` as
22-
an optional argument, as well as `filter-party`.
18+
- improvement
2319

2420
### Preview Features
2521
- preview feature
@@ -58,7 +54,3 @@ Canton has been tested against the following versions of its dependencies:
5854
|----------------------------|----------------------------|
5955
| Java Runtime | JAVA_VERSION |
6056
| Postgres | POSTGRES_VERSION |
61-
62-
## Upgrade GRPC to 1.77.0
63-
64-
prevent report of CVE-2025-58057.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
3.4.10-SNAPSHOT
1+
3.4.11-SNAPSHOT

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ package com.digitalasset.canton.config
1111
import cats.data.Validated
1212
import cats.syntax.either.*
1313
import cats.syntax.functor.*
14+
import ch.qos.logback.classic.Level
1415
import com.daml.jwt.JwtTimestampLeeway
1516
import com.daml.metrics.api.MetricQualification
1617
import com.daml.metrics.{HistogramDefinition, MetricsFilterConfig}
@@ -525,6 +526,7 @@ final case class CantonConfig(
525526
sequencerNodeConfig.parameters.unsafeEnableOnlinePartyReplication,
526527
requestLimits = sequencerNodeConfig.publicApi.limits,
527528
maxAuthTokensPerMember = sequencerNodeConfig.publicApi.maxAuthTokensPerMember,
529+
progressSupervisor = sequencerNodeConfig.parameters.progressSupervisor,
528530
)
529531
}
530532

@@ -1226,6 +1228,21 @@ object CantonConfig {
12261228
deriveReader[ApiLoggingConfig]
12271229
implicit val gcLoggingConfigReader: ConfigReader[GCLoggingConfig] =
12281230
deriveReader[GCLoggingConfig]
1231+
implicit val logbackLogLevelReader: ConfigReader[Level] = (cur: ConfigCursor) =>
1232+
cur.asString.flatMap { s =>
1233+
Try {
1234+
Level.toLevel(s)
1235+
}.toOption match {
1236+
case Some(level) => Right(level)
1237+
case None =>
1238+
val failureReason =
1239+
CannotConvert(s, "ch.qos.logback.classic.Level", s"Log level is not valid: $s")
1240+
Left(ConfigReaderFailures(ConvertFailure(failureReason, cur)))
1241+
}
1242+
}
1243+
1244+
implicit val startupLoggingConfigReader: ConfigReader[StartupLoggingConfig] =
1245+
deriveReader[StartupLoggingConfig]
12291246
deriveReader[LoggingConfig]
12301247
}
12311248
deriveReader[MonitoringConfig]
@@ -1349,6 +1366,8 @@ object CantonConfig {
13491366
deriveReader[CantonFeatures]
13501367
lazy implicit final val cantonWatchdogConfigReader: ConfigReader[WatchdogConfig] =
13511368
deriveReader[WatchdogConfig]
1369+
lazy implicit final val progressSupervisorConfigReader: ConfigReader[ProgressSupervisorConfig] =
1370+
deriveReader[ProgressSupervisorConfig]
13521371

13531372
lazy implicit final val reportingLevelReader
13541373
: ConfigReader[StartupMemoryCheckConfig.ReportingLevel] =
@@ -1918,6 +1937,10 @@ object CantonConfig {
19181937
lazy implicit val loggingConfigWriter: ConfigWriter[LoggingConfig] = {
19191938
implicit val gcLoggingConfigWriter: ConfigWriter[GCLoggingConfig] =
19201939
deriveWriter[GCLoggingConfig]
1940+
implicit val logLevelConfigWriter: ConfigWriter[Level] = (value: Level) =>
1941+
ConfigValueFactory.fromAnyRef(value.levelStr)
1942+
implicit val startupLoggingConfigWriter: ConfigWriter[StartupLoggingConfig] =
1943+
deriveWriter[StartupLoggingConfig]
19211944
deriveWriter[LoggingConfig]
19221945
}
19231946
deriveWriter[MonitoringConfig]
@@ -2020,6 +2043,9 @@ object CantonConfig {
20202043
deriveWriter[CantonFeatures]
20212044
lazy implicit final val cantonWatchdogConfigWriter: ConfigWriter[WatchdogConfig] =
20222045
deriveWriter[WatchdogConfig]
2046+
lazy implicit final val cantonProgressSupervisorConfigWriter
2047+
: ConfigWriter[ProgressSupervisorConfig] =
2048+
deriveWriter[ProgressSupervisorConfig]
20232049

20242050
lazy implicit final val reportingLevelWriter
20252051
: ConfigWriter[StartupMemoryCheckConfig.ReportingLevel] =

community/app-base/src/main/scala/com/digitalasset/canton/metrics/MetricsRegistry.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import io.opentelemetry.api.OpenTelemetry
2929
import io.opentelemetry.api.metrics.Meter
3030
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer
3131
import io.opentelemetry.instrumentation.runtimemetrics.java8.*
32+
import io.opentelemetry.instrumentation.runtimemetrics.java8.internal.ExperimentalBufferPools
3233
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder
3334
import io.opentelemetry.sdk.metrics.`export`.{MetricExporter, MetricReader, PeriodicMetricReader}
3435
import io.opentelemetry.sdk.metrics.internal.state.MetricStorage
@@ -85,6 +86,7 @@ object MetricsConfig {
8586
memoryPools: Boolean = true,
8687
threads: Boolean = true,
8788
gc: Boolean = true,
89+
buffers: Boolean = true,
8890
) extends UniformCantonConfigValidation
8991

9092
object JvmMetrics {
@@ -98,6 +100,7 @@ object MetricsConfig {
98100
if (config.memoryPools) MemoryPools.registerObservers(openTelemetry).discard
99101
if (config.threads) Threads.registerObservers(openTelemetry).discard
100102
if (config.gc) GarbageCollector.registerObservers(openTelemetry).discard
103+
if (config.buffers) ExperimentalBufferPools.registerObservers(openTelemetry).discard
101104
}
102105
}
103106

community/app/src/main/scala/com/digitalasset/canton/CantonAppDriver.scala

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import cats.syntax.either.*
88
import ch.qos.logback.classic.{Logger, LoggerContext}
99
import ch.qos.logback.core.status.{ErrorStatus, Status, StatusListener, WarnStatus}
1010
import com.daml.nonempty.NonEmpty
11-
import com.digitalasset.canton.CantonAppDriver.installGCLogging
11+
import com.digitalasset.canton.CantonAppDriver.{installGCLogging, installStartupLoggingLevel}
1212
import com.digitalasset.canton.buildinfo.BuildInfo
1313
import com.digitalasset.canton.cli.Command.Sandbox
1414
import com.digitalasset.canton.cli.{Cli, Command, LogFileAppender}
@@ -19,10 +19,11 @@ import com.digitalasset.canton.config.{
1919
DefaultPorts,
2020
GCLoggingConfig,
2121
Generate,
22+
StartupLoggingConfig,
2223
}
2324
import com.digitalasset.canton.discard.Implicits.DiscardOps
2425
import com.digitalasset.canton.environment.{Environment, EnvironmentFactory}
25-
import com.digitalasset.canton.logging.{NamedLoggerFactory, NamedLogging}
26+
import com.digitalasset.canton.logging.{NamedLoggerFactory, NamedLogging, NodeLoggingUtil}
2627
import com.digitalasset.canton.tracing.{NoTracing, TraceContext}
2728
import com.digitalasset.canton.util.JarResourceUtils
2829
import com.digitalasset.canton.version.ReleaseVersion
@@ -31,8 +32,8 @@ import com.typesafe.config.{Config, ConfigFactory}
3132
import org.slf4j.LoggerFactory
3233

3334
import java.lang.management.ManagementFactory
34-
import java.util.concurrent.TimeUnit
3535
import java.util.concurrent.atomic.{AtomicLong, AtomicReference}
36+
import java.util.concurrent.{ScheduledExecutorService, TimeUnit}
3637
import javax.management.openmbean.CompositeData
3738
import javax.management.{NotificationEmitter, NotificationListener}
3839
import scala.jdk.CollectionConverters.*
@@ -238,6 +239,11 @@ abstract class CantonAppDriver extends App with NamedLogging with NoTracing {
238239
Config.bootstrapFile.map(CantonScriptFromFile.apply)
239240

240241
val environment = environmentFactory.create(Config.startupConfig, loggerFactory)
242+
installStartupLoggingLevel(
243+
loggerFactory,
244+
Config.startupConfig.monitoring.logging.startup,
245+
environment.scheduler,
246+
)
241247
val runner: Runner = cliOptions.command match {
242248
case Some(Command.Sandbox) =>
243249
startupConfigFileMonitoring(environment)
@@ -356,4 +362,38 @@ object CantonAppDriver {
356362
}
357363
}
358364

365+
private def installStartupLoggingLevel(
366+
loggerFactory: NamedLoggerFactory,
367+
config: Option[StartupLoggingConfig],
368+
scheduler: ScheduledExecutorService,
369+
): Unit =
370+
config.foreach { startupLoggingConfig =>
371+
val logger = loggerFactory.getLogger(getClass)
372+
try {
373+
logger.info(
374+
s"Setting startup log level to ${startupLoggingConfig.logLevel} temporarily for ${startupLoggingConfig.resetAfter}"
375+
)
376+
NodeLoggingUtil.setLevel(
377+
level = startupLoggingConfig.logLevel.toString
378+
)
379+
scheduler.schedule(
380+
new Runnable {
381+
override def run(): Unit = {
382+
logger.info(
383+
s"Resetting log level to original ${NodeLoggingUtil.originalRootLoggerLevel}"
384+
)
385+
NodeLoggingUtil.setLevel(
386+
level = NodeLoggingUtil.originalRootLoggerLevel.toString
387+
)
388+
}
389+
},
390+
startupLoggingConfig.resetAfter.duration.toMillis,
391+
java.util.concurrent.TimeUnit.MILLISECONDS,
392+
)
393+
} catch {
394+
case NonFatal(e) =>
395+
logger.warn("Failed to setup startup logging level", e)
396+
}
397+
}
398+
359399
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
sdk-version: 3.3.0-snapshot.20250305.0
2-
build-options:
1+
sdk-version: 3.4.10
2+
build-options:
33
- --enable-interfaces=yes
44
name: model-tests
55
source: .
66
version: 1.0.0
7-
dependencies:
7+
dependencies:
88
- daml-prim
99
- daml-stdlib

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.10-snapshot.20251210.14372.0.v29f7da9c
1+
sdk-version: 3.4.10
22
build-options:
33
- --target=2.dev
44
name: CantonLfDev

community/app/src/test/daml/CantonLfV21/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.10-snapshot.20251210.14372.0.v29f7da9c
1+
sdk-version: 3.4.10
22
build-options:
33
- --target=2.2
44
- --enable-interfaces=yes

community/app/src/test/daml/CantonTest/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.10-snapshot.20251210.14372.0.v29f7da9c
1+
sdk-version: 3.4.10
22
build-options:
33
- --target=2.2
44
name: CantonTests

community/app/src/test/daml/CantonTestDev/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.10-snapshot.20251210.14372.0.v29f7da9c
1+
sdk-version: 3.4.10
22
build-options:
33
- --target=2.dev
44
name: CantonTestsDev

0 commit comments

Comments
 (0)