【问题标题】:Node Driver hangs and times out节点驱动程序挂起并超时
【发布时间】:2019-11-28 16:50:39
【问题描述】:

在运行一个简单的节点驱动程序时,我遇到了一个从未见过的 NodeDriver 问题:

fun main(args: Array<String>) {
    val rpcUsers = listOf(User("user1", "test", permissions = setOf("ALL")))

    driver(DriverParameters(startNodesInProcess = true, waitForAllNodesToFinish = true)) {
        startNode(providedName = CordaX500Name("PartyA", "London", "GB"), rpcUsers = rpcUsers).getOrThrow()
        startNode(providedName = CordaX500Name("PartyB", "New York", "US"), rpcUsers = rpcUsers).getOrThrow()
    }
}

当我在一个新的 Kotlin 模板 cordapp 项目中使用 Corda OS 4.1 运行它时,它运行良好。 但是,当它在我们现有的 cordapp 中运行时,它最终会失败:

java.lang.IllegalStateException: Unable to start notaries. A required port might be bound already.
    at net.corda.testing.node.internal.DriverDSLImpl.start(DriverDSLImpl.kt:373) ~[corda-node-driver-4.1.jar:?]
    at net.corda.testing.node.internal.DriverDSLImplKt.genericDriver(DriverDSLImpl.kt:966) ~[corda-node-driver-4.1.jar:?]
    at net.corda.testing.driver.Driver.driver(Driver.kt:190) ~[corda-node-driver-4.1.jar:?]
    at io.bluebank.braid.server.CordaAndBraidStandaloneKt.main(CordaAndBraidStandalone.kt:48) ~[test-classes/:?]
Caused by: java.util.concurrent.TimeoutException
    at java.util.concurrent.CompletableFuture.timedGet(CompletableFuture.java:1771) ~[?:1.8.0_212]
    at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915) ~[?:1.8.0_212]
    at net.corda.core.internal.concurrent.CordaFutureImpl.get(CordaFutureImpl.kt) ~[corda-core-4.1.jar:?]
    at net.corda.core.internal.concurrent.CordaFutureImplKt.get(CordaFutureImpl.kt:172) ~[corda-core-4.1.jar:?]
    at net.corda.core.utilities.KotlinUtilsKt.getOrThrow(KotlinUtils.kt:134) ~[corda-core-4.1.jar:?]
    at net.corda.testing.node.internal.DriverDSLImpl.start(DriverDSLImpl.kt:369) ~[corda-node-driver-4.1.jar:?]

调试这个,当我在任何阻塞它的过程中断点时,所有线程都处于WAIT 状态,除了一个名为SignalDispatcher 的RUNNING。没有任何堆栈在 Corda 中。但是,有些在 Quasar 堆栈中被阻挡。

进一步调试,我找到了发生阻塞行为的行:net.corda.node.services.rpc.ArtemisRpcBroker.kt:74

val serverConfiguration = RpcBrokerConfiguration(baseDirectory, maxMessageSize, jmxEnabled, addresses.primary, adminAddressOptional, sslOptions, useSsl, nodeConfiguration, shouldStartLocalShell)

进入该构造函数,Quasar 接管并似乎重复调用ClassLoader.checkPackageAccess。允许呼叫继续,它永远不会进入RpcBrokerConfiguration#init。

之前有没有其他人看到过这个问题,是否有任何解决问题的建议或关于我们如何进一步调试它的线索?谢谢。

PS - 这引用了 Corda 错误代码 1crywct。

【问题讨论】:

  • 事实证明,如果我将上面的代码移动到项目中的另一个同级模块中,它可以正常工作! :-o

标签: corda


【解决方案1】:

FWIW,我会检查使用相同端口的其他进程,或者只是通过节点驱动程序更改端口。例如,Intellij 附带的 YourKit 默认在端口 10001 上运行,即在默认节点驱动程序公证端口上运行 - 好吧,假设我没记错。

【讨论】:

  • 谢谢马诺斯。我也检查了那些。我还检查了日志。
【解决方案2】:

我想通了。我的项目是一个 CordaRPC 客户端。它的第三方库版本与 Corda 中使用的版本号冲突。这似乎使类星体进入一个试图解析类型的长循环!解决冲突,解决问题。当这种情况发生时,或许 Corda 可以做一些事情来提供更多线索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2019-01-14
    • 2014-04-24
    • 2019-03-13
    • 2016-10-22
    • 2011-11-12
    • 1970-01-01
    相关资源
    最近更新 更多