From 32d6cb555d49e41de42cb93dd5d2d227d4173f43 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Fri, 21 Jun 2024 14:42:00 +0200 Subject: [PATCH] [backend/configuration] Allow configuring of queue job retention --- Iceshrimp.Backend/Core/Configuration/Config.cs | 14 +++++++++++++- .../Core/Extensions/ServiceExtensions.cs | 2 ++ Iceshrimp.Backend/Core/Tasks/JobCleanupTask.cs | 11 +++++++---- Iceshrimp.Backend/configuration.ini | 7 +++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Iceshrimp.Backend/Core/Configuration/Config.cs b/Iceshrimp.Backend/Core/Configuration/Config.cs index 39361e15..796f9663 100644 --- a/Iceshrimp.Backend/Core/Configuration/Config.cs +++ b/Iceshrimp.Backend/Core/Configuration/Config.cs @@ -13,6 +13,7 @@ public sealed class Config public required SecuritySection Security { get; init; } = new(); public required StorageSection Storage { get; init; } = new(); public required PerformanceSection Performance { get; init; } = new(); + public required QueueSection Queue { get; init; } = new(); public sealed class InstanceSection { @@ -282,4 +283,15 @@ public sealed class Config [Range(1, int.MaxValue)] public int PreDeliver { get; init; } = 4; [Range(1, int.MaxValue)] public int BackgroundTask { get; init; } = 4; } -} + + public sealed class QueueSection + { + public JobRetentionSection JobRetention { get; init; } = new(); + } + + public sealed class JobRetentionSection + { + [Range(0, int.MaxValue)] public int Completed = 10; + [Range(0, int.MaxValue)] public int Failed = 10; + } +} \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs index cb284168..230671be 100644 --- a/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs +++ b/Iceshrimp.Backend/Core/Extensions/ServiceExtensions.cs @@ -113,6 +113,8 @@ public static class ServiceExtensions .ConfigureWithValidation(configuration, "Security") .ConfigureWithValidation(configuration, "Performance") .ConfigureWithValidation(configuration, "Performance:QueueConcurrency") + .ConfigureWithValidation(configuration, "Queue") + .ConfigureWithValidation(configuration, "Queue:JobRetention") .ConfigureWithValidation(configuration, "Database") .ConfigureWithValidation(configuration, "Storage") .ConfigureWithValidation(configuration, "Storage:Local") diff --git a/Iceshrimp.Backend/Core/Tasks/JobCleanupTask.cs b/Iceshrimp.Backend/Core/Tasks/JobCleanupTask.cs index 929fc056..f0e2886b 100644 --- a/Iceshrimp.Backend/Core/Tasks/JobCleanupTask.cs +++ b/Iceshrimp.Backend/Core/Tasks/JobCleanupTask.cs @@ -1,8 +1,10 @@ using System.Diagnostics.CodeAnalysis; +using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database; using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Services; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; namespace Iceshrimp.Backend.Core.Tasks; @@ -11,19 +13,20 @@ public class JobCleanupTask : ICronTask { public async Task Invoke(IServiceProvider provider) { - var db = provider.GetRequiredService(); - var queue = provider.GetRequiredService(); + var db = provider.GetRequiredService(); + var queue = provider.GetRequiredService(); + var retention = provider.GetRequiredService>(); foreach (var name in queue.QueueNames) { await db.Jobs.Where(p => p.Queue == name && p.Status == Job.JobStatus.Completed) .OrderByDescending(p => p.FinishedAt) - .Skip(10) + .Skip(retention.Value.Completed) .ExecuteDeleteAsync(); await db.Jobs.Where(p => p.Queue == name && p.Status == Job.JobStatus.Failed) .OrderByDescending(p => p.FinishedAt) - .Skip(100) + .Skip(retention.Value.Failed) .ExecuteDeleteAsync(); } } diff --git a/Iceshrimp.Backend/configuration.ini b/Iceshrimp.Backend/configuration.ini index 87fb8f23..aaf9e893 100644 --- a/Iceshrimp.Backend/configuration.ini +++ b/Iceshrimp.Backend/configuration.ini @@ -81,6 +81,13 @@ Deliver = 20 PreDeliver = 4 BackgroundTask = 4 +;; How many completed & failed jobs to keep around, per queue. +;; Excess is trimmed every 15 minutes, oldest jobs first. +;; (-1 = no limit) +[Queue:JobRetention] +Completed = 10 +Failed = 100 + [Database] ;; Hostname, IP address or path to unix socket directory (specifying port is required even for unix sockets) Host = localhost