【问题标题】:Corda Drain mode does not prevent the flows to startCorda Drain 模式不会阻止流启动
【发布时间】:2020-07-20 15:09:17
【问题描述】:

阅读 Corda 的文档后,我认为在排水模式被禁用之前,排水模式不应该允许在节点上启动任何流。然而似乎并非如此,至少当我从 ServiceHub 运行我的流时。这是我尝试过的:

我使用 deployNodes 任务运行我的 cordapp。在 corda shell 中,我运行run setFlowsDrainingModeEnabled enabled: true。然后我通过 ServiceHub 运行一个流程,该流程更新该节点中的现有状态,并且在不排空节点的情况下,我查询 vault 并看到状态已成功更新。所以我真的很困惑。排水实际上是如何工作的?

我真正想要实现的是创建一个小实用程序来安全关闭节点,或者在尝试一段时间后失败。这是代码:

class ShutdownOrFailHelper {

private val sleepInterval = 1_000L
private val maxSleepTimes = 120
private var count = 0

fun run(args: Array<String>) {
    val connection = RPCConnector().connect(args)
    val proxy = connection.proxy
    val nodeInfo = proxy.nodeInfo()

    proxy.setFlowsDrainingModeEnabled(true)
    do {
        val pendingSize = proxy.stateMachinesSnapshot().size

        if(pendingSize == 0){
            proxy.shutdown()
            println("Done")
            break
        }
        Thread.sleep(sleepInterval)
        count++
        println("$pendingSize flows are running. Waiting flows to finish on $nodeInfo")

        if(count > maxSleepTimes){
            println("Node still has $pendingSize flows running. Give up waiting..")
            proxy.setFlowsDrainingModeEnabled(false)
            connection.notifyServerAndClose()
            exitProcess(1)
        }
    } while (pendingSize != 0)
}}

但要使其正常工作,我需要确保在 proxy.setFlowsDrainingModeEnabled(true) 之后无法启动更多流,但实际上即使在此之后我也能够启动流。然后我真的不明白排水模式的目的是什么......

【问题讨论】:

    标签: corda


    【解决方案1】:

    流量耗尽模式仅作为您的 cordapps / corda 升级策略的一部分出现。

    此模式将在排队新的启动流消息时完成未完成的流,然后在完成时发出信号,以便操作员可以继续干净关闭。

    以上内容将允许操作员知道何时可以安全地关闭节点并更换 JAR。

    【讨论】:

    • 谢谢。我编辑了我的问题以更具体地实现我想要实现的目标。真正让我困惑的是,在排水模式下,流程不会排队,它们照常开始并照常完成,所以我真的不明白排水模式是什么。
    • 嗨看起来像一个错误。我们只停止通过 RPC 触发的流。提出了一个错误 - github.com/corda/corda/issues/6486.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2019-07-30
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多