Привет всем. А известным личностям - персонально :)

   Совсем персонально ты уже, видимо, боишься :)

Ага - я потом очнулся, чую били ногами. Хорошо что не по голове :-)

Если только 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-страниц. Но зато теперь получается более точное зондирование и нормальная синхронизация........

Вот. Вывалил кучу гуана в ответ на "будьте здоровы" :-)

Коваленко Дмитрий.

Ответить