From 8f43c034ec6c5a4f54b7347743dbe1ea87c8ccb6 Mon Sep 17 00:00:00 2001 From: Simon Maxen <56595114+simonmaxen-da@users.noreply.github.com> Date: Tue, 21 Dec 2021 23:27:30 +0000 Subject: [PATCH] Add transaction statistics to completion info (#12224) * Add transaction statistics to completion info changelog_begin changelog_end * reformat --- .../participant/state/v2/SubmitterInfo.scala | 18 ++-- .../sandbox/stores/ledger/sql/SqlLedger.scala | 4 +- ledger/sandbox-on-x/BUILD.bazel | 44 +++------- .../ledger/sandbox/BridgeWriteService.scala | 9 +- .../sandbox/BridgeWriteServiceTest.scala | 83 +++++++++++++++++++ 5 files changed, 114 insertions(+), 44 deletions(-) create mode 100644 ledger/sandbox-on-x/src/test/suite/scala/com/daml/ledger/sandbox/BridgeWriteServiceTest.scala diff --git a/ledger/participant-state/src/main/scala/com/daml/ledger/participant/state/v2/SubmitterInfo.scala b/ledger/participant-state/src/main/scala/com/daml/ledger/participant/state/v2/SubmitterInfo.scala index aeaeedd390..400eec0667 100644 --- a/ledger/participant-state/src/main/scala/com/daml/ledger/participant/state/v2/SubmitterInfo.scala +++ b/ledger/participant-state/src/main/scala/com/daml/ledger/participant/state/v2/SubmitterInfo.scala @@ -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 { diff --git a/ledger/sandbox-classic/src/main/scala/platform/sandbox/stores/ledger/sql/SqlLedger.scala b/ledger/sandbox-classic/src/main/scala/platform/sandbox/stores/ledger/sql/SqlLedger.scala index a7729664b0..3ed6f3ba75 100644 --- a/ledger/sandbox-classic/src/main/scala/platform/sandbox/stores/ledger/sql/SqlLedger.scala +++ b/ledger/sandbox-classic/src/main/scala/platform/sandbox/stores/ledger/sql/SqlLedger.scala @@ -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, diff --git a/ledger/sandbox-on-x/BUILD.bazel b/ledger/sandbox-on-x/BUILD.bazel index 01365efd53..4cdd1f826c 100644 --- a/ledger/sandbox-on-x/BUILD.bazel +++ b/ledger/sandbox-on-x/BUILD.bazel @@ -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", ], ) diff --git a/ledger/sandbox-on-x/src/main/scala/com/daml/ledger/sandbox/BridgeWriteService.scala b/ledger/sandbox-on-x/src/main/scala/com/daml/ledger/sandbox/BridgeWriteService.scala index 22218ead0a..d126e7e7e3 100644 --- a/ledger/sandbox-on-x/src/main/scala/com/daml/ledger/sandbox/BridgeWriteService.scala +++ b/ledger/sandbox-on-x/src/main/scala/com/daml/ledger/sandbox/BridgeWriteService.scala @@ -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), diff --git a/ledger/sandbox-on-x/src/test/suite/scala/com/daml/ledger/sandbox/BridgeWriteServiceTest.scala b/ledger/sandbox-on-x/src/test/suite/scala/com/daml/ledger/sandbox/BridgeWriteServiceTest.scala new file mode 100644 index 0000000000..7462386273 --- /dev/null +++ b/ledger/sandbox-on-x/src/test/suite/scala/com/daml/ledger/sandbox/BridgeWriteServiceTest.scala @@ -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) + } + +}