Сигналы в реальном времени из нескольких файлов, сданных в аренду через F_SETLEASE одному арендатору, теряются - PullRequest
0 голосов
/ 22 марта 2020

Как настроить надежное уведомление о сигнале перерыва аренды в реальном времени для одного процесса, который удерживает аренды для нескольких файлов?

Вот контекст и проблема:

  • При получении аренды с помощью fcntl (fd, F_GETLEASE, ...) для файла, открытого с помощью файлового дескриптора fd, можно указать сигнал в реальном времени, например, fcntl (fd, F_SETSIG, SIGRTMIN + 6), который будет доставлен в владелец аренды, когда нарушитель аренды открывает или усекает файл.

  • Документация Linux говорит, что сигналы в реальном времени помещаются в очередь ядром. Таким образом, можно ожидать, что SIGRTMIN + 6 будет поставлен в очередь, когда несколько прерывателей аренды посылают сигнал одному и тому же арендатору.

  • В моих экспериментах действительно верно, если арендатор держит арендовать для одного дескриптора файла, даже если иногда владелец аренды блокирует, а затем разблокирует SIGRTMIN + 6. Однако, если он удерживает аренды для нескольких файлов fd1, fd2, ..., а также иногда блокирует и разблокирует SIGRTMIN + 6, то SIGRTMIN + 6 от взлома некоторых из fdK никогда не доставляется.

1 Ответ

0 голосов
/ 01 апреля 2020

Я до сих пор не знаю ответа на этот вопрос. Еще одна подсказка заключается в том, что однажды во время стресс-теста ядро ​​ОС (Ubuntu 16.4 на Intel) зафиксировало ошибку внутреннего утверждения где-то глубоко внутри кода обработки аренды ядра. Похоже, это указывает на возможную внутреннюю проблему ОС с обработкой сигналов во время блокировки сигналов во время арендных перерывов.

Тем не менее, было возможно изменить дизайн приложения таким образом, чтобы код, который необходимо было защитить от прерывания по SIGRTMIN + 6 был перемещен в другой процесс. Оставшаяся программа, которая теперь никогда не пытается заблокировать SIGRTMIN + 6, работает нормально - ее обработчик сигналов корректно перехватывает все сигналы от прерывателей сигнала.

...