Привет всем. А известным личностям - персонально :)
Совсем персонально ты уже, видимо, боишься :)
Ага - я потом очнулся, чую били ногами. Хорошо что не по голове :-)
Если только insert'ы - да. Однако под бекверсии и фрагменты это место
вполне
может быть задействованно позже.
Да это понятно... Про read-only базы я молчу :-)
----
В целом, там (в dpm.cpp) код какой-то испуганный. У меня вот мысль какая. Ща
изложу, может сам пойму - что возможно гуано придумал.
На pointer-page (PP) хранить
- сведения о размере доступного пространства на data-page
- бит "data-page (DP) заблокирована для alloc-операции"
При выделении места (с привлечением pointer-page)
- эксклюзивно блокируем PP
- ищем data-page которая "не заблокирована для alloc-операции" и имеет
достаточно места
- устанавливаем бит "заблокирована для alloc-операции"
- освобождаем PP
- эксклюзивно блокируем DP (на которую мы нацелились)
- выделяем на ней место
- освобождаем DP
- обратно эксклюзивно блокируем PP
- блокируем DP на чтение (SH-блокировка, вот тут наверное надо циклически
шаманить (с таймаутами) так же как сейчас в mark_full)
- сбрасываем на PP наш битик "заблокировано для alloc-операции", обновляем
данные о доступном пространстве на DP
- освобождаем PP, DP
Вся фигня в этом alloc-битике. Если он застрянет, то data-страница будет
потеряна для повторного использования. Но я так полагаю что это не самое
страшное что могет произойти с БД.
Конечно и PP теперь будет описывать меньше data-страниц. Но зато теперь
получается более точное зондирование и нормальная синхронизация........
Вот. Вывалил кучу гуана в ответ на "будьте здоровы" :-)
Коваленко Дмитрий.