Skip to content

Profile convert to metadata format is O(n²) per tag in mergeProfiles (13.8.3+), blocks the event loop for minutes on large profiles #3681

Open
forcedotcom/source-deploy-retrieve
#1867

Description

@sfdcmatt

Versions: @salesforce/source-deploy-retrieve 13.10.1 (same mergeProfiles loop since 13.8.3, when ProfileMetadataFinalizer was added; 13.8.2 and earlier copied profile files as-is). Node 26.0.0, macOS.

Repro: a project with 73 profiles in one package directory (103 MB of *.profile-meta.xml, large fieldPermissions / objectPermissions lists). ComponentSet.fromSource(profilesDir) then new MetadataConverter().convert(cs, 'metadata', { type: 'zip' }):

Version convert longest event-loop block zip bytes
13.7.0 2.1 s ~0.1 s 7,116,094
13.10.1 247 s one continuous block 7,116,094
13.10.1 + fix below 7.9-8.3 s 5.9-6.3 s 7,116,094

Output is byte-identical in all three (per-entry sha256 of the zip match).

Root cause: src/convert/convertContext/profileMetadataFinalizer.ts, mergeProfiles, line 235:

if (mergedValues.some((existing) => isDeepStrictEqual(existing, entry))) continue;

Every entry is compared with every entry already merged for that tag, synchronously, so a tag with n entries costs n²/2 isDeepStrictEqual calls. This runs even when a profile has only one source file, where there is nothing to merge.

Proposed fix: (1) when profiles.length === 1, return the single profile's entries as-is (root attributes built the same way); (2) for several pieces, dedupe with a Set keyed by a deterministic serialization of each entry (sorted object keys) instead of the linear scan. The singleton-conflict check is unchanged.

Behavior note: with (1), exact duplicate entries inside one profile file are kept, as in 13.8.2 and earlier; 13.8.3-13.10.1 drop them. Duplicates across pieces are still removed.

The remaining ~6 s block after the fix is fast-xml-parser parsing all profiles back to back in parseXml (~4 s) plus JsToXml (~1.3 s), from the finalizer parsing and re-serializing profiles that 13.8.2 streamed unchanged. Not addressed here.

Activity

  1. added
    bugIssue or pull request that identifies or fixes a bug
    on Nov 5, 2026
  2. git2gus commented on Nov 5, 2026

    @git2gus

    This issue has been linked to a new work item: W-24802086

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugIssue or pull request that identifies or fixes a bug

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions