Допустим, есть два модуля нашей инфраструктуры: Handler.pm и Queries.pm
Queries.pm не является обязательным и загружается при запуске процесса fastcgi
BEGIN {
&{"check_module_$_"} () foreach (Queries);
}
sub check_module_queries {
...
require Eludia::Content::Queries;
...
}
каждая функция модуля загружается в одно общее пространство имен
теперь есть две функции с одинаковым именем (setup_page_content) в Handler.pm и Queries.pm
вызывается setup_page_content в Handler.pm
Похоже, оригинальный автор предположил, что Queries.pm:setup_page_content будет вызываться всякий раз, когда загружается Queries.pm
Иногда этого не происходит: traceback (полученный через caller ()) в этих случаях указывает, что setup_page_content был вызван из модуля Handler.pm
Я зарегистрировал% INC непосредственно перед вызовом, и он содержит Queries.pm и полный путь в этих случаях
Это поведение противоречиво и появляется, как в 2-3% попыток при промышленной установке, в основном, когда я отправляю два параллельных идентичных http-запроса. Из-за большого количества усилий по воспроизведению, я пока не определяю, относится ли это к конкретной установке.
Как будет решаться, какая версия функции с тем же именем будет вызываться?
Это хорошо определенное поведение?
Должна быть причина, автор написал код таким образом
UPDATE
версия perl v5.10.1 built for x86_64-linux-gnu-thread-multi
ОБНОВЛЕНИЕ 2
код: Handler.pm и Queries.pm
Загрузка Queries.pm происходит в check_module_queries (BEGIN {} из Eludia.pm ),
загружается для каждого запроса, используя Loader.pm (через use Loader.pm <params>
)