From 6c383b4e6d07037ff5ecd7708ef660e46645b169 Mon Sep 17 00:00:00 2001 From: "Haoran Sun (Business Central)" Date: Tue, 10 Sep 2024 10:39:56 +0200 Subject: [PATCH] Delete TenantMediaSet in Batch and safeguard loading detached media --- .../src/MediaCleanup.Codeunit.al | 2 ++ .../src/MediaCleanupImpl.Codeunit.al | 13 ++++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/System Application/App/Data Administration/src/MediaCleanup.Codeunit.al b/src/System Application/App/Data Administration/src/MediaCleanup.Codeunit.al index 426030b3a0..e57fcb2b50 100644 --- a/src/System Application/App/Data Administration/src/MediaCleanup.Codeunit.al +++ b/src/System Application/App/Data Administration/src/MediaCleanup.Codeunit.al @@ -83,6 +83,8 @@ codeunit 1927 "Media Cleanup" /// /// Deletes all detached tenant media sets. + /// Note: This function will delete detached media set in batches of 10 and commit in between each batch. + /// This is to ensure we don't get stuck always trying to delete the same media and time out. /// procedure DeleteDetachedTenantMediaSet() begin diff --git a/src/System Application/App/Data Administration/src/MediaCleanupImpl.Codeunit.al b/src/System Application/App/Data Administration/src/MediaCleanupImpl.Codeunit.al index 6680cf5479..f3a2cbb45d 100644 --- a/src/System Application/App/Data Administration/src/MediaCleanupImpl.Codeunit.al +++ b/src/System Application/App/Data Administration/src/MediaCleanupImpl.Codeunit.al @@ -74,8 +74,8 @@ codeunit 1928 "Media Cleanup Impl." repeat if TenantMedia.Get(TenantMediaSet."Media ID".MediaId()) then begin TempTenantMediaVar := TenantMedia; - TempTenantMediaVar.Insert(); - MediaLoaded += 1; + if TempTenantMediaVar.Insert() then + MediaLoaded += 1; if MediaLoaded >= RecordLimit then exit(false); end; @@ -162,16 +162,19 @@ codeunit 1928 "Media Cleanup Impl." var [SecurityFiltering(SecurityFilter::Ignored)] TenantMediaSet: Record "Tenant Media Set"; + SplitList: List of [List of [Guid]]; MediaSetOrphans: List of [Guid]; - Orphan: Guid; + MediaOrphanSubList: List of [Guid]; begin if not TenantMediaSet.WritePermission() then exit; MediaSetOrphans := MediaSet.FindOrphans(); - foreach Orphan in MediaSetOrphans do begin - TenantMediaSet.SetRange(ID, Orphan); + SplitListIntoSubLists(MediaSetOrphans, 10, SplitList); + foreach MediaOrphanSubList in SplitList do begin + TenantMediaSet.SetFilter(ID, CreateOrFilter(MediaOrphanSubList)); TenantMediaSet.DeleteAll(); + Commit(); // Ensure we keep the progress even on timeout (in case of large amounts of detached media). end; end;