Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Duplicate entries in __mergedSources #3321

Open
Iron-Ham opened this issue Jan 18, 2024 · 4 comments
Open

Duplicate entries in __mergedSources #3321

Iron-Ham opened this issue Jan 18, 2024 · 4 comments
Assignees
Labels
bug Generally incorrect behavior needs investigation

Comments

@Iron-Ham
Copy link
Contributor

Summary

I've noticed that we occasionally get duplicate entries in merged sources of generated files. It often takes the form of:

public static var __mergedSources: [any ApolloAPI.SelectionSet.Type] { [
  UserListItemFragment.self,
  AvatarFragment.self,
  FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser.self,
  FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser.self
] }

Note that this has been a bug in some form since at least 1.2.0. In previous versions, this was a rare event. In 1.7.1, it's a certainty.

Version

1.7.1

Steps to reproduce the behavior

I've been able to reliably reproduce this by having both an in-line fragment on a member of a union type and a named fragment that relies on the same underlying type within the same selection set:

# Within a query response selection set

... on MyUnionType { # I don't know if this has to be a union type, but this seems to be the case that this is occurring in.
  ... on User { 
    # Whatever selections are needed
  }
  ... on UserListItemFragment
}

In this instance:

  • MyUnionType is a union type that includes User
  • UserListItemFragment is a named fragment on User

Logs

No response

Anything else?

No response

@Iron-Ham Iron-Ham added bug Generally incorrect behavior needs investigation labels Jan 18, 2024
@calvincestari calvincestari self-assigned this Jan 18, 2024
@calvincestari
Copy link
Member

@Iron-Ham, did you have any luck working with the schema we spoke about last week to reproduce this yet?

@Iron-Ham
Copy link
Contributor Author

Iron-Ham commented Feb 14, 2024

So that this isn't a black-box for other impacted folks: Calvin and I have been sharing information via private channels in order to try and track down this issue.

It proved quite difficult to reproduce outside of GitHub's non-public schema, so we've been collaborating on trying down to narrow down a reproduction case. Earlier this week, Calvin shared an idea and provided a branch that includes additional debugging when it hits a duplicate. The basis is that Calvin has the hypothesis we'd like to test: given that mergedSources is an OrderedSet<IR.MergedSelections.MergedSource> it's possible that we're not getting exact duplicates – the typeInfo or fragment sources may be different, and they could be resolved to the same selection set name. This implies that we may not be resolving the selection set name correctly.

When applying that branch to a fork of 1.7.1 (as that's the current version we are using internally at GitHub), we hit some debugging logs that seem to support the general hypothesis:

1.7.1 Logs

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

Examining the first error statement, and adding some new lines where I think they belong (please correct me on this one if my assumptions are wrong @calvincestari), we're left with:

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)

Sources: OrderedSet<MergedSource>([
    [[Object - User]], fragment: UserListItemFragment on Object - User, 
    [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem
])

Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

When applied to the ApolloCodegenLib's main branch – instead of 1.7.1 – we see an identical result:

1.8.x Logs

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet<MergedSource>([[[Object - User]], fragment: UserListItemFragment on Object - User, [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem])
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

Adding newlines to the first output, as before, yields:

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)

Sources: OrderedSet<MergedSource>([
    [[Object - User]], fragment: UserListItemFragment on Object - User, 
    [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem
])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

@calvincestari
Copy link
Member

Thanks @Iron-Ham.

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)

Sources: OrderedSet<MergedSource>([
    [[Object - User]], fragment: UserListItemFragment on Object - User, 
    [[Interface - Actor]], fragment: AvatarFragment on Interface - Actor, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem, 
    [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: FeedItemFragment on Union - FeedItem
])
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

Yup, you've broken it up correctly and it looks like we are indeed getting duplicates in the set - which should not be happening!

@Iron-Ham
Copy link
Contributor Author

Iron-Ham commented Feb 14, 2024

When ran again with additional debugging, we get the following:

Logs

Cleaned first result:

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)

Sources: [
  entity: IR.Entity, 
  scopePath: [[Object - User]],
  fragment:
    rootField: UserListItemFragment: User!,
    definition: UserListItemFragment on Object - User, 
  
  entity: IR.Entity,
  scopePath: [[Interface - Actor]], 
  fragment: 
    rootField: AvatarFragment: Actor!,
    definition: AvatarFragment on Interface - Actor, 
  
  entity: IR.Entity,
  scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], 
  fragment: 
    rootField: FeedItemFragment: FeedItem!,
    definition: FeedItemFragment on Union - FeedItem, 
  
  entity: IR.Entity,
  scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], 
  fragment: 
    rootField: FeedItemFragment: FeedItem!,
    definition: FeedItemFragment on Union - FeedItem
]

Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

Full Logs:

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: [entity: IR.Entity,
scopePath: [[Object - User]], fragment: rootField: UserListItemFragment: User!,
definition: UserListItemFragment on Object - User, entity: IR.Entity,
scopePath: [[Interface - Actor]], fragment: rootField: AvatarFragment: Actor!,
definition: AvatarFragment on Interface - Actor, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem]
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: [entity: IR.Entity,
scopePath: [[Object - User]], fragment: rootField: UserListItemFragment: User!,
definition: UserListItemFragment on Object - User, entity: IR.Entity,
scopePath: [[Interface - Actor]], fragment: rootField: AvatarFragment: Actor!,
definition: AvatarFragment on Interface - Actor, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem]
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: [entity: IR.Entity,
scopePath: [[Object - User]], fragment: rootField: UserListItemFragment: User!,
definition: UserListItemFragment on Object - User, entity: IR.Entity,
scopePath: [[Interface - Actor]], fragment: rootField: AvatarFragment: Actor!,
definition: AvatarFragment on Interface - Actor, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowRecommendationFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem]
Duplicating generated selection set name FeedItemFragment.AsFollowRecommendationFeedItem.Followee.AsUser

[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: [entity: IR.Entity,
scopePath: [[Object - User]], fragment: rootField: UserListItemFragment: User!,
definition: UserListItemFragment on Object - User, entity: IR.Entity,
scopePath: [[Interface - Actor]], fragment: rootField: AvatarFragment: Actor!,
definition: AvatarFragment on Interface - Actor, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem, entity: IR.Entity,
scopePath: [[Union - FeedItem -> Object - FollowedUserFeedItem] -> [Union - Followable -> Object - User]], fragment: rootField: FeedItemFragment: FeedItem!,
definition: FeedItemFragment on Union - FeedItem]
Duplicating generated selection set name FeedItemFragment.AsFollowedUserFeedItem.Followee.AsUser

With these more detailed logs, we still see no difference.

@apollographql apollographql deleted a comment from Aminekerfah Feb 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Generally incorrect behavior needs investigation
Projects
None yet
Development

No branches or pull requests

2 participants