Add lock for repairs

This commit is contained in:
Ben Sarmiento
2024-01-16 02:05:41 +01:00
parent bb5bad1576
commit 2cb29284f6
3 changed files with 19 additions and 2 deletions

View File

@@ -100,6 +100,10 @@ func (t *TorrentManager) repairAll() {
}
func (t *TorrentManager) Repair(torrent *Torrent) {
if torrent.Unfixable {
t.log.Warnf("Torrent %s is unfixable, skipping repair", t.GetKey(torrent))
return
}
// save the broken files to the file cache
infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE)
torrent.DownloadedIDs.Each(func(id string) bool {
@@ -117,13 +121,17 @@ func (t *TorrentManager) Repair(torrent *Torrent) {
})
_ = t.workerPool.Submit(func() {
t.log.Infof("Repairing torrent %s", t.GetKey(torrent))
torrent.Lock.Lock()
defer torrent.Lock.Unlock()
torrent.Repairing = true
t.repair(torrent)
torrent.Repairing = false
t.log.Infof("Finished repairing torrent %s", t.GetKey(torrent))
})
}
func (t *TorrentManager) repair(torrent *Torrent) {
if torrent.AnyInProgress() {
if torrent.AnyInProgress() || torrent.Repairing {
t.log.Infof("Torrent %s is in progress, skipping repair until download is done", t.GetKey(torrent))
return
}
@@ -379,10 +387,14 @@ func (t *TorrentManager) markAsUnplayable(torrent *Torrent) {
func (t *TorrentManager) markAsUnfixable(torrent *Torrent) {
t.log.Warnf("Marking torrent %s as unfixable", t.GetKey(torrent))
torrent.Lock.Lock()
defer torrent.Lock.Unlock()
torrent.Unfixable = true
infoCache, _ := t.DirectoryMap.Get(INT_INFO_CACHE)
torrent.DownloadedIDs.Each(func(id string) bool {
info, _ := infoCache.Get(id)
info.Lock.Lock()
defer info.Lock.Unlock()
info.Unfixable = true
t.writeTorrentToFile(id, info)
return false