Closed Iron-Ham closed 3 months ago
@Iron-Ham, did you have any luck working with the schema we spoke about last week to reproduce this yet?
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:
```
[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet
When applied to the ApolloCodegenLib
's main
branch – instead of 1.7.1 – we see an identical result:
```
[ERROR - ApolloCodegenLib:SelectionSetTemplate.swift:182] - 4 mergedSources for operation(IR.Operation)
Sources: OrderedSet
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!
When ran again with additional debugging, we get the following:
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.
@Iron-Ham, I know we weren't able to come up with a reproduction case for this yet. Are you still experiencing this bug?
Apologies for the late response,
It's still reproducible as we haven't upgraded beyond 1.7.1 yet, but I haven't verified this behavior on the current release. I'm happy to have this closed out unless it pops up again – in case it does, future readers will see a workaround above.
Yeah, I'm still stumped on this one. I'll close it out and let's keep an eye on it as @AnthonyMDev works through the merged fields work since that touches much of the logic that would be responsible for this bug.
Do you have any feedback for the maintainers? Please tell us by taking a one-minute survey. Your responses will help us understand Apollo iOS usage and allow us to serve you better.
Summary
I've noticed that we occasionally get duplicate entries in merged sources of generated files. It often takes the form of:
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:
In this instance:
MyUnionType
is a union type that includesUser
UserListItemFragment
is a named fragment onUser
WORKAROUND:
Instead of structuring your selection as above, structure it like so:
Logs
No response
Anything else?
No response