From da064953ac9f201c92a0afb7f3bf78eaa3b329cc Mon Sep 17 00:00:00 2001 From: Josh Keegan Date: Tue, 20 Jun 2017 09:36:37 +0100 Subject: [PATCH] SQL Agent Jobs: Handle case where SQL Server is stopped whilst a job is running --- Opserver.Core/Data/SQL/SQLInstance.Jobs.cs | 22 ++++++++++++++++------ Opserver/Views/SQL/Instance.Jobs.cshtml | 9 ++++++++- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Opserver.Core/Data/SQL/SQLInstance.Jobs.cs b/Opserver.Core/Data/SQL/SQLInstance.Jobs.cs index 526100ae7..7a8aef6d4 100644 --- a/Opserver.Core/Data/SQL/SQLInstance.Jobs.cs +++ b/Opserver.Core/Data/SQL/SQLInstance.Jobs.cs @@ -84,7 +84,13 @@ public MonitorStatus LastRunMonitorStatus { get { - if (!LastRunStatus.HasValue) return MonitorStatus.Unknown; + // If there isn't a last run status, it's unknown unless it isn't running, has + // a last start date and no last stop date, in which case SQL Server was stopped + // whilst the job was running. + if (!LastRunStatus.HasValue) + return !IsRunning && LastStartDate.HasValue && !LastStopDate.HasValue + ? MonitorStatus.Warning + : MonitorStatus.Unknown; switch (LastRunStatus.Value) { case JobStatuses.Succeeded: @@ -131,8 +137,10 @@ public string GetFetchSQL(Version v) => @" j.date_modified DateModified, j.version_number Version, Cast(j.enabled as bit) IsEnabled, - Cast(Case When ja.run_requested_date Is Not Null and ja.stop_execution_date Is Null Then 1 - Else 0 + Cast(Case When ja.run_requested_date Is Not Null + and ja.stop_execution_date Is Null + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) Then 1 + Else 0 End as Bit) IsRunning, c.name as Category, jh.run_status LastRunStatus, @@ -140,9 +148,11 @@ Else 0 Cast(ja.run_requested_source as int) LastRunRequestedSource, ja.run_requested_date LastRunRequestedDate, Coalesce(ja.start_execution_date, msdb.dbo.agent_datetime(jh.run_date, jh.run_time)) LastStartDate, - (Case When ja.run_requested_date Is Not Null and ja.stop_execution_date Is Null - Then DateDiff(Second, ja.run_requested_date, GETDATE()) - Else jh.run_duration % 100 + ROUND((jh.run_duration % 10000)/100,0,0)*60 + ROUND((jh.run_duration%1000000)/10000,0,0)*3600 + (Case When ja.run_requested_date Is Not Null + and ja.stop_execution_date Is Null + AND ja.session_id = (SELECT TOP 1 session_id FROM msdb.dbo.syssessions ORDER BY agent_start_date DESC) + Then DateDiff(Second, ja.run_requested_date, GETDATE()) + Else jh.run_duration % 100 + ROUND((jh.run_duration % 10000)/100,0,0)*60 + ROUND((jh.run_duration%1000000)/10000,0,0)*3600 End) LastRunDurationSeconds, ja.stop_execution_date LastStopDate, ja.job_history_id LastRunInstanceId, diff --git a/Opserver/Views/SQL/Instance.Jobs.cshtml b/Opserver/Views/SQL/Instance.Jobs.cshtml index aca94dcd5..85a4efe5b 100644 --- a/Opserver/Views/SQL/Instance.Jobs.cshtml +++ b/Opserver/Views/SQL/Instance.Jobs.cshtml @@ -62,9 +62,16 @@ Last Run Message: @j.LastRunMessage"> @(j.LastStopDate?.ToRelativeTimeSpan()) @(j.LastRunDuration.HasValue ? j.LastRunDuration.Value.ToTimeStringMini() : "") } + else if (j.LastStartDate.HasValue && !j.LastStopDate.HasValue) + { + @j.LastRunMonitorStatus.IconSpan() @j.LastRunMonitorStatus.Span("Server Stopped whilst Running") (@lastInitiator) + @(j.LastStartDate?.ToRelativeTimeSpan()) + + + } else { - no run history found + no run history found } @(j.IsEnabled ? "Yes" : "No") @if (Current.IsInRole(Roles.SQLAdmin))