From 74b6ddc99cfbc5c9ec44a459231fc32177c46c6a Mon Sep 17 00:00:00 2001 From: Ben Sarmiento Date: Sun, 10 Dec 2023 22:57:46 +0100 Subject: [PATCH] Prevent double repairs --- internal/torrent/delete.go | 2 ++ internal/torrent/refresh.go | 6 +++--- internal/torrent/repair.go | 9 ++++++++- internal/universal/get.go | 6 +++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/internal/torrent/delete.go b/internal/torrent/delete.go index be7136d..10c22bc 100644 --- a/internal/torrent/delete.go +++ b/internal/torrent/delete.go @@ -12,7 +12,9 @@ func (t *TorrentManager) CheckDeletedStatus(torrent *Torrent) bool { if len(unselectedIDs) == torrent.SelectedFiles.Count() && len(unselectedIDs) > 0 { return true } else if len(unselectedIDs) > 0 { + infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE) torrent.DownloadedIDs.Each(func(id string) bool { + infoCache.Set(id, torrent) t.writeTorrentToFile(id, torrent) return true }) diff --git a/internal/torrent/refresh.go b/internal/torrent/refresh.go index ddba4e0..3fbeb5f 100644 --- a/internal/torrent/refresh.go +++ b/internal/torrent/refresh.go @@ -23,12 +23,12 @@ func (t *TorrentManager) RefreshTorrents() []string { var wg sync.WaitGroup for i := range instances { - wg.Add(1) - idx := i // capture the loop variable + idx := i _ = t.workerPool.Submit(func() { defer wg.Done() infoChan <- t.getMoreInfo(instances[idx]) }) + wg.Add(1) } wg.Wait() @@ -43,7 +43,7 @@ func (t *TorrentManager) RefreshTorrents() []string { noInfoCount++ continue } - if !info.AllInProgress() { + if !info.AnyInProgress() { freshKeys.Add(info.AccessKey) } if torrent, exists := allTorrents.Get(info.AccessKey); !exists { diff --git a/internal/torrent/repair.go b/internal/torrent/repair.go index f4c5f39..ba1284d 100644 --- a/internal/torrent/repair.go +++ b/internal/torrent/repair.go @@ -36,6 +36,12 @@ func (t *TorrentManager) repairAll() { } func (t *TorrentManager) Repair(torrent *Torrent) { + infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE) + torrent.DownloadedIDs.Each(func(id string) bool { + infoCache.Set(id, torrent) + t.writeTorrentToFile(id, torrent) + return true + }) _ = t.repairWorker.Submit(func() { t.log.Infof("Repairing torrent %s", torrent.AccessKey) t.repair(torrent) @@ -73,8 +79,9 @@ func (t *TorrentManager) repair(torrent *Torrent) { // second solution: add only the missing files var missingFiles []File torrent.SelectedFiles.IterCb(func(_ string, file *File) { - if !strings.HasPrefix(file.Link, "http") { + if file.Link == "repair" || file.Link == "" { missingFiles = append(missingFiles, *file) + file.Link = "repairing" } }) t.log.Debugf("During repair, zurg found %d broken files for torrent %s", len(missingFiles), torrent.AccessKey) diff --git a/internal/universal/get.go b/internal/universal/get.go index cb5cb82..326419a 100644 --- a/internal/universal/get.go +++ b/internal/universal/get.go @@ -77,7 +77,7 @@ func (gf *GetFile) HandleGetRequest(directory, torrentName, fileName string, res if unrestrict == nil { log.Warnf("File %s cannot be unrestricted (link=%s)", fileName, link) if cfg.EnableRepair() { - file.Link = "repairing" + file.Link = "repair" torMgr.Repair(torrent) } else { log.Infof("Repair is disabled, skipping repair for unavailable file %s (link=%s)", fileName, link) @@ -169,7 +169,7 @@ func (gf *GetFile) streamFileToResponse(torrent *intTor.Torrent, file *intTor.Fi if file != nil && unrestrict.Streamable == 1 { log.Warnf("Cannot download file %s: %v", file.Path, err) if cfg.EnableRepair() { - file.Link = "repairing" + file.Link = "repair" torMgr.Repair(torrent) } else { log.Infof("Repair is disabled, skipping repair for unavailable file %s (link=%s)", file.Path, file.Link) @@ -184,7 +184,7 @@ func (gf *GetFile) streamFileToResponse(torrent *intTor.Torrent, file *intTor.Fi if file != nil && unrestrict.Streamable == 1 { log.Warnf("Received a %s status code for file %s", download.Status, file.Path) if cfg.EnableRepair() { - file.Link = "repairing" + file.Link = "repair" torMgr.Repair(torrent) } else { log.Infof("Repair is disabled, skipping repair for unavailable file %s (link=%s)", file.Path, file.Link)