Sphinx: Увеличение Максимального Размера Mva

Добрый день всем.

Недавно я столкнулся с интересной проблемой, связанной с обновлением.

МВА (атрибуты с несколькими значениями).

Первоначальные условия:

  • сфинкс-1.10-бета
  • сфинкс PHP API
В рамках задачи мне нужно было реализовать оперативное обновление атрибутов mva. С начала всё казалось довольно просто — берём функцию ОбновлениеАтрибутов() из php API и напишите необходимые обновления.

Написал нужную обертку, начал тестировать — все отлично работает. Я даже не мог поверить, что это произошло так быстро – значит, где-то есть подвох.

Я начал тестирование, так сказать, с фанатизмом - и подвох всплыл практически сразу.

При попытке запихнуть в атрибут MVA массив, содержащий более 1022 значений, клиент вылетал с ошибкой « недостаточно памяти пула при обновлении MVA "Начал гуглить.

Оказалось, что эта проблема не нова, и как возможное решение предлагают изменить параметр mva_updates_pool В сфинкс.

conf .

Я пробовал с разными значениями.

Но какое бы значение я там ни ставил, ошибка появлялась снова и снова.

Я решил покопаться глубже и посмотреть исходный код — благо я когда-то писал на C. Я пригласил друга (решил воспользоваться экстремальной практикой программирования), взял пиво и сел отлаживать исходный код. После 2 часов отладки и попивания пивка проблема была найдена.

Оказалось, что в sphinx.cpp есть еще одна проверка, параметры которой из конфига изменить нельзя, а именно:

   

int CSphArena::RawAlloc ( int iBytes ) { CheckFreelists (); if ( iBytes<=0 || iBytes>( ( 1 << MAX_BITS ) - (int)sizeof(int) ) ) { return -1; } … }

iбайты — это фактическое количество байт, которое будет выделено в нашем случае под атрибут MVA. И условие iBytes> ( ( 1 << MAX_BITS ) - (int)sizeof(int) ) actually represents an upper limit. To put it simply - a variable MAX_BITS несет ответственность за смену.

Те.

Iбайт по сравнению с 2^MAX_BITS - 4 (для 32-битной версии) и с 2^MAX_BITS - 2 для 16-битной версии.

Значение MAX_BITS жестко запрограммировано и равно 12. Таким образом, можно вычислить максимальное количество значений int, которые можно запихнуть в атрибут MVA. Мы предполагаем, что int занимает 4 байта.

4092/4 = 1023. Вот мы и получили свой предел.

Тем самым увеличивая значение MAX_BITS мы можем увеличить максимальную длину атрибута MVA. Жаль, что в коде он объявлен как константа, т.е.

мы не можем указать его в конфиге без правки исходников.

Те.

Пришлось увеличить эту константу и перестроить ее заново.

Но самое главное, что проблема решена.

Теги: #сфинкс #MVA #php #сфинкс

Вместе с данным постом часто просматривают: