Как обеспечить безопасную синхронизацию файлов с sqlite и NFS - PullRequest
3 голосов
/ 18 февраля 2011

Я недавно преобразовал формат файла рабочей области для своего приложения в sqlite. Чтобы обеспечить надежную работу в NFS, я использовал общую политику обновления, я делаю все изменения в копии, хранящейся во временной папке на локальном жестком диске. Только при сохранении я могу изменить исходный файл (возможно, в NFS), скопировав исходный файл с временным файлом. Я открываю только оригинальный файл, чтобы сохранить для него эксклюзивную блокировку, чтобы кто-то другой попытался его открыть, и его предупредят, что его использует кто-то другой.

Проблема заключается в следующем: когда я иду, чтобы сохранить свой временный файл поверх исходного файла, я должен снять блокировку оригинального файла, это дает возможность другому человеку войти и взять оригинал, хотя и небольшое окно .

Я могу придумать несколько способов обойти это:

(1) - просто выгрузить содержимое temp в orginal с помощью sql, то есть удалить таблицы на оригинале, vacumm original, выбрать из temp и вставить в orginal. Я не люблю делать sql-операции над sqlite-файлом, хранящимся в NFS. Это пугает меня проблемами коррупции. Правильно ли я так думать?

(2) Используйте различные дополнительные файлы для защиты, чтобы другие не могли проникнуть при копировании температуры поверх оригинала. Использование файлов в качестве мьютекса в лучшем случае проблематично. Мне также не нравится идея, что в случае сбоя приложения появляются дополнительные файлы.

Мне интересно, есть ли у кого-нибудь другие решения для этого. Снова скопировать временный файл поверх исходного файла, убедившись, что другое приложение не закрадывается и не захватывает исходный файл при этом?

Я использую python2.5, sqlalchemy 0.6.6 и sqlite 3.6.20

Спасибо, Декан

1 Ответ

2 голосов
/ 23 февраля 2011

Проблемы SQLite NFS из-за неправильного кэширования и блокировки.Если ваш процесс имеет единственный доступ к файлу в NFS, тогда все будет в порядке.

API резервного копирования SQLite был разработан для решения именно вашей проблемы.Вы можете сделать резервную копию непосредственно в базе данных NFS или в другой локальный временный файл, а затем скопировать его.API резервного копирования решает все проблемы блокировки и параллелизма.

Вы можете использовать APSW для доступа к API резервного копирования или самой последней версии pysqlite.(Раскрытие: я автор APSW.)

...