stack LTS-8.5) проект, он использует Servant. Пытаюсь обновить до 17.9, уже почти удалось, но вот возникла проблема, посылаю POST-запрос, программа начинает потихоньку выжирать всю память и падает.
Запрос:
curl 'http://localhost:3003/api/private/itinerary/77' -H 'Content-Type: application/json' --data-raw '{"plan_id":270031,"country":"belize"}' --verbose
Насколько я понимаю, должно прийти в этот Endpoint:
type UpdateById = Capture "id" ItineraryId :> PostWithValidation Itinerary Itinerary
updateById :: AppSessionServer UpdateById
updateById id Itinerary{..} = do
liftIO $ putStrLn ("~~~~~~~ updateById ~~~~~~~~~~~~~~~" :: P.String)
runExceptT $ doDb $ do
suid <- requireLoggedInUser
requireAuth (hasCountryRole Reservations itineraryCountry)
pgUpdate id [ ItineraryTrip_name =. itineraryTrip_name
, ItineraryLast_user_id =. Just suid
]
newRec <- pgGet404 id
pure newRec
Но вот до putStrLn дело вообще не доходит.
Если послать кривой запрос, напр., --data-raw '{"plan_id":270031}' (`country обязательно поле) то сервер отвечает ошибкой. Если запустить stack ghci и там сделать JSON.decode "{\"plan_id\":270031,\"country\":\"belize\"} :: Itinerary -- то распарсивает. Поэтому я делаю вывод, что хотя бы парсинг работает корректно.
Но что тогда зависает и выжирает всю память? Как это можно найти? Можно ли как-то получить стектрейсы всех потоков, например? Это бы облегчило дело.
Какая вообще тактика поиска зависаний Servant?
стэктрэйсы включаются ключом RTS -xc в режиме профилирования
Да, при падении всё-таки вывелся стек-трейс. Спасибо! Попробую с этим разобраться...
Обсуждают сегодня