Осталось реализовать логику прозрачной работы с "общими папками". Предложена идея использовать 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 заменяются на обратные....
Базовая логика уточнена... Готовимся проверять rect-0.0.3
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/ очередная версия rect, 0.0.3 Работает монтирование, написаны простейшие тесты для примера. Необходимо ещё потестировать функционал, связанный с локами.
В 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).
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/ очередная версия rect, 0.0.4 Улучшения коснулись исправления обнаруженных в предыдущей версии проблем и работоспособности "из коробки" Осторожно: функционал, связаный с блокировками, по прежнему не тестировался...
Нашел следующую ошибку: 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 Файл в итоге не закрылся, посему и отмонтирование неудачно.
(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
Создан простейший набор тестов для rect, который тестирует, в том числе и блокировки. Пока они ведут себя предсказуемо. Создан новый гит-репозиторий, чтобы не мешать в одну кучу код серверной части и тестов. http://git.etersoft.ru/people/kipruss/packages/rect-tests.git/
Выложена в http://git.etersoft.ru/people/imelnikov/packages/rect.git/ очередная версия rect, 0.0.5. Весь требуемый функционал серверной части (slave) реализован и протестирован. Дальнейшие пожелания по её развитию считаю разумным оформлять в виде отдельных ошибок. Эту закрываю.