Укажите отработанное время

Отработанное время:
Продуктивное время:
Bug 3237 - Снятие блокировок во время закрытия при работе с windows сервером   Make a simular bug
Summary: Снятие блокировок во время закрытия при работе с windows сервером
Status: CLOSED FIXED
Alias: None
Product: CIFS@Etersoft
Classification: Продукты (Products)
Component: прочее (show other bugs)
Version: не указана
Hardware: PC All
: P4 normal
Target Milestone: ---
Assignee: Денис Баранов
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
In work:
Reported: 2009-01-14 14:27 MSK by Pavel Shilovsky
Modified: 2009-11-21 17:41 MSK (History)
6 users (show)

See Also:
Заявки RT:
Связано с:
Дата напоминания:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Pavel Shilovsky 2009-01-14 14:27:54 MSK
При работе с windows сервером в драйвере cifs отсутствует реализация posix семантики снятия блокировок во время закрытия файла. При закрытии одного из файловых дескрипторов блокировки, привязанные к другим файловым дескрипторам, созданным одним и тем же процессом не снимаются, что противоречит POSIX семантике.
Comment 1 Pavel Shilovsky 2009-01-20 13:02:09 MSK
Решение видится следующее:
построить дерево из пидов, каждому из которых будет соответствовать список блокировок.
Это обеспечит быстрое удаление всех блокировок, привязанных к данному пиду - удаляется узел из дерева.
При удалении же какой-то одной конкретной блокировки, мы просто пробегаемся по списку пида и удаляем все блокировки, находящиеся внутри неё.
Comment 2 Pavel Shilovsky 2009-01-20 14:14:51 MSK
Ветка репозитория, где ведётся работа.

http://git.etersoft.ru/people/piastry/packages/?p=etercifs.git;a=commitdiff;h=d6090073dcf72f3db9e05aa4c7f744f1a20c4c37
Comment 3 Евгений Синельников 2009-01-20 15:40:05 MSK
Думаю, что из рабочего дерева, с которым можно будет куда-то выходить, стоит исключить эскпериментальные коммиты с архаизмами вида '\r' и комментариев со странным кодом:

