diff --git a/.vscode/launch.json b/.vscode/launch.json index 7f996a36..cddb1cbc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,8 +40,8 @@ "env": { // "ASPNETCORE_ENVIRONMENT": "Development", "AYANOVA_JWT_SECRET": "1111111MyRandom32CharacterSecret", - "AYANOVA_LOG_LEVEL": "Info", - //"AYANOVA_LOG_LEVEL": "Debug", + //"AYANOVA_LOG_LEVEL": "Info", + "AYANOVA_LOG_LEVEL": "Debug", // // "AYANOVA_LOG_LEVEL": "Trace", "AYANOVA_DEFAULT_TRANSLATION": "en", "AYANOVA_DB_CONNECTION": "Server=localhost;Username=postgres;Password=raven;Database=AyaNova;CommandTimeout=120;", diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs index 57587dec..aaa99f67 100644 --- a/server/AyaNova/Controllers/ReportController.cs +++ b/server/AyaNova/Controllers/ReportController.cs @@ -267,21 +267,22 @@ namespace AyaNova.Api.Controllers return Accepted(new { JobId = result }); } - /// + /// /// Attempt cancel render job /// /// /// nothing - [HttpGet("request-cancel/{gid}")] + [HttpPost("request-cancel/{gid}")] public async Task RequestCancelJob([FromRoute] Guid gid) - { - if (!serverState.IsOpen) + { + if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext); if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) return StatusCode(403, new ApiNotAuthorizedResponse()); if (!ModelState.IsValid) return BadRequest(new ApiErrorResponse(ModelState)); + log.LogDebug($"request-cancel called for report rendering job id {gid}"); await biz.CancelJob(gid); return NoContent(); } diff --git a/server/AyaNova/biz/ReportBiz.cs b/server/AyaNova/biz/ReportBiz.cs index 6d199e67..5da09244 100644 --- a/server/AyaNova/biz/ReportBiz.cs +++ b/server/AyaNova/biz/ReportBiz.cs @@ -1306,7 +1306,7 @@ namespace AyaNova.Biz await browser.CloseAsync(); } log.LogDebug($"Calling ReportRenderManager.RemoveJob to stop tracking this job/process"); - await ReportRenderManager.RemoveJob(job.GId, log); + await ReportRenderManager.RemoveJob(job.GId, log, false); } } @@ -1321,7 +1321,7 @@ namespace AyaNova.Biz public async Task CancelJob(Guid jobId) { - await ReportRenderManager.RemoveJob(jobId, AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::CancelJob")); + await ReportRenderManager.RemoveJob(jobId, AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::CancelJob"), true); } //////////////////////////////////////////////////////////////////////////////////////////////// //JOB / OPERATIONS diff --git a/server/AyaNova/util/ReportProcessManager.cs b/server/AyaNova/util/ReportProcessManager.cs index 3562680c..e6305baf 100644 --- a/server/AyaNova/util/ReportProcessManager.cs +++ b/server/AyaNova/util/ReportProcessManager.cs @@ -45,19 +45,34 @@ namespace AyaNova.Util if (i.Expires < dtNow) { log.LogDebug($"attempting close of expired process {i.ReporterProcessId} for job {i.JobId}"); - await CloseRenderProcess(i, log); + await CloseRenderProcess(i, log, true); } } } - internal static async Task CloseRenderProcess(ReportRenderInstanceInfo instance, ILogger log) + internal static async Task CloseRenderProcess(ReportRenderInstanceInfo instance, ILogger log, bool force) { - log.LogDebug($"ForceCloseProcess on report render instance id {instance.ReporterProcessId} expired {instance.Expires.ToString()} utc"); + if (force) + log.LogDebug($"Force CloseRenderProcess on report render instance id {instance.ReporterProcessId} expiry {instance.Expires.ToString()} utc"); + else + log.LogDebug($"Normal CloseRenderProcess on report render instance id {instance.ReporterProcessId}"); + try { //either way, clear the job so the client gets informed - await JobsBiz.LogJobAsync(instance.JobId, $"rendererror:timeout,{ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT}");//parseable for print client - await JobsBiz.UpdateJobStatusAsync(instance.JobId, JobStatus.Failed); + if (force) + { + if (instance.Expires < DateTime.UtcNow) + { + await JobsBiz.LogJobAsync(instance.JobId, $"rendererror:timeout,{ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT}");//parseable for print client + await JobsBiz.UpdateJobStatusAsync(instance.JobId, JobStatus.Failed); + } + else + { + await JobsBiz.LogJobAsync(instance.JobId, $"rendererror:cancelled"); + await JobsBiz.UpdateJobStatusAsync(instance.JobId, JobStatus.Completed); + } + } if (instance.ReporterProcessId != -1)//if a job doesn't have a process id yet it will be -1 { @@ -114,13 +129,13 @@ namespace AyaNova.Util } } - internal static async Task RemoveJob(Guid jobId, ILogger log) + internal static async Task RemoveJob(Guid jobId, ILogger log, bool force) { foreach (var i in _baginstances) { if (i.JobId == jobId) { - await CloseRenderProcess(i, log); + await CloseRenderProcess(i, log, force); break; } } @@ -139,17 +154,7 @@ namespace AyaNova.Util return false; } - internal static async Task RemoveProcess(int processId, ILogger log) - { - foreach (var i in _baginstances) - { - if (i.ReporterProcessId == processId) - { - await CloseRenderProcess(i, log); - break; - } - } - } + }//eoc }//eons \ No newline at end of file