вот довольно крутая проблема.
У меня есть скрипт Python (основной), который вызывает модуль Python (foo.py), который, в свою очередь, вызывает другой модуль Python (barwrapper.py), который использует LoadLibrary для динамического открытия и доступа к библиотеке libbar.so.
libbar и вся остальная цепочка открывают и создают файлы для выполнения своей задачи. Проблема возникает, когда мы запускаем rmtree в основном скрипте Python, чтобы избавиться от временного каталога, созданного импортированными модулями. rmtree вызывается в конце скрипта, непосредственно перед выходом. Вызов завершается неудачно, потому что каталог содержит .nfs-whatever
скрытых файлов, которые, как я полагаю, являются удаленными файлами. Эти файлы, по-видимому, остаются открытыми в коде, что вынуждает nfs перемещать их в эти файлы .nfs-whatever
до тех пор, пока дескриптор файла не будет освобожден. Эта ситуация не возникает в других файловых системах, потому что файлы, связанные с удерживаемыми дескрипторами, фактически удаляются, но остаются доступными для ядра до тех пор, пока дескриптор не будет закрыт.
Мы сильно подозреваем, что библиотека .so пропускает файловые дескрипторы, и эти незакрытые файлы портят вечеринку rmtree во время очистки. Я думал о выгрузке файла .so в barwrapper, но, видимо, нет способа сделать это, и я не уверен, действительно ли dynloader удалит библиотеку из пространства процесса и закроет дескрипторы или просто пометит ее как незагруженную и все, ждет замены на другой хлам, но с просочившимися дескрипторами.
Я действительно не могу придумать другие обходные пути решения проблемы (кроме исправления утечек, чего мы не хотели бы делать, поскольку это сторонняя библиотека). Понятно, что это происходит только на nfs. У вас есть идеи, что мы можем попытаться исправить это?