mirror of
https://github.com/isar/libmdbx.git
synced 2024-12-28 18:28:49 +08:00
6c56ed97bb
При обновлении GC, с помещением/возвратом страниц, возникает рекурсивная зависимость, так как страницы, необходимые для CoW-модификации GC и размещения списков возвращаемых страниц, берутся/выделяются из этих-же списков и/или из GC. Эта рекуррентная зависимость разрешается путём подготовки необходимого запаса страниц и двух-стадийным заполнением списков, с повторением всего цикла при изменении ситуации/расклада, плюс применение некоторых эвристик и поправок. Кроме корректной работы, принципиально важным тут является минимизация количества повторов/рестартов процесса, в том числе исключение возможности бесконечного зацикливания. Существующая реализация многократно/итеративно дорабатывалась. Поэтому она неплохо обкатана и стабильна, но одновременно сложна и запутана. Тем не менее, до последнего момента для текущей реализации были известны условия/сценарии, в которых сходимость итеративного процесса обновления GC нарушалась и при фиксации транзакции возвращалась ошибка MDBX_PROBLEM. Эти условия/сценарии очень специфичны и далеки от реальных практических случаев, поэтому этот недостаток не мешал использованию библиотеки. Этим коммитом добавляется и активируется еще один механизм нацеленный на улучшение сходимости и минимизацию повторов/рестартов. Суть механизма в формировании и учета поправки, которая на следующем цикле позволит учесть все переходные процессы/затраты вне зависимости от их природы, и этим обеспечить моментальную сходимость. В текущем понимании, описанный выше недостаток полностью устраняется/исправляется этим коммитом.