Skip to content

Commit

Permalink
New: Limit grabs to 1 per second to reduce rapid API calls
Browse files Browse the repository at this point in the history
  • Loading branch information
markus101 committed May 5, 2015
1 parent 0c6ca69 commit 1275d80
Showing 1 changed file with 44 additions and 37 deletions.
81 changes: 44 additions & 37 deletions src/NzbDrone.Core/Download/ProcessDownloadDecisions.cs
Expand Up @@ -2,8 +2,10 @@
using System.Collections.Generic;
using System.Linq;
using NLog;
using NzbDrone.Common;
using NzbDrone.Core.DecisionEngine;
using NzbDrone.Core.Download.Pending;
using NzbDrone.Core.Parser.Model;

namespace NzbDrone.Core.Download
{
Expand Down Expand Up @@ -37,50 +39,55 @@ public ProcessedDecisions ProcessDecisions(List<DownloadDecision> decisions)
var grabbed = new List<DownloadDecision>();
var pending = new List<DownloadDecision>();

foreach (var report in prioritizedDecisions)
//Limits to 1 grab every 1 second to reduce rapid API hits
using (var rateGate = new RateGate(1, TimeSpan.FromSeconds(1)))
{
var remoteEpisode = report.RemoteEpisode;
foreach (var report in prioritizedDecisions)
{
var remoteEpisode = report.RemoteEpisode;

var episodeIds = remoteEpisode.Episodes.Select(e => e.Id).ToList();
var episodeIds = remoteEpisode.Episodes.Select(e => e.Id).ToList();

//Skip if already grabbed
if (grabbed.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{
continue;
}
//Skip if already grabbed
if (grabbed.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{
continue;
}

if (report.TemporarilyRejected)
{
_pendingReleaseService.Add(report);
pending.Add(report);
continue;
}
if (report.TemporarilyRejected)
{
_pendingReleaseService.Add(report);
pending.Add(report);
continue;
}

if (pending.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{
continue;
}
if (pending.SelectMany(r => r.RemoteEpisode.Episodes)
.Select(e => e.Id)
.ToList()
.Intersect(episodeIds)
.Any())
{
continue;
}

try
{
_downloadService.DownloadReport(remoteEpisode);
grabbed.Add(report);
}
catch (Exception e)
{
//TODO: support for store & forward
//We'll need to differentiate between a download client error and an indexer error
_logger.WarnException("Couldn't add report to download queue. " + remoteEpisode, e);
try
{
rateGate.WaitToProceed();
_downloadService.DownloadReport(remoteEpisode);
grabbed.Add(report);
}
catch (Exception e)
{
//TODO: support for store & forward
//We'll need to differentiate between a download client error and an indexer error
_logger.WarnException("Couldn't add report to download queue. " + remoteEpisode, e);
}
}
}
}

return new ProcessedDecisions(grabbed, pending, decisions.Where(d => d.Rejected).ToList());
}
Expand Down

0 comments on commit 1275d80

Please sign in to comment.