LINUX.ORG.RU
ФорумAdmin

Переименовать директорию и исправить пути в БД без race condition

 , , , ,


0

2

Я уверен, есть простой и правильный сособ сделать это.

Есть директория и в ней файлы. Пути к файлам упоминаются в базе (postgresql, но это неважно). Директорию нужно переименовать, базу поправить и всё это без отказов типа 404 ошибка на полдороги.

Нужно что-то типа такого:

ln -s AAA BBB
psql <<<"UPDATE filename=BBB/...."
mv --no-target-directory --force AAA BBB

Только это на работает

mv: cannot overwrite non-directory 'BBB' with directory 'AAA'

Как ещё можно решить задачу? Интересуют надёжные и красивые методы, ненадёжно и через задницу я и сам могу.

PS mount --o bind не будет разрешён.

★★★★★

Последнее исправление: legolegs (всего исправлений: 6)

А что (кроме возможной нехватки места) мешает сначала rsync'нуть AAA в BBB, потом исправить пути в базе, потом удалить AAA?

dexpl ★★★★★
()
Ответ на: комментарий от dexpl

Что-то может добавиться в AAA. Это я отношу к «ненадёжным» методам. Нехватка места не проблема - есть хардлинки.

legolegs ★★★★★
() автор топика
Последнее исправление: legolegs (всего исправлений: 1)

psql <<<«UPDATE filename=BBB/....»

у тебя же после этого обращения по AAA не будут производиться? Ну и удали его нафиг.

AnDoR ★★★★★
()
Ответ на: комментарий от anc

И всё это в 4 утра, когда юзеры спят. Ну можно, конечно, но так-себе решение. Лучше уж chmod -w AAA, rsync, UPDATE, chmod +w. По крайней мере будет уверенность, что ничего не пропадёт по-тихому.

legolegs ★★★★★
() автор топика

mv --no-target-directory --force AAA BBB

renameat2(RENAME_EXCHANGE), утилиты-обёртки нет, поддерживается с Linux 3.<какой-то там>, есть не во всех ФС.

intelfx ★★★★★
()
Ответ на: комментарий от legolegs

И всё это в 4 утра, когда юзеры спят. Ну можно, конечно, но так-себе решение. Лучше уж chmod -w AAA, rsync, UPDATE, chmod +w. По крайней мере будет уверенность, что ничего не пропадёт по-тихому.

Если возможен запрет на время, то нормальный вариант. Мне показалось что вам на «живую» постоянно используемую надо.
Только вот момент, mv вместо rsync быстрее будет, у вас же как я понял на одной fs ?

anc ★★★★★
()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от legolegs

И еще обращаю внимание на момент. Мы не знаем как и что у вас работает. Может пользователь «кэширует/запоминает» путь до AAA и может работать по этому пути на продолжении многих дней до «ребута».

anc ★★★★★
()
Ответ на: комментарий от legolegs

Тогда разве что заблочить базу для новых запросов (если такое вообще возможно), дождаться окончания обработки всех имеющихся, сделать что нужно и разлочить базу. Пользователи увидят задержки, но не ошибки. Не?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Да, но я как-то рассчитывал на работающий mv :( Записать на место симлинка файл он может, директорию отчего-то нет.

legolegs ★★★★★
() автор топика
Ответ на: комментарий от legolegs

А собственно почему вас не устроил метод через хардлинки? Ну да, с поддиректориями надо вначале создать дерево, но потом можно в любой момент удалять безбоязненно как всё сразу так и по очерёдно.

vodz ★★★★★
()
Ответ на: комментарий от legolegs

Записать на место симлинка файл он может, директорию отчего-то нет.

Ну, таковы ограничения самого системного вызова rename():

oldpath can specify a directory.  In this case, newpath must either not exist, or it must specify an empty directory.

intelfx ★★★★★
()
Ответ на: комментарий от legolegs

Неизящно и неатомарно.

И изящно и абсолютно не требует атомарности.

vodz ★★★★★
()
Ответ на: комментарий от legolegs

В конце концов, да. В процессе работы новые файлы создаются? Изменения в существующие файлы вносятся in-place или путём удаления старого файла и создания на его месте нового? Если ответ на второе — «нет», тогда так:

  • создаём BBB и структуру подкаталогов
  • изменяем место создания новых файлов на BBB, делаем барьер транзакций
  • рекурсивно хардлинкаем все файлы из AAA в BBB
  • изменяем пути к существующим файлам на BBB, делаем барьер транзакций
  • удаляем AAA

Изящно? Наверное, нет. Корректно? Да.

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

изменяем место создания новых файлов на BBB,
изменяем пути к существующим файлам на BBB

Вот за это спасибо, я и не подумал, что у меня это отдельные вещи.

legolegs ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.