mirror of
https://github.com/digital-asset/daml.git
synced 2024-09-20 01:07:18 +03:00
update canton to 20231124.11584.0.v33f28bad/2.8.0-snapshot.20231124.11584.0.v33f28bad (#17911)
CHANGELOG_BEGIN CHANGELOG_END Co-authored-by: Azure Pipelines Daml Build <support@digitalasset.com>
This commit is contained in:
parent
5775dc1fd5
commit
9c85632f62
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
sandbox-options:
|
||||
- --wall-clock-time
|
||||
name: contact
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
sandbox-options:
|
||||
- --wall-clock-time
|
||||
name: message
|
||||
|
@ -55,6 +55,7 @@ final case class DomainTopologyTransactionMessage private (
|
||||
domainId,
|
||||
notSequencedAfter,
|
||||
hashOps,
|
||||
representativeProtocolVersion,
|
||||
)
|
||||
|
||||
private[messages] def toProtoV0: v0.DomainTopologyTransactionMessage =
|
||||
@ -127,7 +128,15 @@ object DomainTopologyTransactionMessage
|
||||
ProtoVersion(1) -> VersionedProtoConverter(ProtocolVersion.v5)(
|
||||
v1.DomainTopologyTransactionMessage
|
||||
)(
|
||||
supportedProtoVersion(_)(fromProtoV1),
|
||||
supportedProtoVersion(_)(fromProtoV1(ProtoVersion(1))),
|
||||
_.toProtoV1.toByteString,
|
||||
),
|
||||
// use separate ProtoVersion starting with v6 to allow different hashing
|
||||
// scheme for protocol version 5 and 6
|
||||
ProtoVersion(2) -> VersionedProtoConverter(ProtocolVersion.v6)(
|
||||
v1.DomainTopologyTransactionMessage
|
||||
)(
|
||||
supportedProtoVersion(_)(fromProtoV1(ProtoVersion(2))),
|
||||
_.toProtoV1.toByteString,
|
||||
),
|
||||
)
|
||||
@ -144,17 +153,38 @@ object DomainTopologyTransactionMessage
|
||||
domainId: DomainId,
|
||||
notSequencedAfter: Option[CantonTimestamp],
|
||||
hashOps: HashOps,
|
||||
representativeProtocolVersion: RepresentativeProtocolVersion[
|
||||
DomainTopologyTransactionMessage.type
|
||||
],
|
||||
): Hash = {
|
||||
val builder = hashOps
|
||||
.build(HashPurpose.DomainTopologyTransactionMessageSignature)
|
||||
.add(domainId.toProtoPrimitive)
|
||||
|
||||
notSequencedAfter.foreach { ts =>
|
||||
builder.add(ts.toEpochMilli)
|
||||
val version = representativeProtocolVersion.representative
|
||||
notSequencedAfter match {
|
||||
case Some(ts) if version == ProtocolVersion.v5 =>
|
||||
builder.add(ts.toEpochMilli).discard
|
||||
case Some(ts) if version >= ProtocolVersion.v6 =>
|
||||
builder
|
||||
.add(version.toProtoPrimitive)
|
||||
.add(ts.toMicros)
|
||||
.add(transactions.length)
|
||||
.discard
|
||||
case Some(_) =>
|
||||
throw new IllegalStateException(
|
||||
"notSequencedAfter not expected for pv < 5"
|
||||
)
|
||||
case None if version >= ProtocolVersion.v5 =>
|
||||
// Won't happen because of the invariant
|
||||
throw new IllegalStateException(
|
||||
"notSequencedAfter must be present for protocol version >= 5"
|
||||
)
|
||||
case None =>
|
||||
}
|
||||
|
||||
transactions.foreach(elem => builder.add(elem.getCryptographicEvidence))
|
||||
builder.finish()
|
||||
|
||||
}
|
||||
|
||||
def create(
|
||||
@ -170,14 +200,16 @@ object DomainTopologyTransactionMessage
|
||||
val notSequencedAfterUpdated =
|
||||
notSequencedAfterInvariant.orValue(notSequencedAfter, protocolVersion)
|
||||
|
||||
val representativeProtocolVersion = protocolVersionRepresentativeFor(protocolVersion)
|
||||
val hashToSign = hash(
|
||||
transactions,
|
||||
domainId,
|
||||
notSequencedAfterUpdated,
|
||||
syncCrypto.crypto.pureCrypto,
|
||||
representativeProtocolVersion,
|
||||
)
|
||||
|
||||
for {
|
||||
|
||||
signature <- syncCrypto.sign(hashToSign).leftMap(_.toString)
|
||||
domainTopologyTransactionMessageE = Either
|
||||
.catchOnly[IllegalArgumentException](
|
||||
@ -186,7 +218,7 @@ object DomainTopologyTransactionMessage
|
||||
transactions,
|
||||
notSequencedAfter = notSequencedAfterUpdated,
|
||||
domainId,
|
||||
)(protocolVersionRepresentativeFor(protocolVersion))
|
||||
)(representativeProtocolVersion)
|
||||
)
|
||||
.leftMap(_.getMessage)
|
||||
domainTopologyTransactionMessage <- EitherT.fromEither[Future](
|
||||
@ -233,7 +265,7 @@ object DomainTopologyTransactionMessage
|
||||
)(protocolVersionRepresentativeFor(ProtoVersion(0)))
|
||||
}
|
||||
|
||||
private[messages] def fromProtoV1(
|
||||
private[messages] def fromProtoV1(protoVersion: ProtoVersion)(
|
||||
message: v1.DomainTopologyTransactionMessage
|
||||
): ParsingResult[DomainTopologyTransactionMessage] = {
|
||||
val v1.DomainTopologyTransactionMessage(signature, domainId, timestamp, transactions) = message
|
||||
@ -253,7 +285,7 @@ object DomainTopologyTransactionMessage
|
||||
succeededContent,
|
||||
notSequencedAfter = Some(notSequencedAfter),
|
||||
DomainId(domainUid),
|
||||
)(protocolVersionRepresentativeFor(ProtoVersion(1)))
|
||||
)(protocolVersionRepresentativeFor(protoVersion))
|
||||
}
|
||||
|
||||
override def name: String = "DomainTopologyTransactionMessage"
|
||||
|
@ -204,7 +204,7 @@ object EnvelopeContent extends HasProtocolVersionedWithContextCompanion[Envelope
|
||||
case Content.InformeeMessage(messageP) =>
|
||||
InformeeMessage.fromProtoV1(hashOps)(messageP)
|
||||
case Content.DomainTopologyTransactionMessage(messageP) =>
|
||||
DomainTopologyTransactionMessage.fromProtoV1(messageP)
|
||||
DomainTopologyTransactionMessage.fromProtoV1(ProtoVersion(1))(messageP)
|
||||
case Content.EncryptedViewMessage(messageP) =>
|
||||
EncryptedViewMessageV1.fromProto(messageP)
|
||||
case Content.SignedMessage(messageP) =>
|
||||
@ -233,7 +233,7 @@ object EnvelopeContent extends HasProtocolVersionedWithContextCompanion[Envelope
|
||||
case Content.InformeeMessage(messageP) =>
|
||||
InformeeMessage.fromProtoV1(hashOps)(messageP)
|
||||
case Content.DomainTopologyTransactionMessage(messageP) =>
|
||||
DomainTopologyTransactionMessage.fromProtoV1(messageP)
|
||||
DomainTopologyTransactionMessage.fromProtoV1(ProtoVersion(2))(messageP)
|
||||
case Content.EncryptedViewMessage(messageP) =>
|
||||
EncryptedViewMessageV2.fromProto(messageP)
|
||||
case Content.SignedMessage(messageP) =>
|
||||
@ -263,7 +263,7 @@ object EnvelopeContent extends HasProtocolVersionedWithContextCompanion[Envelope
|
||||
case Content.InformeeMessage(messageP) =>
|
||||
InformeeMessage.fromProtoV1(hashOps)(messageP)
|
||||
case Content.DomainTopologyTransactionMessage(messageP) =>
|
||||
DomainTopologyTransactionMessage.fromProtoV1(messageP)
|
||||
DomainTopologyTransactionMessage.fromProtoV1(ProtoVersion(2))(messageP)
|
||||
case Content.EncryptedViewMessage(messageP) =>
|
||||
EncryptedViewMessageV2.fromProto(messageP)
|
||||
case Content.TransferOutMediatorMessage(messageP) =>
|
||||
|
@ -212,7 +212,7 @@ abstract class RetryWithDelay(
|
||||
|
||||
case outcome =>
|
||||
// this will also log the exception in outcome
|
||||
val errorKind = retryable.retryOK(outcome, logger)
|
||||
val errorKind = retryable.retryOK(outcome, logger, Some(lastErrorKind))
|
||||
val retriesOfErrorKind = if (errorKind == lastErrorKind) retriesOfLastErrorKind else 0
|
||||
if (
|
||||
errorKind.maxRetries == Int.MaxValue || retriesOfErrorKind < errorKind.maxRetries
|
||||
@ -229,23 +229,20 @@ abstract class RetryWithDelay(
|
||||
directExecutionContext
|
||||
)
|
||||
} else {
|
||||
if (errorKind == lastErrorKind) {
|
||||
logger.trace(s"Kind of error has not changed since last attempt: $errorKind")
|
||||
} else {
|
||||
logger.info(messageOfOutcome(outcome, s"New kind of error: $errorKind."))
|
||||
// No need to log the exception in outcome, as this has been logged by retryable.retryOk.
|
||||
}
|
||||
|
||||
val level = retryLogLevel.getOrElse {
|
||||
if (totalRetries < complainAfterRetries || totalMaxRetries != Int.MaxValue)
|
||||
Level.INFO
|
||||
else Level.WARN
|
||||
}
|
||||
|
||||
val change = if (errorKind == lastErrorKind) {
|
||||
""
|
||||
} else {
|
||||
s"New kind of error: $errorKind. "
|
||||
}
|
||||
LoggerUtil.logAtLevel(
|
||||
level,
|
||||
messageOfOutcome(outcome, show"Retrying after $delay."),
|
||||
// No need to log the exception in outcome, as this has been logged by retryable.retryOk.
|
||||
messageOfOutcome(outcome, show"${change}Retrying after $delay."),
|
||||
// No need to log the exception in the outcome, as this has been logged by retryable.retryOk.
|
||||
)
|
||||
|
||||
val delayedF =
|
||||
@ -512,7 +509,7 @@ final case class When(
|
||||
else depends(res)(task, retryable)
|
||||
}(directExecutionContext)
|
||||
.recoverWith { case NonFatal(e) =>
|
||||
if (depends.isDefinedAt(e) && retryable.retryOK(Failure(e), logger).maxRetries > 0)
|
||||
if (depends.isDefinedAt(e) && retryable.retryOK(Failure(e), logger, None).maxRetries > 0)
|
||||
depends(e)(task, retryable)
|
||||
else fut
|
||||
}(directExecutionContext)
|
||||
|
@ -26,7 +26,7 @@ object RetryUtil {
|
||||
*
|
||||
* Also logs the embedded exception.
|
||||
*/
|
||||
def retryOK(outcome: Try[_], logger: TracedLogger)(implicit
|
||||
def retryOK(outcome: Try[_], logger: TracedLogger, lastErrorKind: Option[ErrorKind])(implicit
|
||||
tc: TraceContext
|
||||
): ErrorKind
|
||||
|
||||
@ -90,18 +90,39 @@ object RetryUtil {
|
||||
): Boolean = {
|
||||
// Don't retry forever on "contention" errors, as these may not actually be due to contention and get stuck
|
||||
// forever. Eg unique constraint violation exceptions can be caused by contention in H2 leading to data anomalies.
|
||||
DbExceptionRetryable.retryOK(Failure(error), logger).maxRetries == Int.MaxValue
|
||||
DbExceptionRetryable.retryOK(Failure(error), logger, None).maxRetries == Int.MaxValue
|
||||
}
|
||||
|
||||
@tailrec override def retryOK(outcome: Try[_], logger: TracedLogger)(implicit
|
||||
override def retryOK(
|
||||
outcome: Try[_],
|
||||
logger: TracedLogger,
|
||||
lastErrorKind: Option[ErrorKind],
|
||||
)(implicit
|
||||
tc: TraceContext
|
||||
): ErrorKind = {
|
||||
outcome match {
|
||||
case util.Success(_) => NoErrorKind
|
||||
case Failure(exception) =>
|
||||
case ff @ Failure(exception) =>
|
||||
val errorKind = retryOKInternal(ff, logger)
|
||||
// only log the full exception if the error kind changed such that we avoid spamming the logs
|
||||
if (!lastErrorKind.contains(errorKind)) {
|
||||
logThrowable(exception, logger)
|
||||
} else {
|
||||
logger.debug(
|
||||
s"Retrying on same error kind ${errorKind} for ${exception.getClass.getSimpleName}/${exception.getMessage}"
|
||||
)
|
||||
}
|
||||
errorKind
|
||||
}
|
||||
}
|
||||
|
||||
exception match {
|
||||
@tailrec private def retryOKInternal(
|
||||
outcome: Failure[_],
|
||||
logger: TracedLogger,
|
||||
)(implicit
|
||||
tc: TraceContext
|
||||
): ErrorKind = {
|
||||
outcome.exception match {
|
||||
case exn: java.util.concurrent.RejectedExecutionException =>
|
||||
// This occurs when slick's task queue is full
|
||||
|
||||
@ -201,7 +222,7 @@ object RetryUtil {
|
||||
TransientErrorKind
|
||||
} else if (ex.getCause != null) {
|
||||
logger.info("Unable to retry on exception, checking cause.")
|
||||
retryOK(Failure(ex.getCause), logger)
|
||||
retryOKInternal(Failure(ex.getCause), logger)
|
||||
} else {
|
||||
FatalErrorKind
|
||||
}
|
||||
@ -210,7 +231,6 @@ object RetryUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Retry on any exception.
|
||||
*
|
||||
@ -218,8 +238,8 @@ object RetryUtil {
|
||||
*/
|
||||
case object AllExnRetryable extends ExceptionRetryable {
|
||||
|
||||
override def retryOK(outcome: Try[_], logger: TracedLogger)(implicit
|
||||
tc: TraceContext
|
||||
override def retryOK(outcome: Try[_], logger: TracedLogger, lastErrorKind: Option[ErrorKind])(
|
||||
implicit tc: TraceContext
|
||||
): ErrorKind = {
|
||||
outcome.forFailed(t => logThrowable(t, logger))
|
||||
NoErrorKind
|
||||
@ -231,8 +251,8 @@ object RetryUtil {
|
||||
*/
|
||||
case object NoExnRetryable extends ExceptionRetryable {
|
||||
|
||||
override def retryOK(outcome: Try[_], logger: TracedLogger)(implicit
|
||||
tc: TraceContext
|
||||
override def retryOK(outcome: Try[_], logger: TracedLogger, lastErrorKind: Option[ErrorKind])(
|
||||
implicit tc: TraceContext
|
||||
): ErrorKind = outcome match {
|
||||
case Failure(ex) =>
|
||||
logThrowable(ex, logger)
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
build-options:
|
||||
- --target=1.14
|
||||
name: CantonExamples
|
||||
|
@ -60,8 +60,7 @@ trait DatabaseLimitNbParamTest
|
||||
rawStorage
|
||||
.update(query.asUpdate, "parameter limit query", maxRetries = 1)
|
||||
.transformWith { outcome =>
|
||||
val errorKind = DbExceptionRetryable.retryOK(outcome, logger)
|
||||
|
||||
val errorKind = DbExceptionRetryable.retryOK(outcome, logger, None)
|
||||
errorKind match {
|
||||
case FatalErrorKind =>
|
||||
case _ => fail("Database error kind should be fatal")
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: ai-analysis
|
||||
source: AIAnalysis.daml
|
||||
init-script: AIAnalysis:setup
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: bank
|
||||
source: Bank.daml
|
||||
init-script: Bank:setup
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: doctor
|
||||
source: Doctor.daml
|
||||
init-script: Doctor:setup
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: health-insurance
|
||||
source: HealthInsurance.daml
|
||||
init-script: HealthInsurance:setup
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: medical-records
|
||||
source: MedicalRecord.daml
|
||||
init-script: MedicalRecord:setup
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
build-options:
|
||||
- --target=1.14
|
||||
name: JsonEncodingTest
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
name: AdminWorkflows
|
||||
source: AdminWorkflows.daml
|
||||
version: 2.8.0
|
||||
|
@ -1,4 +1,4 @@
|
||||
sdk-version: 2.8.0-snapshot.20231118.12382.0.v86cb8054
|
||||
sdk-version: 2.8.0-snapshot.20231121.12391.0.v6eaf5081
|
||||
build-options:
|
||||
- --target=1.14
|
||||
name: AdminWorkflowsWithVacuuming
|
||||
|
@ -23,9 +23,9 @@ if [ "{local}" = "true" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
CANTON_ENTERPRISE_VERSION=2.8.0-snapshot.20231123.11580.0.v1dd021e2
|
||||
CANTON_ENTERPRISE_SHA=c43c76cdbb0aca589f13af54ef676cffd4e68e1f4a506cf9a5822bb94d9f1987
|
||||
CANTON_ENTERPRISE_URL=https://digitalasset.jfrog.io/artifactory/assembly/daml/canton-backup/2.8.0-snapshot.20231123.11580.0.v1dd021e2/c43c76cdbb0aca589f13af54ef676cffd4e68e1f4a506cf9a5822bb94d9f1987/canton-enterprise-2.8.0-snapshot.20231123.11580.0.v1dd021e2.tar.gz
|
||||
CANTON_ENTERPRISE_VERSION=2.8.0-snapshot.20231124.11584.0.v33f28bad
|
||||
CANTON_ENTERPRISE_SHA=543df892641b3c68b7f38d961c4404b5753b311cbf4cc3bf0b0d16f22d44a9a6
|
||||
CANTON_ENTERPRISE_URL=https://digitalasset.jfrog.io/artifactory/assembly/daml/canton-backup/2.8.0-snapshot.20231124.11584.0.v33f28bad/543df892641b3c68b7f38d961c4404b5753b311cbf4cc3bf0b0d16f22d44a9a6/canton-enterprise-2.8.0-snapshot.20231124.11584.0.v33f28bad.tar.gz
|
||||
|
||||
url=$$CANTON_ENTERPRISE_URL
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user