Bug 5643

Summary: Не освобождаются дескрипторы файлов при использовании функции "КомандаСистемы" в 1С
Product: WINE@Etersoft Reporter: Шеледа Константин <itkostik>
Component: Файловые операцииAssignee: Александр Морозов <amorozov>
Status: CLOSED FIXED QA Contact: Денис Баранов <baraka>
Severity: critical    
Priority: P4 CC: amorozov, kondratyuk, lav, nechaev, vitperov
Version: 1.0.12   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 5633    
Attachments: Обработка 1С, файл конфигурации и отчет с описанием ошибки

Description Шеледа Константин 2010-06-08 04:29:24 MSD
Created attachment 1725 [details]
Обработка 1С, файл конфигурации и отчет с описанием ошибки

Версия Wine: WINE@Etersoft 1.0 SQL 1.0.12-eter5.1/4
ОС: Linux Ubuntu 8.04 LTS x32
Версия ядра: 2.6.24-24-server

Описание ошибки:
В нашей организации на одном из участков учета ТМЦ используется платформа 1С Предприятие 7.7. В ходе работы пользователя происходит частая запись файлов на диск и вызов внешних скриптов через функция «КомандаСистемы». После выполнения определенного количества таких операция (запись файлов на диск, вызов внешнего скрипта) возникает ошибка в, после которой сеанс работы 1С либо совсем зависает, либо продолжает работать, но при этом становятся недоступны файловые ресурсы, т.е. содержимое логических дисков (C, D и т.д.) не отображается и дальнейшая работы тоже невозможна.

Опытным путем удалось установить, что ошибка никак не связана с конкретной конфигурацией 1С, т.е. она возникает даже при работе в чистой конфигурации. Для моделирования этой ошибки была написана небольшая обработка под 1С Предприятие 7.7, которая в цикле производит запись файлов и вызов внешних команд (скриптов). После длительной работы с данной обработкой удалось установить, что ошибка возникает именно после использования функции КомандаСистемы, т.е. ошибка возникает после выполнения определенного количества вызовов.

Периодичность возникновения данной ошибки удалось сократить путем увеличения лимита количества открытых файлов на один процесс. Однако, суть вопроса в том, почему не закрываются файлы. В обработке, которая прилагается к данному отчету вызов внешних команд производится итерационно, но в нашей практической работе вызов внешних команд производится периодически. Периоды между вызовами различные, от 2-3 минут до 1 часа и более.

Данная ошибка также происходит при работе на платформе 1С Предприятие 8.2. Для имитации данной ошибки была написана обработка аналогичная той, которая использовалась для моделирования ошибки под 1С Предприятие 7.7.

Для моделирования ошибки прилагаем к данному отчету обработку 1С, внешний скрипт и файл чистой конфигурации (MD файл). Файл скрипта необходимо поместить в каталог с информационной базой. 

Вопрос: Почему не происходит закрытие файлов и освобождение файловых дескрипторов.
Comment 1 Александр Морозов 2010-06-09 21:23:33 MSD
Проблема связана с тем, что согласно POSIX close() должен сбрасывать файловые блокировки, а в Windows блокировки сохраняются, пока процесс не закроет последний хэндл файла. WINE для сохранения блокировок вынужден не закрывать открытые файловые дескрипторы, пока Windows-программа не закроет последний соответствующий файлу хэндл.

При выполнении приаттаченной обработки большое число раз открываются ole32.dll и rpcrt4.dll. Увидеть это можно с помощью следующей функции:
function print_fd() {
echo -n 'ole32: '; ls /proc/$1/fd -l | grep ole32 | wc -l;
echo -n 'rpcrt4: '; ls /proc/$1/fd -l | grep rpcrt4 | wc -l;
echo -n 'all: ' ; ls /proc/$1/fd -l | wc -l; }
Если выполнить её в shell-е с аргументом, равным pid`у wineserver`а. После каждого выполнения обработки число загруженных dll увеличивается, пока не будет достигнут лимит.

Сделал исключение для dll. Думаю, что SHARE-флаги и блокировки для них всё равно никто не использует.

Бутылка: 1c77/1c77-5643
Патч:
Disable locks and sharing flags support for dlls (eterbug #5643).
Comment 2 Нечаев Максим 2010-06-15 03:58:49 MSD
Вопросы:
1. Можно ли обойти как-либо эту проблему в текущей версии wine? Если да, то как?
2. Если нет, то в какую версию wine войдет данный патч? Когда она будет доступна для пользователей?
Comment 3 Александр Морозов 2010-06-15 13:45:05 MSD
> 2. Если нет, то в какую версию wine войдет
> данный патч? Когда она будет доступна для
> пользователей?

Уже должна быть доступна как testing (открытая часть 6.2).