1C 7.70.027, wine@etersoft.sql 1.0.8n-1.0.9b, ubuntu 7.04 При попытке записать файл *.mxl или *.txt из 1С поверх уже существующего (можно просто открыть файл и нажать кнопку "сохранить") 1С выводит сообщение: "Общая файловая ошибка при доступе к" файлу. При этом файл в каталоге исчезает. Проблема возникает при работе с файлами в каталоге смонтированном по cifs. При перезаписи в локальных каталогах проблемы нет. Перезапись *.ert файлов в любой каталог также проходит нормально. 1С в файловом режиме нормально работает с этим же каталогом.
Надо нам создать постоянную тестовую площадку для тестирования linux-cifs.
Подтверждаю.
Насчёт удаления так же подтверждаю. Почему-то вызывается функция CreateFileW с FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE ( удалить файл ).
А если запретить удалять этот файл, то будет ошибка "Доступ к файлу закрыт"
Жду тестовой площадки..
Классно!! Открываю в Конфигураторе эту БД, смонтированную по cifs, далее создаю текстовый файл, сохраняю его, затем нажимаю ещё раз сохранить, заменяю этот текстовый файл и после диалога подтверждения замены: В ww и wine: "Общая файловая ошибка .." и падение с : handled exception: page fault on write access to 0x5841594c in 32-bit code (0x013c45df). Register dump: CS:0073 SS:007b DS:007b ES:007b FS:0033 GS:003b EIP:013c45df ESP:0034f6f4 EBP:0034f94c EFLAGS:00010206( - 00 - RIP1) EAX:0154586c EBX:0034f940 ECX:015457b0 EDX:0011c858 ESI:0034f918 EDI:0011c748 Stack dump: 0x0034f6f4: 0034f6f8 5f45a5d7 00000001 5f45a653 0x0034f704: 0034f940 2301f6e8 23003789 015449e0 0x0034f714: 5f49c568 00000001 5f49ba70 00000001 0x0034f724: 00000000 00000000 00000000 00000001 0x0034f734: 00000000 00000000 00000000 00000000 0x0034f744: 00000000 7eb428f0 00000000 00000000 Backtrace: =>1 0x013c45df (0x0034f94c) 2 0x5f460a64 in mfc42 (+0x60a64) (0x0034f968) А в wwo: Всё сохраняется корректно !!!!
race:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\2.txt" trace:file:wine_nt_to_unix_file_name #0001 trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt" trace:file:MoveFileWithProgressW (L"F:\\1SBDemo\\MFCe287.tmp",L"F:\\1SBDemo\\2.txt",(nil),(nil),0002) trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\MFCe287.tmp",0x34eef0,(nil),(nil)) trace:file:RtlDosPathNameToNtPathName_U ptr = L"?4???4???4???????4?4???4???4??" trace:file:RtlDosPathNameToNtPathName_U dos_path = 0x43 trace:file:RtlGetFullPathName_U (L"F:\\1SBDemo\\MFCe287.tmp" 520 0x34ebc4 (nil)) trace:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\MFCe287.tmp" trace:file:wine_nt_to_unix_file_name #0001 trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\MFCe287.tmp" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/MFCe287.tmp" trace:file:wine_nt_to_unix_file_name (null) trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\MFCe287.tmp" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/MFCe287.tmp" trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\2.txt",0x34eef0,(nil),(nil)) trace:file:RtlDosPathNameToNtPathName_U ptr = L"" trace:file:RtlDosPathNameToNtPathName_U dos_path = 0x74 trace:file:RtlGetFullPathName_U (L"F:\\1SBDemo\\2.txt" 520 0x34ebc4 (nil)) trace:file:RtlDosPathNameToNtPathName_U ptr = L"F:\\1SBDemo\\2.txt" trace:file:wine_nt_to_unix_file_name #0001 warn:file:wine_nt_to_unix_file_name L"2.txt" not found in /home/vostok/.wine/dosdevices/f:/1SBDemo trace:file:wine_nt_to_unix_file_name L"?" warn:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt" required a case-insensitive search trace:file:wine_nt_to_unix_file_name L"\\??\\F:\\1SBDemo\\2.txt" -> "/home/vostok/.wine/dosdevices/f:/1SBDemo/2.txt" trace:file:FILE_SetDosError errno = 26 Текстовый файл занят warn:file:FILE_SetDosError unknown file error: Текстовый файл занят trace:file:DeleteFileW L"F:\\1SBDemo\\MFCe287.tmp" trace:file:RtlDosPathNameToNtPathName_U (L"F:\\1SBDemo\\MFCe287.tmp",0x34e83c,(nil),(nil))
Необходимо написать тест на функцию MoveFileWithProgressW для файлов, которые находятся на смонтированном по cifs каталоге ( cellar : /mnt/cifs/ ). С 1с 7.7 бага упрощено воспроизводится следующим образом: 1. Открыть из конфигуратора любой файл, находящийся на смонтированном по cifs. 2. Сохранить его (можно просто по ctrl+s) - получим сообщение об ошибке доступа, но 1с не упадёт. 3. Если второй раз сразу сохранить, то сохранение пройдёт успешно.
Created attachment 334 [details] исходник тестовой программы, воспроизводящей багу Тест проходит в локальном каталоге, но проваливается в cellar : /mnt/cifs/
Created attachment 335 [details] исходник тестовой программы, воспроизводящей багу Переписал так, чтобы имя файла можно было передавать аргументом
Created attachment 336 [details] Скрипт, выполняющий 2 теста Скрипт для shell. Запускает тест в разных директориях: 1) локальной 2) cellar: /mnt/cifs/tmp
Created attachment 337 [details] исходник тестовой программы, воспроизводящей багу Исправил ошибку в тесте
Ошибку выдаёт функция rename, находящаяся в MoveFileWithProgressW(). Так что MoveFileWithProgressW работает нормально
(In reply to comment #13) > Ошибку выдаёт функция rename, находящаяся в > MoveFileWithProgressW(). > Так что MoveFileWithProgressW работает нормально Можно ли упростить тест так, чтобы он напрямую использовал rename и показывал ошибку?
(In reply to comment #14) > Можно ли упростить тест так, чтобы он > напрямую использовал rename и показывал > ошибку? > А это целесообразно для того случая, если мы собираемся этот тест отправлять в WineHQ? Т.к. rename не WinAPI функция, то кросстест для этой функции сделать будет невозможно.
Сделал похожий тест для функции rename(). В итоге: тест проходит в локальном каталоге, но проваливается в cellar:/mnt/cifs/
Написал тест к rename() для gcc. Тест проходит!
Виталик предположил, что файл может не успевать закрываться перед перемещением. Попробовал поставить задержку (3 с) перед перемещением - ничего не изменилось.
Нашёл багу. В начале MoveFileWithProgressW() открывает исходный файл, на забывает его закрыть. Добавление функции закрытия файла решает проблему. Надо ещё проверить копирование файла между 2-мя файловыми системами
при копировании с локальной ФС на cifs тест проваливается rename() не может копировать между разными ФС, но если она проваливается, там стоит код, который копирует в новый файл, затем удаляет старый. Но этот код не выполняется, там стоит условие: if (errno == EXDEV && (flag & MOVEFILE_COPY_ALLOWED)) которое не выполняется
Забыл в тесте вызывать функцию с MOVEFILE_COPY_ALLOWED