Какой есть оптимальный алгоритм загрузки ассоциированного файла?

Пишется домашний проект, в котором есть веб-редактор текста (plaintext) с желаемой возможностью прикреплять по id-ссылке ресурсы (картинки, документы и тому подобное). Выход проекта, во избежание зоопарка - единый бинарник (rust, его стэком и ограничен).

Не выходит нагуглить алгоритм согласованного сохранения текста и ресурсов, чтобы by-design было, по приоритетам, следующее:
1. никаких битых ссылок на ресурс
2. диск не засоряется при удалении ссылки на ресурс или прерывании процесса обновления текста, содержащего ссылку
3. минимальное число записей, а лучше и чтений диска
4. текстов и ресурсов может быть много

По второму полагаю нужна 'чистка' как часть инициализации сервера, по третьему может как дополнительный хак - удалять небольшие ресурсы не сразу, а по таймеру на случай, если пользователь передумал удалять. А накидал алгоритм пока такой:
картинка
612f4e2db351b830759789.png
Выглядит нагружено, много обращений к диску, наверняка какие-то шаги имеют подводные камни, да и подход в алгоритме может быть просто неверен

Так что нужна помощь

Спасибо
  • Вопрос задан
  • 289 просмотров
Решения вопроса 2
SilenceOfWinter
@SilenceOfWinter
та еще зажигалка...
чет как-то слишком сложно - формируешь скрытый список прикрепленных файлов по мере их добавления/удаления тегов (a/img), перед сохранение проверяешь список на отсуствующие файлы и сообщаешь пользователю о имеющихся проблемах и пусть сам решает как с ними быть - удалить ссылку или же перезалить файл. при удалении страницы с текстом удаляем все файлы по списку кроме тех что содержатся в списках файлов других страниц.
Ответ написан
@makaleks Автор вопроса
Узнал о существовании такого понятия, как журнал упреждающей записи (WAL). В результате веду файл журнала с блоками аннотацией {флаги вроде готов к удалению/готов к дампу, неубывающий идентификатор, зависимости, зависимый, ожидаемый размер и ещё что-то} и срезов данных {тот же идентификатор, N байт кусочка файла}. По ходу выгрузки строится дерево зависимостей, и как только все ноды оказались в WAL, ставлю флаги готов к дампу и начинаю запись. Случится нарушение - восстановлю недозаписанную транзакцию по WAL, истечёт актуальность - помечу блоки как готов к удалению.

Можно, конечно, вместо срезов полученных данных писать во временные файлы - тогда запись дампа будет выглядеть как просто перемещение файла, что дешевле и быстрее освобождает место - но это больше сущностей в и так непростом велосипеде (пока актуальнее добиться аккуратной обработки дерева зависимостей, с тестами). Плюс понадобится проверять актуальность на файловой системе на случай, если [все блоки получены]=>[оригинал перезаписан]=>[транзакция прервалась, а некоторых временных файлов не осталось]. В таком случае можно предложить перебраться на sqlite, но выигрыша по сравнению с уже написанным простым wal не вижу.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы