Store unfinished tasks on disks

This commit is contained in:
2026-04-24 07:10:26 +03:00
parent 0afc1d761b
commit b8eabee393
4 changed files with 264 additions and 10 deletions

View File

@@ -2,6 +2,7 @@ package main
import (
"context"
"encoding/json"
"flag"
"log"
"net/http"
@@ -39,6 +40,33 @@ func main() {
activeDBs := make(map[string]*db.DB)
mountToDiskID := make(map[string]string)
resumeDiskTask := func(info disk.DiskInfo, database *db.DB) {
rec, ok, err := database.ActiveTask()
if err != nil {
log.Printf("load active task for %s: %v", info.DiskID, err)
return
}
if !ok || rec.Task.Type != "copy" {
return
}
var opts copier.Options
if err := json.Unmarshal(rec.Payload, &opts); err != nil {
log.Printf("decode task payload for %s: %v", info.DiskID, err)
return
}
opts.DiskID = info.DiskID
opts.MountPath = info.MountPath
if rec.Task.Phase != task.PhaseQueued && rec.Task.Phase != task.PhasePreparing && rec.Task.Phase != task.PhaseReplacing && opts.OverwriteMode == config.OverwriteDelete {
opts.OverwriteMode = config.OverwriteSkip
}
taskStore.Upsert(rec.Task)
if err := cp.Resume(context.Background(), rec.Task.ID, opts); err != nil {
log.Printf("resume task %s for %s: %v", rec.Task.ID, info.DiskID, err)
}
}
openDiskDB := func(info disk.DiskInfo) {
if info.DiskID == "" {
return
@@ -65,6 +93,7 @@ func main() {
activeDBs[info.DiskID] = d
cp.SetDB(info.DiskID, d)
log.Printf("disk DB opened for %s", info.DiskID)
resumeDiskTask(info, d)
}
closeDiskDB := func(info disk.DiskInfo) {