Добрый день всем.
Недавно я столкнулся с интересной проблемой, связанной с обновлением.
МВА (атрибуты с несколькими значениями).
Первоначальные условия:
- сфинкс-1.10-бета
- сфинкс PHP API
Написал нужную обертку, начал тестировать — все отлично работает. Я даже не мог поверить, что это произошло так быстро – значит, где-то есть подвох.
Я начал тестирование, так сказать, с фанатизмом - и подвох всплыл практически сразу.
При попытке запихнуть в атрибут MVA массив, содержащий более 1022 значений, клиент вылетал с ошибкой « недостаточно памяти пула при обновлении MVA "Начал гуглить.
Оказалось, что эта проблема не нова, и как возможное решение предлагают изменить параметр mva_updates_pool В сфинкс.
conf .
Я пробовал с разными значениями.
Но какое бы значение я там ни ставил, ошибка появлялась снова и снова.
Я решил покопаться глубже и посмотреть исходный код — благо я когда-то писал на C. Я пригласил друга (решил воспользоваться экстремальной практикой программирования), взял пиво и сел отлаживать исходный код. После 2 часов отладки и попивания пивка проблема была найдена.
Оказалось, что в sphinx.cpp есть еще одна проверка, параметры которой из конфига изменить нельзя, а именно:
iбайты — это фактическое количество байт, которое будет выделено в нашем случае под атрибут MVA. И условие iBytes> ( ( 1 << MAX_BITS ) - (int)sizeof(int) ) actually represents an upper limit. To put it simply - a variable MAX_BITS несет ответственность за смену.int CSphArena::RawAlloc ( int iBytes ) { CheckFreelists (); if ( iBytes<=0 || iBytes>( ( 1 << MAX_BITS ) - (int)sizeof(int) ) ) { return -1; } … }
Те.
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 #сфинкс
-
Компания
19 Oct, 24 -
«Радар» — Сервис По Поиску Автошкол
19 Oct, 24 -
Мобильность Образования
19 Oct, 24