首页 > 解决方案 > 在 Corda 3.2 的模拟网络中使用 Try.on 会导致无限循环/等待?

问题描述

我正在迁移v 3.0v 3.2我的许多单元测试Try.on用来断言一些预期的结果。它以前在 v3.0 中工作,但在 v3.2 之后,它在模拟网络中的单元测试中陷入无限等待。

@Test
fun `Issue non-anonymous obligation successfully with non null remark`() {

    // Throw null pointer
    val result = Try.on {
        issueObligation(a, b, 1000.POUNDS, anonymous = false, remark = null)
        network.waitQuiescent()
    }

    assert(result.isFailure)

    // If I don't run this subsequent transaction, the test runs successfully.
    // Somehow, any transaction after a Try.on will get stuck.


    // Should issue successfully.
    issueObligation(a, b, 1000.POUNDS, anonymous = false, remark = "Valid")
    network.waitQuiescent()


}

Stacktrace 在控制台将陷入无限等待。

[警告] 11:15:45,055 [模拟节点 1 线程] (FlowStateMachineImpl.kt:111) flow.[2c41b166-041a-4ec8-87dd-896e3712415e].run - 因意外异常终止 {}
java.lang.IllegalArgumentException:无效的字符串。
    在 net.corda.examples.obligation.flows.IssueObligation$Initiator.call(IssueObligation.kt:44) ~[classes/:?]
    在 net.corda.examples.obligation.flows.IssueObligation$Initiator.call(IssueObligation.kt:21) ~[classes/:?]
    在 net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.2-corda.jar:?]
    在 net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.2-corda.jar:?]
    在 co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    在 co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    在 co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    在 co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9]
    在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_151]
    在 java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_151]
    在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_151]
    在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_151]
    在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_151]
    在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_151]
    在 net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$1$thread$1.run(AffinityExecutor.kt:62) [corda-node-3.2-corda.jar:?]
