原文地址:https://docs.corda.net/upgrading-cordapps.html#flow-drains
一个 flow 检查点(checkpoint)是一个序列化的 flow 的堆栈结构(stack frames) 和 任何可以从堆栈中拿到的对象的 snapshot。检查点会在一个 flow 挂起后者恢复的时候被自动存到数据中,这个通常会在发送或者接收消息的时候发生。当节点重启的时候,一个 flow 可能会从最后一个检查点开始重新运行。自动的创建检查点是 Corda 提供的 一个非常规的功能,这会很大地帮助开发者编写可靠的代码来确保当节点重启或者 crash 之后节点还能够继续正常运行。这个也帮助了向上扩展(scaling up),因为当 flows 在等待一个 response 的时候,他们会被从内存中清理掉。
然而,这也意味着将 flow 从一个旧版本恢复到一个新的版本的时候,可能会造成重启失败。比如如果你从一个方法中删除了一个本地变量,这个变量在以前的版本中是有的,那么 flow 引擎是无法找出之前存储的变量值应该放在哪里的。
因此,在当前版本的 Corda 中,在做一个改变了 @Suspendable
代码更新的一个应用升级之前,你必须要排空节点。排空操作会组织开始一个的 flows,但是仍旧允许完成已经存在的 flows。因此当一次排空操作完成的时候,就不应该有任何特别的检查点或者是正在运行的 flows 了。这样升级应用才会成功。
一个节点可以使用 setFlowsDrainingModeEnabled
方法来决定要排空还是不要排空,这个可以通过 shell ,使用标准的 run
命令来调用 RPC 来实现。