одна для запросов, другая для ответов.
pull'
:: MonadSTM m
=> TQueue m (ChainSyncRequest block)
-> TQueue m (ChainSyncResponse block)
-> m (LedgerUpdate block)
pull' outQ inQ = atomically $ do
writeTQueue outQ $ RequestNextReq RequestNext
readTQueue inQ <&> extractUpdate
При использовании получаю сообщение о том, что в этом месте thread blocked indefinitely in an STM transaction.
Не пойму где здесь лок возникает?
В inQ кто-то пишет?
Так если он не пишет, то вот это тред ждет
Да, дело не в дедлоке. Убрал тред с клиентом который с обратной стороны взаимодействовал с этими очередями и всё равно ловлю эту ошибку. Я тогда видимо чего то не понимаю о STM. Я как раз и одидал от readTQueue семантической блокировки до тех пор пока элемент не будет доступен.
Не хватает минимального воспроизводимого примера, ну или всего кода, который есть
Трейс ошибки указывает сюда https://github.com/ergolabs/cardano-dex-backend/blob/bfd0f26ffdfbc2c18a189f2edf01bcf3ff143b22/ledger-sync/src/Spectrum/LedgerSync.hs#L117
> Убрал тред с клиентом который с обратной стороны взаимодействовал с этими очередями Так в итоге пишет кто-то в inQ или нет? > Я как раз и одидал от readTQueue семантической блокировки до тех пор пока элемент не будет доступен. Так и есть по идее, но с оговоркой что если элемент точно никогда уже не будет доступен то рантайм пришлет (может прислать, если быть точнее, deadlock detector ничего не гарантирует IIRC) эксепшн
После того как убрал клиент никто не пишет
Обсуждают сегодня