[INFO] 11:15:45,474 [Mock node 1 thread] (FlowStateMachineImpl.kt:432) flow.[77bea7fa-402f-4527-8388-d910faea6342].initiateSession - 启动与方 O=Mock Company 2, L= 的流会话伦敦,C = GB。用于跟踪目的的会话 ID 是 SessionId(toLong=7175264157685997907)。{}
[INFO] 11:15:45,570 [模拟节点 2 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受来自方 O=Mock Company 1、L=London、C=GB 的流会话。用于跟踪目的的会话 ID 是 SessionId(toLong=7175264157685997907)。{invocation_id=18195f36-850b-4fec-9794-9e57c16f9155, invocation_timestamp=2018-08-03T04:15:45.557Z, session_id=18195f36-850b-4fec-9794-9e57c16f9155, session_503704:4018-Z508: }
[INFO] 11:15:45,747 [模拟节点 1 线程] (FlowStateMachineImpl.kt:432) flow.[77bea7fa-402f-4527-8388-d910faea6342].initiateSession - 与方 O=Notary Service,L=Zurich 启动流会话, C = CH。用于跟踪目的的会话 ID 是 SessionId(toLong=-6165721234712091944)。{}
[INFO] 11:15:45,772 [模拟节点 0 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受来自方 O=Mock Company 1、L=London、C=GB 的流会话。用于跟踪目的的会话 ID 是 SessionId(toLong=-6165721234712091944)。{invocation_id=c7c9d70d-e73a-4724-912a-e7f3d5080e57, invocation_timestamp=2018-08-03T04:15:45.770Z, session_id=c7c9d70d-e73a-4724-912a-e7f3d5080e57, session_timestamp=2018-70T04:158-70T04:158-70T }
[信息] 11:15:45,868 [模拟节点 1 线程] (HibernateConfiguration.kt:47) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[ObligationSchemaV1(name=net.corda.examples.obligation.ObligationSchema, version= 1)] {}
[信息] 11:15:45,875 [模拟节点 1 线程] (ConnectionProviderInitiator.java:122) internal.ConnectionProviderInitiator.initiateService - HHH000130:实例化显式连接提供程序:net.corda.nodeapi.internal.persistence.HibernateConfiguration$NodeDatabaseConnectionProvider {}
[信息] 11:15:45,876 [模拟节点 1 线程] (Dialect.java:157) dialect.Dialect。- HHH000400:使用方言:org.hibernate.dialect.H2Dialect {}
[INFO] 11:15:45,881 [模拟节点 1 线程] (BasicTypeRegistry.java:148) type.BasicTypeRegistry.register - HHH000270:类型注册 [materialized_blob] 覆盖以前:org.hibernate.type.MaterializedBlobType@7a7698f4 {}
[INFO] 11:15:45,894 [模拟节点 1 线程](DdlTransactionIsolatorNonJtaImpl.java:47)connections.access.getIsolatedConnection - HHH10001501:从 JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@ 736e95ad](非 JTA)DDL 执行未处于自动提交模式;连接“本地事务”将被提交,连接将设置为自动提交模式。{}
[INFO] 11:15:45,909 [模拟节点 1 线程] (HibernateConfiguration.kt:64) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[ObligationSchemaV1(name=net.corda.examples.obligation.ObligationSchema, version= 1)] {}
[INFO] 11:15:45,916 [模拟节点 1 线程] (HibernateConfiguration.kt:47) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[VaultSchemaV1(name=net.corda.node.services.vault.VaultSchema,版本=1)] {}
[信息] 11:15:45,923 [模拟节点 1 线程] (ConnectionProviderInitiator.java:122) internal.ConnectionProviderInitiator.initiateService - HHH000130:实例化显式连接提供程序:net.corda.nodeapi.internal.persistence.HibernateConfiguration$NodeDatabaseConnectionProvider {}
[信息] 11:15:45,924 [模拟节点 1 线程] (Dialect.java:157) dialect.Dialect。- HHH000400:使用方言:org.hibernate.dialect.H2Dialect {}
[INFO] 11:15:45,927 [模拟节点 1 线程] (BasicTypeRegistry.java:148) type.BasicTypeRegistry.register - HHH000270:类型注册 [materialized_blob] 覆盖以前:org.hibernate.type.MaterializedBlobType@7a7698f4 {}
[信息] 11:15:45,953 [模拟节点 1 线程](DdlTransactionIsolatorNonJtaImpl.java:47)connections.access.getIsolatedConnection - HHH10001501:从 JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@ 318fb15](非 JTA)DDL 执行未处于自动提交模式;连接“本地事务”将被提交,连接将设置为自动提交模式。{}
[INFO] 11:15:45,994 [模拟节点 1 线程] (HibernateConfiguration.kt:64) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[VaultSchemaV1(name=net.corda.node.services.vault.VaultSchema,版本=1)] {}
[INFO] 11:15:46,003 [Mock node 1 thread] (FlowStateMachineImpl.kt:432) flow.[77bea7fa-402f-4527-8388-d910faea6342].initiateSession - 与方 O=Mock Company 2, L= 启动流会话伦敦,C = GB。用于跟踪目的的会话 id 是 SessionId(toLong=-2453204714770107984)。{}
[INFO] 11:15:46,027 [模拟节点 2 线程] (StateMachineManagerImpl.kt:367) statemachine.StateMachineManagerImpl.onSessionInit - 接受来自方 O=Mock Company 1、L=London、C=GB 的流会话。用于跟踪目的的会话 id 是 SessionId(toLong=-2453204714770107984)。{invocation_id=ec8f9d18-73ef-4739-a0cd-84202e590df9, invocation_timestamp=2018-08-03T04:15:46.026Z, session_id=ec8f9d18-73ef-4739-a0cd-84202e590df9, session_timestamp=2018-08-03Z046. }
[INFO] 11:15:46,084 [模拟节点 2 线程] (HibernateConfiguration.kt:47) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[ObligationSchemaV1(name=net.corda.examples.obligation.ObligationSchema, version= 1)] {}
[信息] 11:15:46,099 [模拟节点 2 线程] (ConnectionProviderInitiator.java:122) internal.ConnectionProviderInitiator.initiateService - HHH000130:实例化显式连接提供程序:net.corda.nodeapi.internal.persistence.HibernateConfiguration$NodeDatabaseConnectionProvider {}
[信息] 11:15:46,100 [模拟节点 2 线程] (Dialect.java:157) dialect.Dialect。- HHH000400:使用方言:org.hibernate.dialect.H2Dialect {}
[INFO] 11:15:46,107 [模拟节点 2 线程] (BasicTypeRegistry.java:148) type.BasicTypeRegistry.register - HHH000270:类型注册 [materialized_blob] 覆盖以前:org.hibernate.type.MaterializedBlobType@7a7698f4 {}
[INFO] 11:15:46,115 [模拟节点 2 线程](DdlTransactionIsolatorNonJtaImpl.java:47)connections.access.getIsolatedConnection - HHH10001501:从 JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@获得的连接606d0355] 对于(非 JTA)DDL 执行未处于自动提交模式;连接“本地事务”将被提交,连接将设置为自动提交模式。{}
[INFO] 11:15:46,129 [模拟节点 2 线程] (HibernateConfiguration.kt:64) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[ObligationSchemaV1(name=net.corda.examples.obligation.ObligationSchema, version= 1)] {}
[信息] 11:15:46,130 [模拟节点 2 线程] (HibernateConfiguration.kt:47) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[VaultSchemaV1(name=net.corda.node.services.vault.VaultSchema,版本=1)] {}
[信息] 11:15:46,134 [模拟节点 2 线程] (ConnectionProviderInitiator.java:122) internal.ConnectionProviderInitiator.initiateService - HHH000130:实例化显式连接提供程序:net.corda.nodeapi.internal.persistence.HibernateConfiguration$NodeDatabaseConnectionProvider {}
[信息] 11:15:46,135 [模拟节点 2 线程] (Dialect.java:157) dialect.Dialect。- HHH000400:使用方言:org.hibernate.dialect.H2Dialect {}
[INFO] 11:15:46,136 [模拟节点 2 线程] (BasicTypeRegistry.java:148) type.BasicTypeRegistry.register - HHH000270:类型注册 [materialized_blob] 覆盖以前:org.hibernate.type.MaterializedBlobType@7a7698f4 {}
[INFO] 11:15:46,157 [模拟节点 2 线程](DdlTransactionIsolatorNonJtaImpl.java:47)connections.access.getIsolatedConnection - HHH10001501:从 JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@获得的连接6b0f595c](非 JTA)DDL 执行未处于自动提交模式;连接“本地事务”将被提交,连接将设置为自动提交模式。{}
[INFO] 11:15:46,175 [模拟节点 2 线程] (HibernateConfiguration.kt:64) persistence.HibernateConfiguration.makeSessionFactoryForSchemas - 为模式创建会话工厂:[VaultSchemaV1(name=net.corda.node.services.vault.VaultSchema,版本=1)] {}

标签: corda

解决方案


这似乎是 Corda 3.2 中的一个错误。它在这里被跟踪:https ://github.com/corda/corda/issues/3741 。


推荐阅读