From 11b629442efe5b5fd3879d9e843f581576450fe6 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Thu, 23 Dec 2021 20:07:00 +0000 Subject: [PATCH] --- .../AyaNova/Controllers/ReportController.cs | 7 ++-- server/AyaNova/biz/JobsBiz.cs | 7 +++- ...CoreJobReportRenderEngineProcessCleanup.cs | 41 +++++++++++++++++++ .../generator/CoreJobTempFolderCleanup.cs | 4 +- server/AyaNova/resource/de.json | 2 +- server/AyaNova/resource/en.json | 2 +- server/AyaNova/resource/es.json | 2 +- server/AyaNova/resource/fr.json | 2 +- 8 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 server/AyaNova/generator/CoreJobReportRenderEngineProcessCleanup.cs diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs index 302ffad1..98a134bf 100644 --- a/server/AyaNova/Controllers/ReportController.cs +++ b/server/AyaNova/Controllers/ReportController.cs @@ -207,8 +207,9 @@ namespace AyaNova.Api.Controllers if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - //check for an kill any expired prior renders stuck around - Util.ReportRenderManager.KillExpiredRenders(log); + //this is done by a recurring JOB now so no longer needed here + // //check for an kill any expired prior renders stuck around + // Util.ReportRenderManager.KillExpiredRenders(log); ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext); if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType)) @@ -229,7 +230,7 @@ namespace AyaNova.Api.Controllers catch (ReportRenderTimeOutException) { log.LogInformation($"Report render timeout report id: {reportRequest.ReportId}, record count:{reportRequest.SelectedRowIds.LongLength}, user:{UserNameFromContext.Name(HttpContext.Items)} "); - return Ok(ApiOkResponse.Response(new { timeout = true, timeoutconfig = ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT })); + return Ok(ApiOkResponse.Response(new { timeout = true, timeoutconfigminutes = ServerBootConfig.AYANOVA_REPORT_RENDERING_TIMEOUT })); } catch (System.Exception ex) { diff --git a/server/AyaNova/biz/JobsBiz.cs b/server/AyaNova/biz/JobsBiz.cs index 77cafad5..0065f4c1 100644 --- a/server/AyaNova/biz/JobsBiz.cs +++ b/server/AyaNova/biz/JobsBiz.cs @@ -230,10 +230,15 @@ namespace AyaNova.Biz await CoreJobSweeper.DoWorkAsync(); if (!KeepOnWorking()) return; - //Clean temp folder + //Cleanup temp folder CoreJobTempFolderCleanup.DoWork(); if (!KeepOnWorking()) return; + //Check for and kill stuck report rendering engine processes + CoreJobReportRenderEngineProcessCleanup.DoWork(); + if (!KeepOnWorking()) return; + + log.LogTrace("Processing exclusive dynamic jobs"); //BIZOBJECT DYNAMIC JOBS diff --git a/server/AyaNova/generator/CoreJobReportRenderEngineProcessCleanup.cs b/server/AyaNova/generator/CoreJobReportRenderEngineProcessCleanup.cs new file mode 100644 index 00000000..b33b8b1d --- /dev/null +++ b/server/AyaNova/generator/CoreJobReportRenderEngineProcessCleanup.cs @@ -0,0 +1,41 @@ +using System; +using Microsoft.Extensions.Logging; +using AyaNova.Util; + + +namespace AyaNova.Biz +{ + /// + /// called by Generator to kill report generation processor stuck in limbo (chromium at this time) + /// + internal static class CoreJobReportRenderEngineProcessCleanup + { + private static ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("CoreJobReportRenderEngineProcessCleanup"); + + private static DateTime _lastRun = DateTime.UtcNow; + private static TimeSpan tsRunEvery = new TimeSpan(0, 5, 1);//every this minutes run the cleanup task + + //////////////////////////////////////////////////////////////////////////////////////////////// + // + // + public static void DoWork() + { + if (DateUtil.IsAfterDuration(_lastRun, tsRunEvery)) + { + log.LogTrace("Checking for expired processes"); + Util.ReportRenderManager.KillExpiredRenders(log); + //FileUtil.CleanTemporaryFilesFolder(new TimeSpan(0,5,0));//erase any files found to be older than 5 minutes + var now = DateTime.UtcNow; + _lastRun = now; + } + } + + + + + + ///////////////////////////////////////////////////////////////////// + + }//eoc +}//eons + diff --git a/server/AyaNova/generator/CoreJobTempFolderCleanup.cs b/server/AyaNova/generator/CoreJobTempFolderCleanup.cs index 9f7c22b0..c627d8ef 100644 --- a/server/AyaNova/generator/CoreJobTempFolderCleanup.cs +++ b/server/AyaNova/generator/CoreJobTempFolderCleanup.cs @@ -13,7 +13,7 @@ namespace AyaNova.Biz private static ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger("CoreJobTempFolderCleanup"); private static DateTime _lastRun = DateTime.UtcNow; - private static TimeSpan tsRunEvery = new TimeSpan(0, 0, 1);//every this minutes run the cleanup task + private static TimeSpan tsRunEvery = new TimeSpan(0, 5, 2);//every this minutes run the cleanup task //////////////////////////////////////////////////////////////////////////////////////////////// // @@ -23,7 +23,7 @@ namespace AyaNova.Biz if (DateUtil.IsAfterDuration(_lastRun, tsRunEvery)) { log.LogTrace("Temp cleanup now"); - FileUtil.CleanTemporaryFilesFolder(new TimeSpan(0,5,0));//erase any files found to be older than 5 minutes + FileUtil.CleanTemporaryFilesFolder(new TimeSpan(0,15,0));//erase any files found to be older than 15 minutes (which coincides with max report rendering timeout) var now = DateTime.UtcNow; _lastRun = now; } diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index 7a9c3516..3ddb08f5 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -2303,7 +2303,7 @@ "LastServiceWorkOrderServiceDate": "Letztes Servicedatum", "FilterUsers": "Benutzer filtern", "UserCountExceeded": "Server wegen Überschreitung der Lizenz für aktive Servicetyp-Benutzer geschlossen", - "ReportRenderAtCapacity": "Der Server hat derzeit das maximale Limit für die Verarbeitung von Berichten, bitte versuchen Sie es in Kürze erneut", + "ReportRenderTimeOut": "Der Server hat derzeit das maximale Limit für die Verarbeitung von Berichten, bitte versuchen Sie es in Kürze erneut", "NativeDateTimeInput": "Verwenden Sie die standardmäßigen Eingabesteuerelemente für Datum und Uhrzeit des Browsers", "CompanyInformation": "Firmeninformation", "CompanyEmail": "Email", diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 52cc1923..aa7ca8ec 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -2303,7 +2303,7 @@ "LastServiceWorkOrderServiceDate": "Last service date", "FilterUsers": "Filter Users", "UserCountExceeded": "Server locked due to exceeding licensed active scheduleable User limit", - "ReportRenderAtCapacity": "The server is currently at the maximum limit for processing reports, please try again shortly", + "ReportRenderTimeOut": "The server is currently at the maximum limit for processing reports, please try again shortly", "NativeDateTimeInput": "Use browser's standard date time input controls", "CompanyInformation": "Company information", "CompanyEmail": "Email", diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 32419e0f..e962b37f 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -2303,7 +2303,7 @@ "LastServiceWorkOrderServiceDate": "Última fecha de servicio", "FilterUsers": "Filtrar usuarios", "UserCountExceeded": "Servidor cerrado debido a que se superó la licencia para los usuarios del tipo de servicio activo", - "ReportRenderAtCapacity": "El servidor se encuentra actualmente en el límite máximo para procesar informes. Vuelva a intentarlo en breve.", + "ReportRenderTimeOut": "El servidor se encuentra actualmente en el límite máximo para procesar informes. Vuelva a intentarlo en breve.", "NativeDateTimeInput": "Utilice los controles de entrada de fecha y hora estándar del navegador", "CompanyInformation": "Información de la empresa", "CompanyEmail": "Email", diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index e6d16f93..9a04e10e 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -2303,7 +2303,7 @@ "LastServiceWorkOrderServiceDate": "Dernière date de service", "FilterUsers": "Filtrer les utilisateurs", "UserCountExceeded": "Serveur fermé en raison d'un dépassement de licence pour les utilisateurs de type de service actif", - "ReportRenderAtCapacity": "Le serveur est actuellement à la limite maximale pour le traitement des rapports, veuillez réessayer sous peu", + "ReportRenderTimeOut": "Le serveur est actuellement à la limite maximale pour le traitement des rapports, veuillez réessayer sous peu", "NativeDateTimeInput": "Utiliser les commandes de saisie de date et d'heure standard du navigateur", "CompanyInformation": "Informations sur la société", "CompanyEmail": "Email",