July 12th, 2019

сто друзей

Сетевым пограмистам посвящается (немного про Net-snmp)

В документации сказано:
===============
Restrictions on Multi-threaded Use of the SNMP Library
2. The MIB parsing functions use global shared data and are not
multi-thread safe when the MIB tree is under construction.
Once the tree is built, the data can be safely referenced from
any thread
.
===============

Пгастити, написан бред. Простой пробег по уже закачанному дереву будет в целом беcпроблемным.
Но вот как только вам потребуется несуществующий модуль (FOO:sysDescr, админ описался, бывает) или хвост oid-а будет заполнен instance (ifEntry.bar), которого нет в MIB (это распространено у циски, они любят name запихнуть в виде индекса), тут вы и отгребёте все прелести при наличии в приложении threads. Модуль не будет грузиться из файла, нет, до такого бригада кодеров не дошла всё-таки, но set на global будет. Со всеми вытекающими.

В общем, хочется символьности в oid - парсить в одно лицо с локом. Цифрами - безопасно.

Perl-модуль, кстати, тоже подвержен. Спасает только то, что переключения контекста там, как мне помнится, за пределами XS, так что по идее не должно падать, ну и пока не падало вроде.
Python-модуль вам на домашнее задание.

Патч не буду писать, там api менять надо. С нуля тоже нету времени.

p.s. Ах да, фича -Ib (snmpcmd(1)) также имеет родовую травму, там даже более кучеряво, падает просто сразу, общая области памяти, Julio.