From 2cf0890e14f46164a9ea638274efcc8e83af2135 Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Mon, 27 May 2013 16:40:31 +0300 Subject: [PATCH] Scheduler Service fixes --- WebsitePanel/Database/update_db.sql | 6 +- .../Data/DataProvider.cs | 5 +- .../Scheduling/Scheduler.cs | 64 ++++++++----------- .../Tasks/TaskController.cs | 2 +- .../WebsitePanel.EnterpriseServer.Code.csproj | 2 + .../SchedulerServiceInstaller.cs | 2 +- 6 files changed, 37 insertions(+), 44 deletions(-) diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index efe4d6d7..cca0ebdb 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -12,6 +12,7 @@ BEGIN END GO + --- Fix on version 2.0 DELETE FROM HostingPlanQuotas WHERE QuotaID = 340 GO @@ -1329,8 +1330,7 @@ DROP PROCEDURE GetProcessBackgroundTasks GO CREATE PROCEDURE [dbo].[GetProcessBackgroundTasks] -( - @ActorID INT, +( @Status INT ) AS @@ -1356,7 +1356,7 @@ SELECT T.NotifyOnComplete, T.Status FROM BackgroundTasks AS T -WHERE T.UserID = @ActorID AND T.Completed = 0 AND T.Status = @Status +WHERE T.Completed = 0 AND T.Status = @Status GO IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetScheduleBackgroundTasks') diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 60ad233e..87af1b43 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -1868,11 +1868,10 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("@guid", guid)); } - public static IDataReader GetProcessBackgroundTasks(int actorId, BackgroundTaskStatus status) + public static IDataReader GetProcessBackgroundTasks(BackgroundTaskStatus status) { return SqlHelper.ExecuteReader(ConnectionString, CommandType.StoredProcedure, - ObjectQualifier + "GetProcessBackgroundTasks", - new SqlParameter("@actorId", actorId), + ObjectQualifier + "GetProcessBackgroundTasks", new SqlParameter("@status", (int)status)); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs index e111920c..d54c76dc 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Scheduling/Scheduler.cs @@ -28,6 +28,7 @@ using System; using System.IO; +using System.ServiceProcess; using System.Threading; using System.Collections; using System.Diagnostics; @@ -41,18 +42,18 @@ namespace WebsitePanel.EnterpriseServer public sealed class Scheduler { - public static SchedulerJob nextSchedule = null; - - // main timer and put it to sleep - static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule), - null, - Timeout.Infinite, - Timeout.Infinite); + public static SchedulerJob nextSchedule = null; public static void Start() - { - // schedule tasks - ScheduleTasks(); + { + var serviceController = new ServiceController("WebsitePanel Scheduler"); + + if (serviceController != null && serviceController.Status != ServiceControllerStatus.Running) + { + serviceController.WaitForStatus(ServiceControllerStatus.Running); + } + + ScheduleTasks(null); } public static bool IsScheduleActive(int scheduleId) @@ -81,43 +82,34 @@ namespace WebsitePanel.EnterpriseServer TaskManager.StopTask(activeTask.TaskId); } - public static void ScheduleTasks() - { - RunManualTasks(); - - nextSchedule = SchedulerController.GetNextSchedule(); - - // set timer + public static void ScheduleTasks(object obj) + { + RunManualTasks(); + nextSchedule = SchedulerController.GetNextSchedule(); + if (nextSchedule != null) - { + { if (nextSchedule.ScheduleInfo.NextRun <= DateTime.Now) - { - // this will put the timer to sleep - scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite); - Thread.Sleep(1000); - // run immediately + { RunNextSchedule(null); - } - else - { - // set timer - TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now); - if (ts < TimeSpan.Zero) - ts = TimeSpan.Zero; // cannot be negative ! - // invoke after the timespan - scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite); - } + } } + + Thread.Sleep(30000); + ScheduleTasks(null); } private static void RunManualTasks() { - var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting); + var tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Starting); + foreach (var task in tasks) { new Thread(() => RunBackgroundTask(task)) {Priority = ThreadPriority.Highest}.Start(); } - tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping); + + tasks = TaskController.GetProcessTasks(BackgroundTaskStatus.Stopping); + foreach (var task in tasks) { TaskManager.StopTask(task); @@ -170,7 +162,7 @@ namespace WebsitePanel.EnterpriseServer RunSchedule(nextSchedule, true); // schedule next task - ScheduleTasks(); + ScheduleTasks(null); } static void RunSchedule(SchedulerJob schedule, bool changeNextRun) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs index cf6dac63..58cf6085 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Tasks/TaskController.cs @@ -41,7 +41,7 @@ namespace WebsitePanel.EnterpriseServer public static List GetProcessTasks(BackgroundTaskStatus status) { return ObjectUtils.CreateListFromDataReader( - DataProvider.GetProcessBackgroundTasks(SecurityContext.User.UserId, status)); + DataProvider.GetProcessBackgroundTasks(status)); } public static BackgroundTask GetTopTask(Guid guid) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj index c7dd2261..6b10906d 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/WebsitePanel.EnterpriseServer.Code.csproj @@ -21,6 +21,7 @@ DEBUG;TRACE prompt 4 + AnyCPU pdbonly @@ -42,6 +43,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs index 6d321a24..3bbafcff 100644 --- a/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs +++ b/WebsitePanel/Sources/WebsitePanel.SchedulerService/SchedulerServiceInstaller.cs @@ -17,7 +17,7 @@ namespace WebsitePanel.SchedulerService processInstaller.Account = ServiceAccount.LocalSystem; serviceInstaller.DisplayName = "WebsitePanel Scheduler"; serviceInstaller.StartType = ServiceStartMode.Automatic; - serviceInstaller.ServiceName = "WebsitePanlel Scheduler"; + serviceInstaller.ServiceName = "WebsitePanel Scheduler"; Installers.Add(processInstaller); Installers.Add(serviceInstaller);