【发布时间】:2019-06-11 09:53:07
【问题描述】:
我们目前正致力于在我们的 Cordapp 中集成 Ledger Sync Service:https://github.com/corda/corda-solutions/tree/master/bn-apps/ledger-sync
在我们自己的测试中,我们发现在某些情况下,账本在崩溃后没有成功同步/修复。
我们的测试执行以下操作:
- 节点
A和B相互交易,创建状态S。 - 节点
B崩溃并恢复到不知道S的状态。 - 节点
A创建一个新事务,使用状态S - 节点
B使用账本同步服务恢复所有状态。
在后台,会发生以下情况:当节点A 创建消费状态S 的Tx 时,节点B 还将接收创建状态S 的旧Tx 作为依赖项。从那时起,Tx 记录在节点B 的数据库中,可以通过调用serviceHub.validatedTransactions.getTransaction(txId) 来检索。
但是,查询库中的 CONSUMED 或 ALL 状态不会返回旧状态 S。运行账本同步会报节点不同步,说创建状态S的事务丢失了。
调用修复将无法成功修复,连续运行RequestLedgersSyncFlow 将不断报告丢失的事务。
我不确定这个用例是否真的受支持(在分类帐不同步时创建 Txs),但我认为如果它不是受支持的用例,则很难确保节点不与每个节点进行交易其他节点不同步时。
希望问题清楚,否则我也可以准备并提供测试。
更新: 根据要求,我在这里创建了 Corda Solutions 存储库的一个分支,并添加了一个显示错误的测试:https://github.com/marioschlipf/corda-solutions/commit/fe1ab5917c971fcf9732bf8af7d0f2c1800b5e37
【问题讨论】:
-
如果可能,请添加测试,您能否提供用于查询所有状态的 sn-p。
-
您能否提供有关如何模拟节点崩溃的详细信息? github.com/corda/corda-solutions/blob/… 将跳过节点仍然可用的任何事务(无论是处于缓存状态还是在保险库中)。
-
@Adrian 我添加了一个测试,看我原来的问题
-
@mritz_p 我们正在备份 h2 数据库并在节点关闭的情况下恢复它。我认为这是一个比摆弄 SQL 更强大的测试。但是,我设法通过 R3 在其设置中使用的测试设置展示了该错误。请参阅我原来的问题。编辑:我已经看到你提到的那行代码,删除这个过滤器不会改变任何东西,已经测试过了。
-
@mario.schlipf 不应该是 l 中的断言。 186 是
assertEquals(0, ledgerSyncResult2[node1.fromNetwork().identity()]!!.missingAtRequester.size)。因为你之前运行过恢复?
标签: corda