Summary: | 1С 7.7 "Общая файловая ошибка при доступе к" файлу | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Антон Азанов (Djelf) <aae> |
Component: | Файловые операции | Assignee: | Виталий Перов <vitperov> |
Status: | CLOSED FIXED | QA Contact: | |
Severity: | critical | ||
Priority: | P5 | CC: | baraka, boris, lav, saa, vostok |
Version: | 1.0.8 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Ubuntu | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 777 | ||
Attachments: |
исходник тестовой программы, воспроизводящей багу
исходник тестовой программы, воспроизводящей багу Скрипт, выполняющий 2 теста исходник тестовой программы, воспроизводящей багу |
Description
Антон Азанов (Djelf)
2008-01-25 16:10:51 MSK
Надо нам создать постоянную тестовую площадку для тестирования 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 |