Рассмотрим ситуацию, когда файл удалён, но место на диске не освобождается, на примере скрипта:
Код:
async function test(): Promise<void> {
const test = await Context.data.prilozhenie!.fetch()
let file = await test.fields.faily.createFromLink("text.bmp", 'https://ссылка_на_файл');
test.data.faily = file
await test.save();
Context.data.file_ctx = file;
}
При выполнении скрипта:
1. С помощью метода createFromLink создаётся системный файл в хранилище S3. Одновременно с этим в PostgreSQL добавляется первая запись об этом файле.
2. После создания системного файла устанавливается связь между файлом и приложением, в котором он хранится.
3. При вызове test.save() в PostgreSQL создаётся вторая запись, в которой хранится связь между файлом и приложением. Эта запись содержит ссылку на первую запись, но не создаёт копию файла в хранилище S3.
В результате в PostgreSQL остаются две записи, ссылающиеся на один и тот же файл в хранилище S3.
Почему место на диске не освобождается
Если удалить файл только из приложения, удаляется запись, привязанная к этому приложению. Запись, созданная через createFromLink, остаётся в системе.
Итог: ссылка на тело файла в хранилище S3 сохраняется, поэтому место не освобождается.
Решение проблемы
Чтобы удалить файлы и освободить место на диске:
1. Получите список файлов из приложений, которые планируете удалить.
2. Для каждого удаляемого файла найдите все записи с таким же хешем.
3. Удалите найденные файлы с помощью команды:
Код:
const filesForDelete = await System.files.search()
.where(f => f.hash.eq('<хеш_файла>'))
.all();
filesForDelete.forEach(async (f) => await f.delete());