Bug 2041

Summary: Завершить минимальный функционал для сервиса RECT
Product: WINE@Etersoft Reporter: Евгений Синельников <sin>
Component: ОбщееAssignee: Ivan Melnikov <imelnikov>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: kipruss, lav, sin
Version: unspecified   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 1889    

Description Евгений Синельников 2008-07-02 16:31:53 MSD
Осталось реализовать логику прозрачной работы с "общими папками". Предложена идея использовать UNC пути в Unix нотации:
//server/shara/directory/file

При этом необходимо добавить два метода
Mount и Umount
А также стоит подумать об UmountAll() или совмещении его с CloseAll() в нечто вроде Reinit(), хотя так менее гибко... 

Пример:
Нужно удалённо обратиться к файлу //server/pub/file
Пишем:
SlavePrx.CloseAll()
SlavePrx.UmountAll()
SlavePrx.Mount("//server/pub")
SlavePrx.open("//server/pub/file",READ,OPEN)
........


При этом такое API должно быть идентично как для Linux, так и для Windows.
Для Linux Mount("//xxx/yyy") выполняет:
sudo mount -t //xxx/yyy $BASEDIR/xxx/yyy

Для Windows - в зависимости от настроек, либо ничего не выполняет, либо выполняет:
net use..... запоминает букву, а при запросах, например open(), подменяет шару на букву.... Разделители (слеш '/') в путях с unix нотацией, в сервисе под Windows заменяются на обратные....
Comment 1 Евгений Синельников 2008-07-03 15:14:36 MSD
Базовая логика уточнена... Готовимся проверять rect-0.0.3
Comment 2 Ivan Melnikov 2008-07-03 21:04:49 MSD
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/ очередная версия rect, 0.0.3

Работает монтирование, написаны простейшие тесты для примера.

Необходимо ещё потестировать функционал, связанный с локами.
Comment 3 Евгений Синельников 2008-07-05 11:21:50 MSD
В python-module-Ice найдена проблема, с записью 0 указателя в прокси вместо возврата None из функций propertyToProxy() и stringToProxy(). Проблема мешала при использовании тестов - возникала трудноотслеживаемая ситуация при запросах к объектам, которых ещё не было... Например, при запрсах к ещё не запущенным сервисам на других хостах.

Проблему можно повторить так:
$ python
Python 2.5.1 (r251:54863, Feb  8 2008, 15:19:12)
[GCC 4.1.1 20070105 (ALT Linux, build 4.1.1-alt12)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Ice
>>> c = Ice.initialize()
>>> p = c.propertyToProxy("AAAAAAA")
>>> p
terminate called after throwing an instance of 'IceUtil::NullHandleException'
  what():  N7IceUtil19NullHandleExceptionE
Аварийный останов

исправленный вариант лежит в git.etersoft и git.altlinux:
http://git.etersoft.ru/people/sin/packages/python-module-Ice.git
(История пакета объеденина и историей старого python-module-ice).
Comment 4 Ivan Melnikov 2008-07-05 14:51:36 MSD
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/
очередная версия rect, 0.0.4

Улучшения коснулись исправления обнаруженных в предыдущей версии проблем и работоспособности "из коробки"

Осторожно: функционал, связаный с блокировками, по прежнему не тестировался...
Comment 5 Konstantin Baev 2008-07-07 20:30:12 MSD
Нашел следующую ошибку:
0. Исходные файлы неизменны - из твоего rect.git на данную минуту. Все работает.
1. В файле examples/readwrite.py закомментируем строку 25 - это закрытие файла после записи в него в процедуре _testReadWriteFile
1a. По идее строка 37 в файле examples/rectc.py, а именно self.slave.closeAll() должна исправить ситуацию.
2. Но имеем следующее:

2a. вывод на клиентской стороне:

[kipruss@localhost tests]$ ./readwrite.py
======================================================================
ERROR: testMounts (__main__.TheTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./readwrite.py", line 40, in testMounts
    self.slave.umount(self.share)
  File "../slice/linux.ice", line 297, in umount
Error: exception ::RECT::Linux::Error
{
    reason = Failed: unmounting share
    code = 65280
}

----------------------------------------------------------------------
Ran 2 tests in 1.506s

FAILED (errors=1)
[kipruss@localhost tests]$   

2b. вывод на серверной стороне:

creating mountpoint: mkdir -p '/tmp/rect//server/upload'
mounting share: cifsmount //server/upload /tmp/rect//server/upload -o guest
Opening file: /tmp/rect//server/upload/test.dat
        fd = 10
Opening file: /tmp/rect//server/upload/test.dat
        fd = 12
Closing file fd = 12
unmounting share: cifsumount '/tmp/rect//server/upload'
Closing file in cleanup, fd = 10
unmounting share: cifsumount '/tmp/rect//server/upload'
Opening file: test.dat
        fd = 10
Opening file: test.dat
        fd = 12
Closing file fd = 12
Closing file in cleanup, fd = 10

Файл в итоге не закрылся, посему и отмонтирование неудачно.
Comment 6 Ivan Melnikov 2008-07-08 12:15:50 MSD
(In reply to comment #5)

Кратко: this behaviour is by design.

Подробнее:

клонируем мой репозиторий, собираем slave, запускаем.
комментируем строку 25 в readwrite.py

Что происходит?

1. файл открывается в строке 22
2. файл не закрывается
3. self.slave.umount в строке 40 выбрасывает исключение
4. unittest считает это ошибкой -- тест провален
5. и тем не менее вызывает SingleSlaveTest.tearDown(...),
   который призван не "исправить", а "собрать мусор" (подчистить),
   что он и делает:
6. slave закрывает файл (сообщение Closing file in clean-up, fd = ...),
7. slave отмонтирует шару
8. но, тем не менее, запись о ней остается в mtab из-за бага в cifsumount

В том, что шара отмонтировалась, легко убедиться, сделав  cat /proc/mounts

Comment 7 Konstantin Baev 2008-07-10 18:05:12 MSD
Создан простейший набор тестов для rect, который тестирует, в том числе и блокировки. Пока они ведут себя предсказуемо.

Создан новый гит-репозиторий, чтобы не мешать в одну кучу код серверной части и тестов.

http://git.etersoft.ru/people/kipruss/packages/rect-tests.git/
Comment 8 Ivan Melnikov 2008-07-10 20:49:58 MSD
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/
очередная версия rect, 0.0.5.

Весь требуемый функционал серверной части (slave) реализован и протестирован. Дальнейшие пожелания по её развитию считаю разумным оформлять в виде отдельных ошибок. Эту закрываю.