Skip to content

Commit

Permalink
Delete TenantMediaSet in Batch and safeguard loading detached media (#…
Browse files Browse the repository at this point in the history
…1990)

#### Summary

The PR consists of two parts:
1. Safeguard loading detached media. Loading detached media to temp
record could fail (observed in Telemetry) with duplicated ID, using `if
... then ...` so safeguard the insert.
2. Delete Tenant Media Set in batch and Commit between each batch. Just
like what we did with Tenant Media, providing the ability to clean up
even when there are large number of records.

The code change should be covered by test case:
`EnsureDetachedMediaAndMediaSetAreCleanedUp`

#### Work Item(s)

Fixes
[AB#548323](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/548323)
  • Loading branch information
haoranpb authored Sep 10, 2024
1 parent 69d45e8 commit 782de91
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ codeunit 1927 "Media Cleanup"

/// <summary>
/// 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.
/// </summary>
procedure DeleteDetachedTenantMediaSet()
begin
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down

0 comments on commit 782de91

Please sign in to comment.