From 04b1e8fb3db2a1f18932c3999dbb53be3b4fad02 Mon Sep 17 00:00:00 2001 From: Jose Coll Date: Fri, 27 Oct 2023 13:45:19 +0100 Subject: [PATCH 1/5] Add "forceRecoverFlowIds" parameter to FinalityRecoveryFlow --- .../corda/core/flows/FinalityRecoveryFlow.kt | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt b/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt index e31f5b4fa8..02acd40a8e 100644 --- a/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt @@ -21,6 +21,7 @@ class FinalityRecoveryFlow( private val matchingCriteria: FlowRecoveryQuery? = null, private val forceRecover: Boolean = false, private val recoverAll: Boolean = false, + private val forceRecoverFlowIds: Collection = emptySet(), override val progressTracker: ProgressTracker = ProgressTracker()) : FlowLogic>() { @CordaInternal @@ -28,16 +29,17 @@ class FinalityRecoveryFlow( val flowIds: Collection, val matchingCriteria: FlowRecoveryQuery?, val forceRecover: Boolean, - val recoverAll: Boolean) + val recoverAll: Boolean, + val forceRecoverFlowIds: Collection) @CordaInternal - fun getExtraConstructorArgs() = ExtraConstructorArgs(txIds, flowIds, matchingCriteria, forceRecover, recoverAll) + fun getExtraConstructorArgs() = ExtraConstructorArgs(txIds, flowIds, matchingCriteria, forceRecover, recoverAll, forceRecoverFlowIds) constructor(txId: SecureHash, forceRecover: Boolean = false) : this(setOf(txId), forceRecover) - constructor(txIds: Collection, forceRecover: Boolean = false, recoverAll: Boolean = false) : this(txIds, emptySet(), null, forceRecover, recoverAll, tracker()) + constructor(txIds: Collection, forceRecover: Boolean = false, recoverAll: Boolean = false) : this(txIds, emptySet(), null, forceRecover, recoverAll, emptySet(), tracker()) constructor(flowId: StateMachineRunId, forceRecover: Boolean = false) : this(emptySet(), setOf(flowId), null, forceRecover) - constructor(flowIds: Collection, forceRecover: Boolean = false) : this(emptySet(), flowIds, null, forceRecover, false, tracker()) - constructor(recoverAll: Boolean, forceRecover: Boolean = false) : this(emptySet(), emptySet(), null, forceRecover, recoverAll, tracker()) - constructor(matchingCriteria: FlowRecoveryQuery, forceRecover: Boolean = false) : this(emptySet(), emptySet(), matchingCriteria, forceRecover, false, tracker()) + constructor(flowIds: Collection, forceRecover: Boolean = false) : this(emptySet(), flowIds, null, forceRecover, false, emptySet(), tracker()) + constructor(recoverAll: Boolean, forceRecover: Boolean = false) : this(emptySet(), emptySet(), null, forceRecover, recoverAll, emptySet(), tracker()) + constructor(matchingCriteria: FlowRecoveryQuery, forceRecover: Boolean = false) : this(emptySet(), emptySet(), matchingCriteria, forceRecover, false, emptySet(), tracker()) @Suspendable @Throws(FlowRecoveryException::class) @@ -55,9 +57,10 @@ class FlowRecoveryException(message: String, cause: Throwable? = null) : FlowExc data class FlowRecoveryQuery( val timeframe: FlowTimeWindow? = null, val initiatedBy: CordaX500Name? = null, - val counterParties: List? = null) { + val counterParties: List? = null, + val excludeFlowIds: List? = null) { init { - require(timeframe != null || initiatedBy != null || counterParties != null) { + require(timeframe != null || initiatedBy != null || counterParties != null || excludeFlowIds != null) { "Must specify at least one recovery criteria" } } From 5e017dfbc8af467b943dc559738985bbe1c1e09c Mon Sep 17 00:00:00 2001 From: Jose Coll Date: Fri, 27 Oct 2023 14:13:29 +0100 Subject: [PATCH 2/5] Drop FlowRecoveryQuery criteria: excludeFlowIds --- .../main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt b/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt index 02acd40a8e..2e0adf9eb2 100644 --- a/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt +++ b/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt @@ -57,10 +57,9 @@ class FlowRecoveryException(message: String, cause: Throwable? = null) : FlowExc data class FlowRecoveryQuery( val timeframe: FlowTimeWindow? = null, val initiatedBy: CordaX500Name? = null, - val counterParties: List? = null, - val excludeFlowIds: List? = null) { + val counterParties: List? = null) { init { - require(timeframe != null || initiatedBy != null || counterParties != null || excludeFlowIds != null) { + require(timeframe != null || initiatedBy != null || counterParties != null) { "Must specify at least one recovery criteria" } } From 7f867a0a4969017f069de0c4870a9be95d0e1291 Mon Sep 17 00:00:00 2001 From: Chris Cochrane <78791827+chriscochrane@users.noreply.github.com> Date: Mon, 30 Oct 2023 15:41:21 +0000 Subject: [PATCH 3/5] ENT-11038 - Redirect Liquibase logging via Slf4j (#7552) --- .../persistence/Slf4jLiquibaseLogService.kt | 13 ++++ .../persistence/Slf4jLiquibaseLogger.kt | 74 +++++++++++++++++++ .../services/liquibase.logging.LogService | 1 + 3 files changed, 88 insertions(+) create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogService.kt create mode 100644 node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogger.kt create mode 100644 node-api/src/main/resources/META-INF/services/liquibase.logging.LogService diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogService.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogService.kt new file mode 100644 index 0000000000..1ec830d0e5 --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogService.kt @@ -0,0 +1,13 @@ +package net.corda.nodeapi.internal.persistence + +import liquibase.logging.core.AbstractLogService +import org.slf4j.LoggerFactory + +class Slf4jLiquibaseLogService : AbstractLogService() { + + override fun getPriority() = Integer.MAX_VALUE + override fun getLog(clazz: Class<*>?) : liquibase.logging.Logger { + return Slf4jLiquibaseLogger(LoggerFactory.getLogger(clazz)) + } + +} diff --git a/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogger.kt b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogger.kt new file mode 100644 index 0000000000..d9afda1e38 --- /dev/null +++ b/node-api/src/main/kotlin/net/corda/nodeapi/internal/persistence/Slf4jLiquibaseLogger.kt @@ -0,0 +1,74 @@ +package net.corda.nodeapi.internal.persistence + +import org.slf4j.Logger +import java.util.logging.Level + +/** + * Slf4j logger for Liquibase + * Captures logging from Liquibase that would otherwise go to stderr. + */ +class Slf4jLiquibaseLogger(private val logger: Logger) : liquibase.logging.core.AbstractLogger() { + + companion object { + private val TRACE_THRESHOLD = Level.FINEST.intValue() + private val DEBUG_THRESHOLD = Level.FINE.intValue() + private val INFO_THRESHOLD = Level.INFO.intValue() + private val WARN_THRESHOLD = Level.WARNING.intValue() + } + + override fun log(level: Level, message: String?, e: Throwable?) { + val levelValue = level.intValue() + if (levelValue <= TRACE_THRESHOLD) { + logger.trace(message, e) + } else if (levelValue <= DEBUG_THRESHOLD) { + logger.debug(message, e) + } else if (levelValue <= INFO_THRESHOLD) { + logger.info(message, e) + } else if (levelValue <= WARN_THRESHOLD) { + logger.warn(message, e) + } else { + logger.error(message, e) + } + } + + override fun severe(message: String?) { + logger.error(message) + } + + override fun severe(message: String?, e: Throwable?) { + logger.error(message, e) + } + + override fun warning(message: String?) { + logger.warn(message) + } + + override fun warning(message: String?, e: Throwable?) { + logger.warn(message, e) + } + + override fun info(message: String?) { + logger.info(message) + } + + override fun info(message: String?, e: Throwable?) { + logger.info(message, e) + } + + override fun config(message: String?) { + logger.info(message) + } + + override fun config(message: String?, e: Throwable?) { + logger.info(message, e) + } + + override fun fine(message: String?) { + logger.debug(message) + } + + override fun fine(message: String?, e: Throwable?) { + logger.debug(message, e) + } + +} \ No newline at end of file diff --git a/node-api/src/main/resources/META-INF/services/liquibase.logging.LogService b/node-api/src/main/resources/META-INF/services/liquibase.logging.LogService new file mode 100644 index 0000000000..74002d445f --- /dev/null +++ b/node-api/src/main/resources/META-INF/services/liquibase.logging.LogService @@ -0,0 +1 @@ +net.corda.nodeapi.internal.persistence.Slf4jLiquibaseLogService \ No newline at end of file From 60bcc991549bc63d8028e68b70334d1f49e2f6b1 Mon Sep 17 00:00:00 2001 From: Jose Coll Date: Tue, 31 Oct 2023 15:55:55 +0000 Subject: [PATCH 4/5] ENT-11037 Expose and use additional Ledger Recovery statistics (#7553) --- .../net/corda/core/internal/ResolveTransactionsFlow.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/src/main/kotlin/net/corda/core/internal/ResolveTransactionsFlow.kt b/core/src/main/kotlin/net/corda/core/internal/ResolveTransactionsFlow.kt index 7b8f248667..3896d5648c 100644 --- a/core/src/main/kotlin/net/corda/core/internal/ResolveTransactionsFlow.kt +++ b/core/src/main/kotlin/net/corda/core/internal/ResolveTransactionsFlow.kt @@ -46,6 +46,8 @@ class ResolveTransactionsFlow private constructor( : this(transaction, transaction.dependencies, otherSide, statesToRecord, deferredAck) private var fetchNetParamsFromCounterpart = false + // statistics set in DbResolver (Enterprise only) after exiting recordDependencies() + var statistics: ResolveTransactionsFlowStats = ResolveTransactionsFlowStats() @Suppress("MagicNumber") @Suspendable @@ -120,3 +122,10 @@ class ResolveTransactionsFlow private constructor( } } } + +data class ResolveTransactionsFlowStats( + val resolvableTransactionHashesCount: Long = 0, + val downloadedDependencyCount: Long = 0, + val recordedTransactionCount: Long = 0, + val skippedRecordingTransactionCount: Long = 0 +) From 5c32d3dec4519d949e8206be2613902ded692f33 Mon Sep 17 00:00:00 2001 From: Jose Coll Date: Thu, 2 Nov 2023 17:46:29 +0000 Subject: [PATCH 5/5] ENT-11073 Checkpoint agent: update java assist version. (#7554) --- build.gradle | 2 ++ constants.properties | 1 + experimental/quasar-hook/build.gradle | 6 +----- tools/checkpoint-agent/build.gradle | 27 +-------------------------- 4 files changed, 5 insertions(+), 31 deletions(-) diff --git a/build.gradle b/build.gradle index ac0995e4ea..aeccb9ada0 100644 --- a/build.gradle +++ b/build.gradle @@ -124,6 +124,8 @@ buildscript { ext.commons_configuration2_version = constants.getProperty("commonsConfiguration2Version") ext.commons_text_version = constants.getProperty("commonsTextVersion") ext.snake_yaml_version = constants.getProperty("snakeYamlVersion") + ext.javaassist_version = constants.getProperty("javaassistVersion") + if (JavaVersion.current().isJava8()) { ext.fontawesomefx_commons_version = constants.getProperty("fontawesomefxCommonsJava8Version") ext.fontawesomefx_fontawesome_version = constants.getProperty("fontawesomefxFontawesomeJava8Version") diff --git a/constants.properties b/constants.properties index 6c78be4da5..5c01bc82b7 100644 --- a/constants.properties +++ b/constants.properties @@ -106,3 +106,4 @@ fontawesomefxFontawesomeJava8Version=4.7.0-5 # FontAwesomeFX for a more recent version of the Java Runtime (class file version 55.0) fontawesomefxCommonsVersion=11.0 fontawesomefxFontawesomeVersion=4.7.0-11 +javaassistVersion=3.27.0-GA diff --git a/experimental/quasar-hook/build.gradle b/experimental/quasar-hook/build.gradle index dfe49fa970..df09b426d7 100644 --- a/experimental/quasar-hook/build.gradle +++ b/experimental/quasar-hook/build.gradle @@ -1,7 +1,3 @@ -ext { - javaassist_version = "3.12.1.GA" -} - apply plugin: 'kotlin' apply plugin: 'idea' @@ -10,7 +6,7 @@ description 'A javaagent to allow hooking into the instrumentation by Quasar' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" compile "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - compile "javassist:javassist:$javaassist_version" + compile "org.javassist:javassist:$javaassist_version" } jar { diff --git a/tools/checkpoint-agent/build.gradle b/tools/checkpoint-agent/build.gradle index 228a6de595..838d70c652 100644 --- a/tools/checkpoint-agent/build.gradle +++ b/tools/checkpoint-agent/build.gradle @@ -1,28 +1,3 @@ -buildscript { - // For sharing constants between builds - Properties constants = new Properties() - file("$projectDir/../../constants.properties").withInputStream { constants.load(it) } - - ext.kotlin_version = constants.getProperty("kotlinVersion") - ext.javaassist_version = "3.12.1.GA" - - repositories { - mavenLocal() - mavenCentral() - jcenter() - } - - dependencies { - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - } -} - -repositories { - mavenLocal() - mavenCentral() - jcenter() -} - apply plugin: 'kotlin' apply plugin: 'idea' apply plugin: 'net.corda.plugins.publish-utils' @@ -33,7 +8,7 @@ description 'A javaagent to allow hooking into Kryo checkpoints' dependencies { compileOnly "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version" compileOnly "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" - compileOnly "javassist:javassist:$javaassist_version" + compileOnly "org.javassist:javassist:$javaassist_version" compileOnly "com.esotericsoftware:kryo:$kryo_version" compileOnly "co.paralleluniverse:quasar-core:$quasar_version"