ENT-12395: Stop warning about failed verification when resolving missing dependencies in TransactionBuilder (#7867)

* Stop warning about failed verification when resolving missing dependencies in TransactionBuilder

* Stop warning about failed verification when resolving missing dependencies in TransactionBuilder
This commit is contained in:
Rick Parker 2024-11-04 13:06:22 +00:00 committed by GitHub
parent 436eca1524
commit d3b847aa8e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 10 additions and 10 deletions

View File

@ -243,7 +243,7 @@ open class TransactionBuilder(
*/ */
private fun addMissingDependency(serviceHub: VerifyingServiceHub, wireTx: WireTransaction, tryCount: Int): Boolean { private fun addMissingDependency(serviceHub: VerifyingServiceHub, wireTx: WireTransaction, tryCount: Int): Boolean {
log.debug { "Checking if there are any missing attachment dependencies for transaction ${wireTx.id}..." } log.debug { "Checking if there are any missing attachment dependencies for transaction ${wireTx.id}..." }
val verificationResult = wireTx.tryVerify(serviceHub) val verificationResult = wireTx.tryVerify(serviceHub, true)
// Check both legacy and non-legacy components are working, and try to add any missing dependencies if either are not. // Check both legacy and non-legacy components are working, and try to add any missing dependencies if either are not.
(verificationResult.inProcessResult as? Failure)?.let { (inProcessException) -> (verificationResult.inProcessResult as? Failure)?.let { (inProcessException) ->
return addMissingDependency(inProcessException, wireTx, false, serviceHub, tryCount) return addMissingDependency(inProcessException, wireTx, false, serviceHub, tryCount)

View File

@ -382,11 +382,11 @@ class WireTransaction(componentGroups: List<ComponentGroup>, val privacySalt: Pr
*/ */
@CordaInternal @CordaInternal
@JvmSynthetic @JvmSynthetic
internal fun tryVerify(verificationSupport: NodeVerificationSupport): VerificationResult { internal fun tryVerify(verificationSupport: NodeVerificationSupport, disableWarnings: Boolean = false): VerificationResult {
return when { return when {
legacyAttachments.isEmpty() -> { legacyAttachments.isEmpty() -> {
log.debug { "${toSimpleString()} will be verified in-process" } log.debug { "${toSimpleString()} will be verified in-process" }
InProcess(Try.on { verifyInProcess(verificationSupport) }) InProcess(Try.on { verifyInProcess(verificationSupport, disableWarnings) })
} }
nonLegacyAttachments.isEmpty() -> { nonLegacyAttachments.isEmpty() -> {
log.debug { "${toSimpleString()} will be verified by the external verifer" } log.debug { "${toSimpleString()} will be verified by the external verifer" }
@ -394,7 +394,7 @@ class WireTransaction(componentGroups: List<ComponentGroup>, val privacySalt: Pr
} }
else -> { else -> {
log.debug { "${toSimpleString()} will be verified both in-process and by the external verifer" } log.debug { "${toSimpleString()} will be verified both in-process and by the external verifer" }
val inProcessResult = Try.on { verifyInProcess(verificationSupport) } val inProcessResult = Try.on { verifyInProcess(verificationSupport, disableWarnings) }
val externalResult = Try.on { verificationSupport.externalVerifierHandle.verifyTransaction(this) } val externalResult = Try.on { verificationSupport.externalVerifierHandle.verifyTransaction(this) }
InProcessAndExternal(inProcessResult, externalResult) InProcessAndExternal(inProcessResult, externalResult)
} }
@ -403,31 +403,31 @@ class WireTransaction(componentGroups: List<ComponentGroup>, val privacySalt: Pr
@CordaInternal @CordaInternal
@JvmSynthetic @JvmSynthetic
internal fun verifyInProcess(verificationSupport: VerificationSupport): LedgerTransaction { internal fun verifyInProcess(verificationSupport: VerificationSupport, disableWarnings: Boolean = false): LedgerTransaction {
val ltx = toLedgerTransactionInternal(verificationSupport) val ltx = toLedgerTransactionInternal(verificationSupport)
try { try {
ltx.verify() ltx.verify()
} catch (e: NoClassDefFoundError) { } catch (e: NoClassDefFoundError) {
checkReverifyAllowed(e) checkReverifyAllowed(e, disableWarnings)
val missingClass = e.message ?: throw e val missingClass = e.message ?: throw e
log.warn("Transaction {} has missing class: {}", ltx.id, missingClass) log.warn("Transaction {} has missing class: {}", ltx.id, missingClass)
reverifyWithFixups(ltx, verificationSupport, missingClass) reverifyWithFixups(ltx, verificationSupport, missingClass)
} catch (e: NotSerializableException) { } catch (e: NotSerializableException) {
checkReverifyAllowed(e) checkReverifyAllowed(e, disableWarnings)
retryVerification(e, e, ltx, verificationSupport) retryVerification(e, e, ltx, verificationSupport)
} catch (e: TransactionDeserialisationException) { } catch (e: TransactionDeserialisationException) {
checkReverifyAllowed(e) checkReverifyAllowed(e, disableWarnings)
retryVerification(e.cause, e, ltx, verificationSupport) retryVerification(e.cause, e, ltx, verificationSupport)
} }
return ltx return ltx
} }
private fun checkReverifyAllowed(ex: Throwable) { private fun checkReverifyAllowed(ex: Throwable, disableWarnings: Boolean) {
// If that transaction was created with and after Corda 4 then just fail. // If that transaction was created with and after Corda 4 then just fail.
// The lenient dependency verification is only supported for Corda 3 transactions. // The lenient dependency verification is only supported for Corda 3 transactions.
// To detect if the transaction was created before Corda 4 we check if the transaction has the NetworkParameters component group. // To detect if the transaction was created before Corda 4 we check if the transaction has the NetworkParameters component group.
if (networkParametersHash != null) { if (networkParametersHash != null) {
log.warn("TRANSACTION VERIFY FAILED - No attempt to auto-repair as TX is Corda 4+") if (!disableWarnings) log.warn("TRANSACTION VERIFY FAILED - No attempt to auto-repair as TX is Corda 4+")
throw ex throw ex
} }
} }