Запланированные потоки не выполняются при доступе к одному или небольшому набору состояний Cash - PullRequest
0 голосов
/ 29 ноября 2018

Каков наилучший подход для настройки сценария, в котором выдается один FungibleAsset (например, Cash.State), и ожидается, что несколько запланированных потоков будут использовать его в различных количествах?Хотя я понимаю, что реализации CashSelection помогают создавать изменения, выдерживает ли это сценарий, когда несколько запланированных потоков одновременно получают доступ к состояниям?Например, если существует единственное состояние Cash.State в размере 100 долларов США, и для каждого из них настроено 50 плановых потоков, потребляющих 2 доллара США, как мы можем избежать ситуации, когда нотариус случайно находит государство, которое уже было использовано?

Подобные исключения наблюдаются, когда несколько потоков инициируются вплотную на одном узле и предназначены для одного или небольшого набора состояний.Я работаю с открытым исходным кодом Corda 3.3 с Java версии 1.8.0_131, поверх CentOS Linux.

Вот исключение, которое я вижу:

[WARN] 2018-11-12T18:53: 03,422Z Поток [Node thread-2]. [1ecbfdff-a0b6-4e0e-94d1-95c432822a02] .run - Выполнение потока завершено с исключением {} net.corda.core.flows.NotaryException: Невозможно нотариально заверять транзакцию2DFF6E03F64B7445A4954FFFFFFFFBFBFBFBFBFBFBFBFFFBFBFBFBFBFBFBFBFFFFFFFBFFBFFFBFBFBFFBFF050FF все возможноевходные состояния были использованы в другой транзакции на net.corda.core.flows.NotaryFlow $ Service.call (NotaryFlow.kt: 149) ~ [corda-core-3.3-corda.jar :?] на net.corda.core.flows.NotaryFlow $ Service.call (NotaryFlow.kt: 133) ~ [corda-core-3.3-corda.jar :?] at net.corda.node.services.statemachine.FlowStateMachineImpl.run (FlowStateMachineImpl.kt: 96) [corda-node-3.3-corda.jar :?] at net.corda.node.services.statemachine.FlowStateMachineImpl.run (FlowStateMachineImpl.kt: 44) [corda-node-3.3-corda.jar :?] в совместной параллельной вселенной.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_192] в java.util.concurrent.FutureTask.run (FutureTask.java:266) [?:1.8.0_192] в java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201 (ScheduledThreadPoolExecutor.java:180) [?: 1.8.0_192] в java.util.concurrent.ScheduledThreadPoolExecript[?: 1.8.0_192] в java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1149) [?: 1.8.0_192] в java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor )java[?: 1.8.0_192] at net.corda.node.utilities.AffinityExecutor $ ServiceAffinityExecutor $ 1 $ thread $ 1.run (AffinityExecutor.kt: 62) [corda-node-3.3-corda.jar:?]

1 Ответ

0 голосов
/ 08 декабря 2018

Платформа имеет механизм мягкой блокировки, предотвращающий одновременное использование несколькими потоками одного и того же FungibleAssetNodeVaultService.tryLockFungibleStatesForSpending у нас есть следующая строка:

softLockReserve(lockId, claimedStates.map { it.ref }.toNonEmptySet())

Можете ли вы обновить свой вопрос, чтобы показать, как вы получаете FungibleAsset s из хранилища?

...