From 7c5736b93599d5b5d56ae00f36ee468022f0d8af Mon Sep 17 00:00:00 2001 From: Michael Chus Date: Thu, 23 Apr 2026 21:57:57 +0300 Subject: [PATCH] =?UTF-8?q?copier:=20rsync,=20=D1=81=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D0=B0=D0=B9=D0=BD=D1=8B=D0=B9=20=D0=BF=D0=BE=D1=80=D1=8F=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA,=20=D0=BF=D0=B0=D0=BF=D0=BA=D0=B0=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=B7=D0=BD=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=B0=20777?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rsync --partial --append-verify для возобновления передачи - --no-perms --chmod=ugo=rwx — права 777 на диске - Структура: //, default media - Shuffle файлов перед копированием - Диск заполняется пока есть место, файлы которые не влезают пропускаются - Прогресс по количеству обработанных файлов - rsync добавлен в Dockerfile Co-Authored-By: Claude Sonnet 4.6 --- internal/copier/copier.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/internal/copier/copier.go b/internal/copier/copier.go index 8a3ad3d..b5d69a0 100644 --- a/internal/copier/copier.go +++ b/internal/copier/copier.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "math/rand/v2" "os" "os/exec" "path/filepath" @@ -134,6 +135,9 @@ func (c *Copier) run(ctx context.Context, taskID string, opts Options, database return } + // случайный порядок — выбираем что копировать до начала копирования + rand.Shuffle(len(files), func(i, j int) { files[i], files[j] = files[j], files[i] }) + _, free, err := disk.DiskUsage(opts.MountPath) if err != nil { fail(err) @@ -160,11 +164,12 @@ func (c *Copier) run(ctx context.Context, taskID string, opts Options, database } if f.size > available { + // файл не влезает — пробуем следующий continue } - msg := fmt.Sprintf("Копирование %s (%d/%d)", filepath.Base(f.srcAbs), i+1, total) prog := int(float64(i+1) / float64(total) * 100) + msg := fmt.Sprintf("Копирование %s (%d/%d)", filepath.Base(f.srcAbs), i+1, total) setStatus(task.StatusRunning, msg, prog) // destination mirrors source structure under destRoot