Add transaction statistics to completion info (#12224)

* Add transaction statistics to completion info

changelog_begin
changelog_end

* reformat
This commit is contained in:
Simon Maxen 2021-12-21 23:27:30 +00:00 committed by GitHub
parent dc6fdaaca9
commit 8f43c034ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 114 additions and 44 deletions

View File

@ -6,6 +6,7 @@ package com.daml.ledger.participant.state.v2
import com.daml.ledger.api.DeduplicationPeriod
import com.daml.ledger.configuration.Configuration
import com.daml.lf.data.Ref
import com.daml.lf.transaction.TransactionNodeStatistics
import com.daml.logging.entries.{LoggingValue, ToLoggingValue}
/** Collects context information for a submission.
@ -41,14 +42,15 @@ final case class SubmitterInfo(
/** The ID for the ledger change */
val changeId: ChangeId = ChangeId(applicationId, commandId, actAs.toSet)
def toCompletionInfo: CompletionInfo = CompletionInfo(
actAs,
applicationId,
commandId,
Some(deduplicationPeriod),
submissionId,
None, // TODO Ledger Metering
)
def toCompletionInfo(statistics: Option[TransactionNodeStatistics] = None): CompletionInfo =
CompletionInfo(
actAs,
applicationId,
commandId,
Some(deduplicationPeriod),
submissionId,
statistics,
)
}
object SubmitterInfo {

View File

@ -456,7 +456,7 @@ private final class SqlLedger(
.fold(
reason =>
ledgerDao.storeRejection(
completionInfo = Some(submitterInfo.toCompletionInfo),
completionInfo = Some(submitterInfo.toCompletionInfo()),
recordTime = recordTime,
offset = offset,
reason = reason.toStateRejectionReason(errorFactories)(errorLogger),
@ -468,7 +468,7 @@ private final class SqlLedger(
val blindingInfo = None
ledgerDao.storeTransaction(
completionInfo = Some(submitterInfo.toCompletionInfo),
completionInfo = Some(submitterInfo.toCompletionInfo()),
workflowId = transactionMeta.workflowId,
transactionId = transactionId,
ledgerEffectiveTime = transactionMeta.ledgerEffectiveTime,

View File

@ -61,48 +61,28 @@ da_scala_library(
da_scala_test_suite(
name = "sandbox-on-x-tests",
size = "small",
srcs = glob(["src/test/suite/**/*.scala"]),
data = [
"//ledger/test-common:model-tests.dar",
],
srcs = glob(
["src/test/suite/**/*.scala"],
),
data = [],
jvm_flags = [],
plugins = [],
resources = glob(["src/test/resources/**/*"]),
scala_deps = [
"@maven//:com_typesafe_akka_akka_actor",
"@maven//:com_typesafe_akka_akka_stream",
"@maven//:org_mockito_mockito_scala",
"@maven//:org_scalactic_scalactic",
"@maven//:org_scalatest_scalatest_core",
"@maven//:org_scalatest_scalatest_matchers_core",
"@maven//:org_scalatest_scalatest_shouldmatchers",
"@maven//:org_scalatest_scalatest_wordspec",
],
runtime_deps = [
"@maven//:ch_qos_logback_logback_classic",
"@maven//:ch_qos_logback_logback_core",
],
deps = [
":sandbox-on-x",
"//daml-lf/data",
"//daml-lf/engine",
"//language-support/scala/bindings",
"//ledger-api/rs-grpc-bridge",
"//ledger-api/testing-utils",
"//ledger/caching",
"//ledger/ledger-api-common",
"//daml-lf/transaction",
"//ledger/ledger-api-domain",
"//ledger/ledger-api-health",
"//ledger/ledger-resources",
"//ledger/ledger-resources:ledger-resources-test-lib",
"//ledger/metrics",
"//ledger/ledger-configuration",
"//ledger/ledger-offset",
"//ledger/participant-state",
"//ledger/participant-state/kvutils",
"//ledger/participant-state/kvutils:kvutils-tests-lib",
"//libs-scala/contextualized-logging",
"//libs-scala/resources",
"//libs-scala/resources-akka",
"//libs-scala/resources-grpc",
"@maven//:io_dropwizard_metrics_metrics_core",
"//libs-scala/logging-entries",
"@maven//:com_google_protobuf_protobuf_java",
"@maven//:org_mockito_mockito_core",
"@maven//:org_scalatest_scalatest_compatible",
],
)

View File

@ -12,7 +12,11 @@ import com.daml.ledger.configuration.Configuration
import com.daml.ledger.offset.Offset
import com.daml.ledger.participant.state.v2._
import com.daml.lf.data.{Ref, Time}
import com.daml.lf.transaction.{CommittedTransaction, SubmittedTransaction}
import com.daml.lf.transaction.{
CommittedTransaction,
SubmittedTransaction,
TransactionNodeStatistics,
}
import com.daml.logging.{ContextualizedLogger, LoggingContext}
import com.daml.telemetry.TelemetryContext
import com.google.common.primitives.Longs
@ -197,7 +201,8 @@ object BridgeWriteService {
case s: Submission.Transaction =>
Update.TransactionAccepted(
optCompletionInfo = Some(s.submitterInfo.toCompletionInfo),
optCompletionInfo =
Some(s.submitterInfo.toCompletionInfo(Some(TransactionNodeStatistics(s.transaction)))),
transactionMeta = s.transactionMeta,
transaction = s.transaction.asInstanceOf[CommittedTransaction],
transactionId = Ref.TransactionId.assertFromString(index.toString),

View File

@ -0,0 +1,83 @@
// Copyright (c) 2021 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
package com.daml.ledger.sandbox
import com.daml.ledger.api.DeduplicationPeriod
import com.daml.ledger.configuration.Configuration
import com.daml.ledger.offset.Offset
import com.daml.ledger.participant.state.v2.{SubmitterInfo, TransactionMeta, Update}
import com.daml.ledger.sandbox.BridgeWriteService.Submission
import com.daml.lf.crypto
import com.daml.lf.data.{Bytes, ImmArray, Ref, Time}
import com.daml.lf.transaction._
import com.daml.lf.value.Value.{ContractId, ValueNone}
import org.mockito.MockitoSugar
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class BridgeWriteServiceTest extends AnyFlatSpec with MockitoSugar with Matchers {
behavior of "BridgeWriteService"
"Success Mapper" should "add transaction statistics" in {
val nodeId = NodeId(0)
val contractId =
ContractId.V1.assertBuild(crypto.Hash.hashPrivateKey("c0"), Bytes.assertFromString("00"))
val node = Node.Create(
contractId,
templateId = Ref.Identifier.assertFromString("-dummyPkg-:DummyModule:dummyName"),
arg = ValueNone,
agreementText = "dummyAgreement",
signatories = Set.empty,
stakeholders = Set.empty,
key = None,
byInterface = None,
version = TransactionVersion.minVersion,
)
val tx = SubmittedTransaction(
VersionedTransaction(TransactionVersion.VDev, Map(nodeId -> node), ImmArray(nodeId))
)
val submitterInfo = SubmitterInfo(
actAs = List.empty,
readAs = List.empty,
applicationId = Ref.ApplicationId.assertFromString("a0"),
commandId = Ref.CommandId.assertFromString("c0"),
deduplicationPeriod = DeduplicationPeriod.DeduplicationOffset(Offset.beforeBegin),
submissionId = None,
ledgerConfiguration = Configuration.reasonableInitialConfiguration,
)
val transactionMeta = TransactionMeta(
ledgerEffectiveTime = Time.Timestamp.now(),
workflowId = None,
submissionTime = Time.Timestamp.now(),
submissionSeed = crypto.Hash.hashPrivateKey("k0"),
optUsedPackages = None,
optNodeSeeds = None,
optByKeyNodes = None,
)
val submission: Submission = Submission.Transaction(
submitterInfo,
transactionMeta,
transaction = tx,
estimatedInterpretationCost = 0,
)
val expected = TransactionNodeStatistics(tx)
val update =
BridgeWriteService.successMapper(submission, 0, Ref.ParticipantId.assertFromString("p0"))
update
.asInstanceOf[Update.TransactionAccepted]
.optCompletionInfo
.flatMap(_.statistics) shouldBe Some(expected)
}
}