Skip to content

Optimize policy validation when there are many errors in a large policy set #2598

Open

Description

@john-h-kastner-aws

Due to how errors are de-duplicated, policy validation can be excessively slow for large policy sets containing many errors. While this case isn't particularly important (validation is required prior to TPE or symbolic compilation, so we'd like it to be fast, but we can assume these policies are almost always valid), I think we can improve it.

Errors are de-duplicated by inserting into a HashSet, but errors have a source location which holds an Arc<str>, so hashing it potentially expensive for a large policy document.

For example, this policy found in fuzzing.

        forbid(
          principal,
          action,
          resource
        ) when {
          (((((true && (if (if (if ([].contains([[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[], [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[context, context, context, context], [context, context, context, context], [context, context, context, context], [context, context, context, context]], [[context, context, {}, {}], [{}], [{}], [{}]], [[{}]], [[{}]]], [[[{}]]], [[[{}]]], [[[{}]]]], [[[[{}]]]], [[[[{}]]]], [[[[{}, {}, {}, {}, {}, {}]]]]], [[[[[], [], [], [], [{}, {}, {}, context, {}, {}, {}], [{}]], [], [[{}]], [[]], [[{}]], [[{}]]], [[[{}, {}, {}, {}, {}, {}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}, context, context, {}], [{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, context]], [[{}, {}, {}, context, context], [], [], [{}, {}, {}, context, {}, {}, context], [{}, {}, {}, {}, {}, {}, {}], [{}, {}], [{}, {}, {}, {}, {}, {}, {}]]], [[[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [context, {}, {}, {}, {}, {}, {}], [{}, context]], [[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}], [{}, {}, {}], [{}, context, context], [], [context, context, context], []], [[{}, context, context, context, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, context, context, context, context, context], []], [], [], [], []], [], [[[], [{}, {}, {}, {}, {}], [{}, {}]], [[context, context], []], [], [], []], []], [], [], [], [], []], [], []], [], [], []], [[[[[[[{}, {}, {}, {}, {}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]]], [[[[], [[{}, {}, {}, {}, {}, {}]], [], []], [], []], [], []], [], [], [], [[[[[{}, {}], [{}, {}]], [[], []]], []], []], []], [], [], [], [], [[[[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]], [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}]], [[{}]]]]], []], []], [], []], [], [], []], [], [], []], [], [], []]]]]]]]]]], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [[[[[[]]]]]], [], [], [], [], []], [], [], [], [], [], []], [[[[[[[[[[[[[[[[[[[[[[[[], [], [], [], [], []], [], [[[[[[], [[{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}]], [[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [context, {}, {}, {}, {}, {}, {}], [{}, context]], [[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}], [{}, {}, {}], [{}, context, context], [], [context, context, context], []], [[{}, context, context, context, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}], [{}, context, context, context, context, context], []], [], []], [], [], [], [[[], [{}, {}, {}, {}, {}], [{}, {}]], [[context, context], []], [], [], []], [], []], [], [], [], []], [], [], [], [], [], [[[[[{}, {}, {}, {}, {}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}, {}, context, context, {}]], [[{}, {}], [{}, {}], [], [], [], []]], [], []], [], [], [], [[[[{}, {}], [{}, {}]], [[context, context], []]], []], [], []]], [], [], []], [[[[[[[{}, {}], [{}, {}, {}, {}, {}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}, {}, {}, {}]]]], [[[[{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}]], [[{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}]], [[{}, {}, {}, {}, {}], [{}, {}, {}, {}, {}], [{}, {}, {}, {}, context], [{}, {}, {}, {}, {}, {}, {}], []], [[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}], [{}], [{}]], [[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, context], [], [], [], [], []]], [], [], [[[{}]]], [[[{}]]]]], [[[[[{}, {}, {}, {}, {}]]]]]], [[[[[[{}]]]]]]], [[[[], []], [], [[[[[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, context, {}, {}, {}]], [[{}, {}, {}, {}, {}, {}, {}], [{}], [{}], [{}], [context], [context, context, context, context], [context, context, context, context]], [[context, context, context, context], [context, context, context, context], [context, context, context, context], [context, context, context, context]], [[{}, {}, {}, {}], [{}], [{}], [{}]], [[{}]], [[{}]], [[{}]]], [[[{}]]], [[[{}]]], [[[{}]]], [[[{}]]], [[[{}]]], [[[{}, {}, {}, {}, {}, {}], [{}, context, context, context, context, {}], [{}, {}, context, {}, {}, {}, {}], [context, {}, {}, {}, {}, context], [{}], [{}]], [[{}, {}, {}, {}, {}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]], [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}, context, context, {}]]], [[[{}, {}], [{}, {}, {}, {}, {}]], [[{}, context, {}, {}, {}, {}], [context, context, context, {}], [{}, {}], [{}, {}, context, {}], [{}, {}, {}, {}, {}, {}, {}]], [[{}, {}], [{}, {}, {}, {}, {}, context], [context, context, context, context, {}, {}, {}], [context, {}, {}, context, {}, context, {}], [{}, {}, {}, context, {}, {}, {}], [{}, {}, context, context, context, context, context], [context, context, context, context]], [[context, context, context, context], [{}, {}, context, context, context], [context, context, context, context], [context, context, context, context]], [[context, context, context, context], [context, context, context, context], [context, context, context, context], [context, {}, {}, {}]], [[{}, {}, context, {}, context, context], [{}, {}], [{}, {}, context, context, context, context], [], [], []]]], [[[[{}, {}, {}, {}, {}, {}], [context], [context, context, context, context], [context, context, context, context], [context, context, context, context], [{}, {}, context, context, context]], [[context, context, context, context], [context, context, context, context], [context, context, context, context], [context, context, context, context]], [[context, context, context, context], [context, context, context, context], [context, context, context, context], [context, context, context, context]], [[context, context, {}, {}], [{}, {}], [{}, {}, {}, {}, {}, {}], []], [], []], [[[context, {}, context, {}], []], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], [[], [[[[[{}, {}], [{}, {}]], [[{}, context, context], [{}], [{}, {}], [{}, {}], []], [], []], []], []], [], [], [], []], [[[[[[{}, {}], [{}, {}]], []], []], []], []], []], [], []], [], [], [[[[[[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]], [[[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]], [[[{}, {}], [{}, {}]], [[{}, {}], [{}, {}]]]]], [[[[[context]]]]]], []], []], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], []], [], [], [], [[[[[[[[[[[[[], [[], [], [[[[], [[{}]], [[{}]], [[{}]], [[{}]], [[{}, {}, {}, {}, {}, {}], [{}], [{}], [{}], [{}], [{}]]]]], [[[[[{}, {}, {}, context, {}, {}, {}], [{}, {}, {}, {}, {}, {}, {}], [{}, {}, context, {}, {}, {}, {}], [{}, {}, context, {}, {}, context, context]]]]], [[]]]], [[[[[[[{}]]]]], [[[[[{}]]]]]], [[[[[[{}, {}, {}, {}, {}, {}, {}], [{}, {}, {}, {}, {}, context, context], [], [], [], [], []]], [], [], [], [], [], []]]], [], [], [], []], [], [], []], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], []]]]]]]], [], [], [], []], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], []], [], []], [], [], [], [], []], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []], [], [], [], [], [], []])) then false else false) then false else false) then false else false)) && false) && false) && false) && false) && false
        };

Activity

  1. added
    internal-improvementRefactoring, minor performance improvement, or other changes that Cedar users may never notice
    on Oct 5, 2026
  2. added 2 commits that reference this issue on Oct 15, 2026
    3851f9a
    354778f
  3. Vedthakar commented on Oct 21, 2026

    @Vedthakar
    Contributor

    I opened #2636 for this: Loc now hashes only its span, so de-duplicating validation errors is no longer quadratic in the size of the policy set.

    — Ved Thakar

  4. added a commit that references this issue on Oct 25, 2026
    c8b2946
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

    internal-improvementRefactoring, minor performance improvement, or other changes that Cedar users may never notice

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions