Fix issue with bins
This commit is contained in:
@@ -41,6 +41,32 @@ func (t *TorrentManager) initializeBins() {
|
|||||||
t.log.Debugf("Bin immediately: %v", t.ImmediateBin.ToSlice())
|
t.log.Debugf("Bin immediately: %v", t.ImmediateBin.ToSlice())
|
||||||
t.log.Debugf("Bin once done: %v", t.OnceDoneBin.ToSlice())
|
t.log.Debugf("Bin once done: %v", t.OnceDoneBin.ToSlice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (t *TorrentManager) persistBins() {
|
||||||
|
data := map[string]interface{}{
|
||||||
|
"trash_bin": t.ImmediateBin.ToSlice(), // Assuming trashBin is a mapset.Set[string]
|
||||||
|
"repair_bin": t.OnceDoneBin.ToSlice(), // Assuming repairBin is a mapset.Set[string]
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonData, err := json.Marshal(data)
|
||||||
|
if err != nil {
|
||||||
|
t.log.Errorf("Failed to marshal bin data: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Create(BINS_FILE)
|
||||||
|
if err != nil {
|
||||||
|
t.log.Errorf("Failed to create bins.json file: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
_, err = file.Write(jsonData)
|
||||||
|
if err != nil {
|
||||||
|
t.log.Errorf("Failed to write to bins.json file: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) setToBinImmediately(torrentId string) {
|
func (t *TorrentManager) setToBinImmediately(torrentId string) {
|
||||||
t.log.Debugf("Set to delete immediately: %s", torrentId)
|
t.log.Debugf("Set to delete immediately: %s", torrentId)
|
||||||
t.ImmediateBin.Add(torrentId)
|
t.ImmediateBin.Add(torrentId)
|
||||||
@@ -99,40 +125,3 @@ func (t *TorrentManager) binOnceDone(torrentId string) bool {
|
|||||||
|
|
||||||
return found
|
return found
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TorrentManager) persistBins() {
|
|
||||||
data := map[string]interface{}{
|
|
||||||
"trash_bin": t.ImmediateBin.ToSlice(), // Assuming trashBin is a mapset.Set[string]
|
|
||||||
"repair_bin": t.OnceDoneBin.ToSlice(), // Assuming repairBin is a mapset.Set[string]
|
|
||||||
}
|
|
||||||
|
|
||||||
jsonData, err := json.Marshal(data)
|
|
||||||
if err != nil {
|
|
||||||
t.log.Errorf("Failed to marshal bin data: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
file, err := os.Create(BINS_FILE)
|
|
||||||
if err != nil {
|
|
||||||
t.log.Errorf("Failed to create bins.json file: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
defer file.Close()
|
|
||||||
|
|
||||||
_, err = file.Write(jsonData)
|
|
||||||
if err != nil {
|
|
||||||
t.log.Errorf("Failed to write to bins.json file: %v", err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (t *TorrentManager) cleanupBins(freshIDs mapset.Set[string]) {
|
|
||||||
t.ImmediateBin.Difference(freshIDs).Each(func(id string) bool {
|
|
||||||
t.ImmediateBin.Remove(id)
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
t.OnceDoneBin.Difference(freshIDs).Each(func(id string) bool {
|
|
||||||
t.OnceDoneBin.Remove(id)
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
t.persistBins()
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -145,8 +145,6 @@ func (t *TorrentManager) refreshTorrents() []string {
|
|||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
|
||||||
t.cleanupBins(freshIDs)
|
|
||||||
|
|
||||||
return updatedPaths.ToSlice()
|
return updatedPaths.ToSlice()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ func (t *TorrentManager) repair(torrent *Torrent) {
|
|||||||
// delete the torrents it replaced
|
// delete the torrents it replaced
|
||||||
torrent.DownloadedIDs.Each(func(torrentID string) bool {
|
torrent.DownloadedIDs.Each(func(torrentID string) bool {
|
||||||
if torrentID != info.ID {
|
if torrentID != info.ID {
|
||||||
t.setToBinImmediately(torrentID)
|
t.setToBinOnceDone(fmt.Sprintf("%s-%s", info.ID, torrentID))
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
@@ -240,9 +240,9 @@ func (t *TorrentManager) repair(torrent *Torrent) {
|
|||||||
batchNum := 1
|
batchNum := 1
|
||||||
brokenFileIDs := getFileIDs(brokenFiles)
|
brokenFileIDs := getFileIDs(brokenFiles)
|
||||||
var group []string
|
var group []string
|
||||||
for _, fileIDStr := range brokenFileIDs {
|
for i, fileIDStr := range brokenFileIDs {
|
||||||
group = append(group, fileIDStr)
|
group = append(group, fileIDStr)
|
||||||
if len(group) >= 100 {
|
if len(group) >= 100 || i == len(brokenFileIDs)-1 {
|
||||||
t.repairLog.Debugf("Downloading batch %d/%d of broken files of torrent %s", batchNum, totalBatches, t.GetKey(torrent))
|
t.repairLog.Debugf("Downloading batch %d/%d of broken files of torrent %s", batchNum, totalBatches, t.GetKey(torrent))
|
||||||
batchNum++
|
batchNum++
|
||||||
redownloadedInfo, err := t.redownloadTorrent(torrent, group)
|
redownloadedInfo, err := t.redownloadTorrent(torrent, group)
|
||||||
@@ -259,20 +259,6 @@ func (t *TorrentManager) repair(torrent *Torrent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(group) > 0 {
|
|
||||||
t.repairLog.Debugf("Downloading batch %d/%d of broken files of torrent %s", batchNum, totalBatches, t.GetKey(torrent))
|
|
||||||
redownloadedInfo, err := t.redownloadTorrent(torrent, group)
|
|
||||||
if err != nil {
|
|
||||||
t.repairLog.Warnf("Cannot repair torrent %s by downloading broken files (error=%v) giving up", t.GetKey(torrent), err)
|
|
||||||
// delete the newly downloaded torrents because the operation failed
|
|
||||||
for _, newId := range newlyDownloadedIds {
|
|
||||||
t.setToBinImmediately(newId)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
newlyDownloadedIds = append(newlyDownloadedIds, redownloadedInfo.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
// once done, we can delete the newly downloaded torrents because we only need the links
|
// once done, we can delete the newly downloaded torrents because we only need the links
|
||||||
for _, newId := range newlyDownloadedIds {
|
for _, newId := range newlyDownloadedIds {
|
||||||
t.setToBinOnceDone(newId)
|
t.setToBinOnceDone(newId)
|
||||||
|
|||||||
Reference in New Issue
Block a user