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 36119fc2cf..e103d5f502 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/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt b/core/src/main/kotlin/net/corda/core/flows/FinalityRecoveryFlow.kt index e31f5b4fa8..2e0adf9eb2 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) 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 +) 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/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 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"