From e4cce539577c09631e236e687dd5f417bd1ea584 Mon Sep 17 00:00:00 2001 From: nicu-da Date: Wed, 15 Sep 2021 03:45:23 -0700 Subject: [PATCH] Create a new grpc exception for each duplicate result [KVL-1099] (#10887) * Create a new grpc exception for each duplicate result The metadata in the exception is not thread safe, and when being converted into server headers netty.Utils.convertServerHeaders, it calls discardAll which mutates the metadata. Because this was reused for all duplicate exceptions then we got corrupted metadata. CHANGELOG_BEGIN CHANGELOG_END * Do not call duplicate command exception twice --- .../platform/server/api/validation/ErrorFactories.scala | 2 +- .../platform/server/api/validation/ErrorFactoriesSpec.scala | 2 +- .../platform/apiserver/services/ApiSubmissionService.scala | 5 +++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/ledger/ledger-api-common/src/main/scala/com/digitalasset/platform/server/api/validation/ErrorFactories.scala b/ledger/ledger-api-common/src/main/scala/com/digitalasset/platform/server/api/validation/ErrorFactories.scala index 77fd4aced0..d946a8bddb 100644 --- a/ledger/ledger-api-common/src/main/scala/com/digitalasset/platform/server/api/validation/ErrorFactories.scala +++ b/ledger/ledger-api-common/src/main/scala/com/digitalasset/platform/server/api/validation/ErrorFactories.scala @@ -17,7 +17,7 @@ trait ErrorFactories { import ErrorFactories._ - lazy val DuplicateCommandException: StatusRuntimeException = + def duplicateCommandException: StatusRuntimeException = grpcError( Status .newBuilder() diff --git a/ledger/ledger-api-common/src/test/suite/scala/com/digitalasset/platform/server/api/validation/ErrorFactoriesSpec.scala b/ledger/ledger-api-common/src/test/suite/scala/com/digitalasset/platform/server/api/validation/ErrorFactoriesSpec.scala index 260464c06d..939065697b 100644 --- a/ledger/ledger-api-common/src/test/suite/scala/com/digitalasset/platform/server/api/validation/ErrorFactoriesSpec.scala +++ b/ledger/ledger-api-common/src/test/suite/scala/com/digitalasset/platform/server/api/validation/ErrorFactoriesSpec.scala @@ -17,7 +17,7 @@ class ErrorFactoriesSpec extends AnyWordSpec with Matchers with TableDrivenPrope "ErrorFactories" should { "return the DuplicateCommandException" in { - val status = StatusProto.fromThrowable(DuplicateCommandException) + val status = StatusProto.fromThrowable(duplicateCommandException) status.getCode shouldBe Code.ALREADY_EXISTS.value() status.getMessage shouldBe "Duplicate command" status.getDetailsList.asScala shouldBe Seq(definiteAnswers(false)) diff --git a/ledger/participant-integration-api/src/main/scala/platform/apiserver/services/ApiSubmissionService.scala b/ledger/participant-integration-api/src/main/scala/platform/apiserver/services/ApiSubmissionService.scala index f8a3cbdfdb..5954c6d584 100644 --- a/ledger/participant-integration-api/src/main/scala/platform/apiserver/services/ApiSubmissionService.scala +++ b/ledger/participant-integration-api/src/main/scala/platform/apiserver/services/ApiSubmissionService.scala @@ -155,8 +155,9 @@ private[apiserver] final class ApiSubmissionService private[services] ( } case _: CommandDeduplicationDuplicate => metrics.daml.commands.deduplicatedCommands.mark() - logger.debug(DuplicateCommandException.getMessage) - Future.failed(DuplicateCommandException) + val exception = duplicateCommandException + logger.debug(exception.getMessage) + Future.failed(exception) } private def handleSubmissionResult(result: Try[state.SubmissionResult])(implicit