Выложил модуль fstrans на pypi.
Oct. 21st, 2019 02:01 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
https://pypi.org/project/fstrans/
В основном ради того, чтобы научитсья пользоваться setuptools. Хотя сам модуль в общем вполне практически полезный. Для себя делал. Базовую идею я придумал еще во времена Communiware, где картинки хранились на диске, а текст в базе данных, и требовалось сделать чтобы картинкам можно было сделать rollback. Тогда соответствующий код, конечно же был на перле написан, а не на питоне.
Сейчас использую этот модуль для работы с репозиториями пакетов. Поэтому оно умеет не только коммиты-роллбэки но и сериализацию доступа к дереву файлов.
И таки да, test suite запускается штатными средствами setuptools. В distutis, когда я там делал поддержку запуска test suite для ctypsecrypto, все руками приходилось делать.
P.S. Надо бы найти время и переписать setup от ctypsecrypto на setuptools, а заодно окончательно починить там работу с бинарными данными в 3-м питоне.
В основном ради того, чтобы научитсья пользоваться setuptools. Хотя сам модуль в общем вполне практически полезный. Для себя делал. Базовую идею я придумал еще во времена Communiware, где картинки хранились на диске, а текст в базе данных, и требовалось сделать чтобы картинкам можно было сделать rollback. Тогда соответствующий код, конечно же был на перле написан, а не на питоне.
Сейчас использую этот модуль для работы с репозиториями пакетов. Поэтому оно умеет не только коммиты-роллбэки но и сериализацию доступа к дереву файлов.
И таки да, test suite запускается штатными средствами setuptools. В distutis, когда я там делал поддержку запуска test suite для ctypsecrypto, все руками приходилось делать.
P.S. Надо бы найти время и переписать setup от ctypsecrypto на setuptools, а заодно окончательно починить там работу с бинарными данными в 3-м питоне.
no subject
Date: 2019-10-21 12:41 pm (UTC)- atomicwrites (если просто надо безопасно писать файлы (чужие конфиги, итд) + там все ок с портабельностью, виндой и osx);
- repoze.filesafe если надо дружить с транзакциями модных веб движков (flask, pyramid) и хочется привязать коммит обновления файла к коммиту транзакции в постгресс к примеру; (он древний конечно, возможно уже есть что-то новое более прямое и портабельное)
- click если просто пишется какая-то мелкая утилита (там прямо при объявлении параметра командной строки можно указать что это не строка, а файл, который обязан (не)существовать, и там же можно сказать "хочу атомарного обновления по завершении утилиты")
no subject
Date: 2019-10-21 12:50 pm (UTC)Во-вторых, менять файлы в них в том числе и путем запуска внешних программ (и собственно основным источником ошибок из-за которых может потребоваться откатывать транзакцию, будут ошибки
rerpepro или createrepo).
А вот модных движков как раз не надо. Репозитории пакетов обычно раздаются статикой.
Ну и винда и osx не нужны абсолютно. Впрочем хардлинки уже не одно десятилетие и в том, и в другом есть.
no subject
Date: 2019-10-21 03:52 pm (UTC)2 с внешними тут все плохо будет, я боюсь тут только снапшотами FS можно сделать действительно атомарно (потому что копирование дерева взад-вперед будет расти по времени геометрически)
(ну либо строить рядом новое поколение, и обновлять симлинки, как советовал оратор в соседней ветке -- в nix атомарные апдейты кстати сделано ровно так)
> А вот модных движков как раз не надо. Репозитории пакетов обычно раздаются статикой.
Ну в посте библиотека позиционировалась как обобщенное, а не частное решение.
(transaction я считаю годной библиотекой, и хорошим обобщением двухфазного коммита с голосованием.
(А если надобудет к этому вебморду -- будешь велосипед изобретать?)
> Ну и винда и osx не нужны абсолютно.
Я с одной стороны согласен, с другой я не вижу зла в том, чтобы не создавать несовместимость нарочно.
no subject
Date: 2019-10-21 07:13 pm (UTC)А вообще здесь до самого момента коммита транзакации исходное дерево отличаеется от того, что было до начала транзакции только количеством линков у тех файлов, которые заведомо не предполагается модифицировать. Естественно, линки используются не сим, а хард. И соответственно в момент завершения транзакции у (неизмененного) файла есть два равноправных линка, и я могу выбирать какой из них удалять - тот, который в измененном дереве или тот, который в исходном.
У меня с ввнешними програмами все хорошо. rpm (с ключиком --add-sign), createrepo, reprerrpo и альтовский genbasedir прекрасно работают с временным деревом. Тут единственное что надо - это знать какие именно файлы будет модифицировать внешняя программа и как. Соответсвенно, если она собирается модифицировать файл in place (например sqlite базу) надо перед ее запуском сделать этому файлу clone, чтобы копия изменяемая в контексте транзакции была независимой от исходной.
А вебмордой у меня к этому jenkins работает ;-). Дп, между ним и этим модулем еще 3-4 уровня абстракции, докерный контейнер и пара ssh-соединений. Ну и что?
no subject
Date: 2019-10-21 07:22 pm (UTC)no subject
Date: 2019-10-21 09:37 pm (UTC)непонятно
Date: 2019-10-21 01:29 pm (UTC)предыдущю версию картинки? Но ведь для этого есть обычные backup-утилитки. Наверняка вы нечто большее замышляли, или более удобное...
2. Что значит "сериализация доступа к дереву файлов"? ИМХО, если двое одновременно пишут один и тот же файл, то в любом случае быть беде. Или не обязательно? В чём идея?
Re: непонятно
Date: 2019-10-21 02:37 pm (UTC)2. Идея в том, что если две независимо запущенных задачи в какой-то момент одновременно захотели положить собранные ими (разные) файлы в одно и то же дерево, то мы одну бы из них придержали, дав первой завершиться и привести индесные файлы в консистентное состояние. И только потом, уже в новое консистентное состояние пустили вторую задачу.
Я джва года хочу такой модуль
Date: 2019-10-21 01:48 pm (UTC)Есть лёгкое подозрение, что в строке 36 может выпадать слэш, если аргумент
old
указан с концевым слэшем, а new без оного. Разcopy_tree
выставлена как публичная функция, такой вариант вызова нельзя исключать.В библиотеке общего назначения вывод в stdout (L122, L126) неуместен.
В чём преимущество
select
с таймаутом в L129 противtime.sleep
? В том, что при интерактивном выполнении прерывается по нажатию на клавишу?Двухшаговое переименование в
__exit__
оставляет окно для гонок, когда старый каталог уже уехал, а новый ещё не приехал. Более надёжно такие вещи делаются, если допустимо исходную постановку задачи «у нас есть каталог» поменять на «у нас есть симлинк на каталог». Тогда:Рекурсивное удаление в L157-162 можно сократить до
shutil.rmtree
, если не мешают требования обратной совместимости.Re: Я джва года хочу такой модуль
Date: 2019-10-21 02:45 pm (UTC)Насчет 122 и 126 - там не stdout, там stderr. Но вообще и правда, надо наверное logging использовать.
Но вообще код с сериализацией там самый недоделанный и недотестированный. Там еще есть недоловленная ситуация, когда временная директория не удаляется доконца (возможно, в случае прерывания процесса сигналом).
Насчет select - ну не привыкну я никак, что в питоне sleep не секундную гранулярность имеет.
Что касается двухшагового переименования, я решил что такая вероятность гонок - меньшее зло, чем использование симлинков.
Требования обратной совместимости не мешают. Существование python <3.5 я игнорирую. Мешает скорее некоторое недоверие к стандартным функциям там, где мы работаем с деревом хардлинков. Но вроде эта часть у меня тестами хорошо покрыта, значит можно и заменить.