Fixed job provider issue where deleted job classes would break scheduler.

This commit is contained in:
kay.one 2011-12-01 22:26:06 -08:00
parent def450290f
commit bb460163c2
2 changed files with 44 additions and 45 deletions

View File

@ -4,11 +4,13 @@ using System.Linq;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading; using System.Threading;
using FizzWare.NBuilder;
using FluentAssertions; using FluentAssertions;
using NUnit.Framework; using NUnit.Framework;
using NzbDrone.Core.Jobs; using NzbDrone.Core.Jobs;
using NzbDrone.Core.Model; using NzbDrone.Core.Model;
using NzbDrone.Core.Providers.Jobs; using NzbDrone.Core.Providers.Jobs;
using NzbDrone.Core.Repository;
using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Test.Framework;
using NzbDrone.Test.Common; using NzbDrone.Test.Common;
using NzbDrone.Test.Common.AutoMoq; using NzbDrone.Test.Common.AutoMoq;
@ -283,6 +285,27 @@ namespace NzbDrone.Core.Test.ProviderTests.JobProviderTests
timers[0].Enable.Should().BeTrue(); timers[0].Enable.Should().BeTrue();
} }
[Test]
public void inti_should_removed_jobs_that_no_longer_exist()
{
IList<IJob> fakeJobs = new List<IJob> { fakeJob };
Mocker.SetConstant(fakeJobs);
WithRealDb();
var deletedJob = Builder<JobDefinition>.CreateNew().Build();
Db.Insert(deletedJob);
var jobProvider = Mocker.Resolve<JobProvider>();
//Act
jobProvider.Initialize();
//Assert
var registeredJobs = Db.Fetch<JobDefinition>();
registeredJobs.Should().HaveCount(1);
registeredJobs.Should().NotContain(c => c.Name == deletedJob.Name);
}
[Test] [Test]
public void jobs_with_zero_interval_are_registered_as_disabled() public void jobs_with_zero_interval_are_registered_as_disabled()
{ {
@ -297,24 +320,6 @@ namespace NzbDrone.Core.Test.ProviderTests.JobProviderTests
jobProvider.All().First().Enable.Should().BeFalse(); jobProvider.All().First().Enable.Should().BeFalse();
} }
[Test]
public void Get_Next_Execution_Time()
{
IList<IJob> BaseFakeJobs = new List<IJob> { fakeJob };
Mocker.SetConstant(BaseFakeJobs);
//Act
var jobProvider = Mocker.Resolve<JobProvider>();
jobProvider.Initialize();
jobProvider.QueueScheduled();
WaitForQueue();
//Assert
var next = jobProvider.NextScheduledRun(typeof(FakeJob));
jobProvider.All().Should().HaveCount(1);
jobProvider.All().First().LastExecution.Should().Be(next.AddMinutes(-fakeJob.DefaultInterval));
}
[Test] [Test]
public void disabled_jobs_arent_run_by_scheduler() public void disabled_jobs_arent_run_by_scheduler()
{ {

View File

@ -64,40 +64,45 @@ namespace NzbDrone.Core.Jobs
} }
} }
/// <summary>
/// Returns a list of all registered jobs
/// </summary>
public virtual List<JobDefinition> All() public virtual List<JobDefinition> All()
{ {
return _database.Fetch<JobDefinition>().ToList(); return _database.Fetch<JobDefinition>().ToList();
} }
/// <summary>
/// Initializes jobs in the database using the IJob instances that are
/// registered using ninject
/// </summary>
public virtual void Initialize() public virtual void Initialize()
{ {
logger.Debug("Initializing jobs. Count {0}", _jobs.Count()); var currentJobs = All();
var currentTimer = All(); logger.Debug("Initializing jobs. Available: {0} Existing:{1}", _jobs.Count(), currentJobs.Count);
foreach (var timer in _jobs) foreach (var currentJob in currentJobs)
{ {
var timerProviderLocal = timer; if (!_jobs.Any(c => c.Name == currentJob.Name))
if (!currentTimer.Exists(c => c.TypeName == timerProviderLocal.GetType().ToString())) {
logger.Debug("Removing job from database '{0}'", currentJob.Name);
_database.Delete(currentJob);
}
}
foreach (var job in _jobs)
{
var jobLocal = job;
if (!currentJobs.Exists(c => c.TypeName == jobLocal.GetType().ToString()))
{ {
var settings = new JobDefinition var settings = new JobDefinition
{ {
Enable = timerProviderLocal.DefaultInterval > 0, Enable = jobLocal.DefaultInterval > 0,
TypeName = timer.GetType().ToString(), TypeName = job.GetType().ToString(),
Name = timerProviderLocal.Name, Name = jobLocal.Name,
Interval = timerProviderLocal.DefaultInterval, Interval = jobLocal.DefaultInterval,
LastExecution = DateTime.Now LastExecution = DateTime.Now
}; };
SaveDefinition(settings); SaveDefinition(settings);
} }
} }
} }
/// <summary> /// <summary>
@ -141,17 +146,6 @@ namespace NzbDrone.Core.Jobs
logger.Trace("{0} Scheduled tasks have been added to the queue", pendingJobTypes.Count); logger.Trace("{0} Scheduled tasks have been added to the queue", pendingJobTypes.Count);
} }
/// <summary>
/// Gets the next scheduled run time for a specific job
/// (Estimated due to schedule timer)
/// </summary>
/// <returns>DateTime of next scheduled job execution</returns>
public virtual DateTime NextScheduledRun(Type jobType)
{
var job = All().Where(t => t.TypeName == jobType.ToString()).Single();
return job.LastExecution.AddMinutes(job.Interval);
}
public virtual void QueueJob(Type jobType, int targetId = 0, int secondaryTargetId = 0) public virtual void QueueJob(Type jobType, int targetId = 0, int secondaryTargetId = 0)
{ {
var queueItem = new JobQueueItem var queueItem = new JobQueueItem