Безопасна ли реализация MaxMind GeoIP C? - PullRequest
0 голосов
/ 05 декабря 2011

Предположим, что процесс использует MaxMind GeoIP C API во многих отдельных потоках. Безопасны ли одновременные вызовы на GeoIP_record_by_addr? Предположим, что это единственный процесс, одновременно обращающийся к данным, и используется один дескриптор GeoIP.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 16 января 2013

Согласно собственным документам MaxMind, он безопасен только для потоков, если вы не используете опцию GEOIP_CHECK_CACHE.Это означает, что библиотека не будет проверять наличие обновлений базы данных на диске с помощью проверок mtime.Для долго работающего приложения, если вам нужны свежие данные, вам необходимо:

  • Периодически перезапускать приложение
  • Выполнять собственные проверки mtime и перезагружать через GeoIP_open () -введите вызовы, но для этого потребуется настроить собственный мьютекс для защиты перезагрузки / замены вашего общего дескриптора GeoIP, поэтому в этот момент вы выполняете полную защиту потока самостоятельно.Вы также можете включить GEOIP_CHECK_CACHE и использовать мьютекс, чтобы в первую очередь защитить все и избежать необходимости писать собственный код перезагрузки.

Две другие второстепенные функции также не являются поточно-ориентированными независимо от GEOIP_CHECK_CACHE:

  • Если вы используете информацию о сетевой маске (а не все), функции поиска возвращают ее только путем установки gi-> netmask для самого дескриптора GeoIP, поэтому очевидно, что маска общего доступа общего дескриптора выиграла 't всегда дает правильные значения для «самого последнего» поиска из одного и того же потока.
  • Очевидно, что любое использование интерфейсов итераторов для GeoIPCity (GeoIP_next_record ()) также будет небезопасным, так как состояние итератора сохраняетсяв общем дескрипторе.

Я мог бы пропустить другие проблемы в моем кратком анализе, но ИМХО более прагматично использовать либо дескриптор GeoIP для каждого потока, либо обернуть весь доступ к общему дескриптору самостоятельно.мьютекс, а затем вы можете использовать все функции и сделать это для перезагрузки на основе mtimeдля вас.

0 голосов
/ 12 декабря 2011

У меня было время исследовать GeoIP API, и похоже, что обработка базы данных является поточно-ориентированной.Доступ к памяти или памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...