Возможно ли для любого потока применить softLock для двух пользователей одновременно к одному и тому же состоянию? - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь программно заблокировать состояние в потоке, как только оно будет выбрано из хранилища, и затем выполнить параллельный запрос, используя Jmeter, чтобы проверить это. Проблема в том, что, если я выполняю запросы для 5 потоков, блокировка применяется к одному и тому же состоянию двумя потоками, что приводит к исключению нотариуса. Другие 3 потока работают нормально и генерируют пользовательское исключение потока (которого я хочу добиться).

public void applySoftLock(UUID id, StateRef states, ServiceHub serviceHub, Logger logger) throws FlowException {
        try {
            logger.info("Concurrent Execution - Applying soft lock : " + states.getTxhash().toString());
            logger.info("Concurrent Execution - HASH of the state is : " + states.hashCode());
            synchronized (states){
                serviceHub.getVaultService().softLockReserve(id, NonEmptySet.of(states));
            }
            logger.info("Concurrent Execution - Soft lock applied");
        }
        catch (Exception e) {
            logger.error("Concurrent Execution - In progress.Please try after some time. "+ e.getMessage());
            throw new FlowException("Concurrent Execution - Generic Exception: " + e.getMessage());
        }
    }

Ниже приведены журналы, которые печатаются после применения softLock.

February 28th 2020, 12:02:32.096    cordanode   host-dev    06:32:32.095 [Node thread-1] INFO  somepackage.someFlow - Concurrent Execution - State locked: c6a7aa91-eb04-4243-a556-71db955b1d6c  with softLockUUID : 4a1e5cf8-6f36-4c29-bc29-86951ed30b7f
February 28th 2020, 12:02:30.978    cordanode   host-dev    06:32:30.977 [Node thread-1] INFO  somepackage.someFlow - Concurrent Execution - State locked: c6a7aa91-eb04-4243-a556-71db955b1d6c  with softLockUUID : 53e6729c-caaa-45df-b230-a7fb1001ea2d

Примечание: также пытался использовать блок synchronized, но это тоже не помогло.

Если кто-то сталкивался с той же проблемой или смог ее решить, поделитесь ссылкой или примерами того, как избежать net.corda.core.flows.NotaryException: Unable to notarise transaction и успешно применить softLock.

Спасибо

1 Ответ

0 голосов
/ 01 мая 2020

Сначала давайте подумаем, когда обновляется состояние? Государство будет нотариально заверено и обновлено в потоке окончательности. Это происходит в следующем порядке:

1) Получение нотариально заверенного

2) широковещательной передачи сторонам и запись в бухгалтерскую книгу

Так что, если любая другая транзакция пытается получить доступ / изменить штат, нотариус будет править как двойные расходы. Вам не понадобится мягкая блокировка для процесса.

Невозможно иметь гоночную проблему при обновлении состояний.

...