+int main() {\r
+    int n, m;\r
+    //freopen("input", "rt", stdin);\r
+    //freopen("output", "wt", stdout);\r
+    pid_tree *head = NULL;\r
+    while(1) {\r
+       string s;\r
+       cin >> s;\r
+       if (s == "insert") {\r
+           __u64 pid, offset, len;\r

Да и реализацию функций в заголовочные файлы кидать тоже не стоит... А кроме прочего с локальными функциями не стоит забывать про спецификатор static...

Я бы не хотел видеть код из текущего коммита в своих ветках. Его стоит исправить...
Comment 5 Евгений Синельников 2009-01-20 16:33:57 MSK
(In reply to comment #4)
> Исправлено.
> http://git.etersoft.ru/people/piastry/packages/?p=etercifs.git;a=shortlog;h=refs/heads/lock_on_close
> 

Странные коммиты, я думаю, стоит вообще исключить из истории.
Как быть с кодом в заголовочном файле? Его там быть не должно - это же не C#.
Comment 6 Pavel Shilovsky 2009-01-21 00:56:50 MSK
Разбросал код. Набросал реализацию posix поведения при закрытии файлов. Теперь надо буду тестировать и отлавливать ошибки, если таковые найдутся.
По поводу странных коммитов не вижу ничего страшного если они и будут. Это тестовый репо, не больше, не меньше.
Comment 7 Pavel Shilovsky 2009-01-21 20:06:49 MSK
Переехал в новый бранч.
http://git.etersoft.ru/people/piastry/packages/?p=cifsLockOnClose.git;a=summary
Comment 8 Pavel Shilovsky 2009-01-22 23:00:18 MSK
На локальных своих тестах заработала след функциональность:
Два процесса - 1 и 2
1 открывает файл - дескриптор file1
1 открывает файл - дескриптор file2
2 открывает файл - дескриптор file3
1 устанавливает блокировку через file1
2 пытается установить блокировку через file3, зависая в ожидании
1 закрывает дескриптор file2, 2 - сразу же получает доступ к файлу, устанавливая блокировку на file3

Вышеописанное соответствует поведению posix.
Comment 9 Евгений Синельников 2009-01-30 19:33:11 MSK
(In reply to comment #8)
> На локальных своих тестах заработала след
> функциональность:
[...]
> Вышеописанное соответствует поведению posix.
> 

Нужно сделать соответствующую ветку ядра в нашем git для cifs, а также собрать тестовую сборку etercifs и протестировать с помощью rect.
Comment 10 Konstantin Baev 2009-02-04 19:54:23 MSK
Нашел в коде типа bool (например bool USE_TREE = true; ). С этим на ядрах < 2.6.23 собираться не будет. Надо изменить на unsigned USE_TREE = 1; и проверить собираемость на всех ядрах.
Comment 11 Konstantin Baev 2009-02-04 19:56:59 MSK
... И код отформатирован не так, как он в исходниках ядра форматируется. Вместо табов - пробелы.
Comment 12 Pavel Shilovsky 2009-02-08 17:57:09 MSK
Репозиторий разработки:

http://git.etersoft.ru/people/piastry/packages/?p=cifs-2.6.git;a=summary
все ветки *-locks

Решены проблемы с типами данных и оформлением исходного кода.
Проверена собираемость всех веток.
Comment 14 Elena V. Gurevich 2009-02-09 18:53:21 MSK
etercifs-4.1.1-alt1.testing1
rect-slice-0.0.11-alt1
rect-slave-0.0.11-alt1
python-module-RECT-0.0.11-alt1

Клиенты:
start: LS:tcp -h 192.168.33.9 -p 13666
start: LS:tcp -h localhost -p 13555
start: LS:tcp -h valhalla -p 13666

Сервера:
start: //192.168.33.1/upload
start: //192.168.33.9/share

С опцией forcemand тест на снятие блокировки после закрытия файла (DualSetLockOnLock.testReadAfterCloseAfterLock) падает везде.
Без опции forcemand тест падает только при работе с windows сервером.
Падает на операции saferead после закрытия файла. (Для linux - permission denied) 
Comment 15 Pavel Shilovsky 2009-02-10 10:27:55 MSK
Я правильно понимаю, что первым слейвом использовался слейв на windows? Если это так, то всё правильно, ибо мой патч исправляет posix поведение linux драйвера, а следственно, его и нужно использовать первым слейвом. Тестировать на linux сервере следует только с опцией forcemand, иначе код моего пачта просто не будет выполняться. Но там и так всё работало - и без моего патча.

Тестируйте в след конфигурациях:
L-L on Windows server
L-W on Windows server
(цель патча)

L-L on Linux server
L-W on Linux server
(для проверки на наличие багов)
Comment 16 Elena V. Gurevich 2009-02-10 12:33:21 MSK
Нет. Первым слейвом везде использовался linux.
Получилось как-то все наоборот.
В случае linux-сервера с опцией forcemand тест падал, без нее проходил.
В случае windows-сервера с опцией forcemand тест падал, без нее тоже падал.
Comment 17 Elena V. Gurevich 2009-02-10 12:37:28 MSK
http://wiki.etersoft.ru/RECT/Testtest?v=mk1 - тестовая(временная) страница на вики. Туда сохранила результаты этого теста
Comment 18 Elena V. Gurevich 2009-02-10 17:35:15 MSK
После обновления ядра все заработало: тест прошел
(2.6.27-std-def-alt11)
Comment 19 Konstantin Baev 2009-02-12 13:04:32 MSK
Новая версия со свежими Пашиными изменениями:

У нас:

//server/pub/Boxes/etercifs-testing/noarch/RPMS.defaultet/ercifs-4.1.2-alt1.testing1.noarch.rpm

И в Питере:

ftp://ftp.etersoft.ru/pub/Etersoft/LINUX@Etersoft/Boxes/etercifs-testing/noarch/RPMS.default/etercifs-4.1.1-alt1.testing1.noarch.rpm
Comment 20 Konstantin Baev 2009-02-12 13:05:10 MSK
(In reply to comment #19)

не

> //server/pub/Boxes/etercifs-testing/noarch/RPMS.defaultet/ercifs-4.1.2-alt1.testing1.noarch.rpm

а

//server/pub/Boxes/etercifs-testing/noarch/RPMS.default/etercifs-4.1.2-alt1.testing1.noarch.rpm
Comment 21 Elena V. Gurevich 2009-02-12 15:59:20 MSK
Тот же тест на новом etercifs успешно пройден.
Comment 22 Konstantin Baev 2009-02-12 16:35:27 MSK
(In reply to comment #21)
> Тот же тест на новом etercifs успешно пройден.
> 

Ждем заключения экспертов по вопросу перехода патчей в основную ветку. :)
Comment 23 Pavel Shilovsky 2009-02-13 19:02:00 MSK
Ссылка на страничку данной проблемы:
http://wiki.office.etersoft.ru/testing/cifs/ProblemRemoveLockWin?v=x17
Comment 24 Pavel Shilovsky 2009-02-18 16:51:28 MSK
Проведена проверка кода, обнаружены ошибки.
Comment 25 Pavel Shilovsky 2009-02-20 21:22:20 MSK
Проблемы решены. Последняя версия исходников на git.etersoft.ru
Comment 26 Konstantin Baev 2009-02-24 18:13:39 MSK
(In reply to comment #25)
> Проблемы решены. Последняя версия
> исходников на git.etersoft.ru
> 

Собран пакет ftp://ftp.etersoft.ru/pub/Etersoft/LINUX@Etersoft/Boxes/etercifs-testing/noarch/RPMS.default/etercifs-4.1.2-alt1.testing2.noarch.rpm который ожидает тестирования. Наше тестирование RECTом проблем не выявило и подтвердило ожидаемый эффект от изменений.

Если через неделю проблемы не будут выявлены, то изменения попадут в основную ветку.

Ссылка на гит: http://git.etersoft.ru/people/kipruss/packages/?p=etercifs.git;a=shortlog;h=refs/heads/testing
Comment 27 Konstantin Baev 2009-03-26 15:13:07 MSK
Хотелось бы знать что с этими изменениями делать. Релиз 4.2 он не попал, в отличие от остальных изменений и перед следующим релизом я опять ставлю вопрос про данный патч. Что с ним делать? Было бы здорово получить ответ до понедельника, 30 марта. 
Comment 28 Vitaly Lipatov 2009-03-26 15:40:59 MSK
А можно получить какие-либо замечания о том, почему фигурирует именно Windows-сервер? Проблема, как я знаю, характерна для любого CIFS-сервера.
Comment 29 Pavel Shilovsky 2009-03-26 15:55:43 MSK
Нет. Samba server с включенными linux ext сам снимает блокировки. Если же мы монтируем его шару с опцией forcemand или используем windows сервер, то появляется проблема, описанная в баге.
Comment 30 Vitaly Lipatov 2009-03-26 16:02:12 MSK
(In reply to comment #27)
> Хотелось бы знать что с этими изменениями
> делать. Релиз 4.2 он не попал, в отличие от
> остальных изменений и перед следующим
> релизом я опять ставлю вопрос про данный
> патч. Что с ним делать? 
Включаем в следующую сборку.
Comment 31 Денис Баранов 2009-03-29 18:37:14 MSD
Выставляю статус решена.
Comment 32 Konstantin Baev 2009-03-30 21:08:20 MSD
см. http://bugs.etersoft.ru/show_bug.cgi?id=3755#c1
выпущен 4.3.0, содержащий патчи, решающие данную проблему.