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

DocumentTransform: use a WeakCache #11388

Closed
wants to merge 8 commits into from

Conversation

phryneas
Copy link
Member

This is option 1 of 2 - I'll open a PR going a bit further and replacing a lot of the logic with optimism in a bit. Will be linked here.

Checklist:

  • If this PR contains changes to the library itself (not necessary for e.g. docs updates), please include a changeset (see CONTRIBUTING.md)
  • If this PR is a new feature, please reference an issue where a consensus about the design was reached (not necessary for small changes)
  • Make sure all of the significant new logic is covered by tests

@phryneas phryneas added this to the MemoryAnalysis milestone Nov 27, 2023
@phryneas phryneas requested a review from jerelmiller November 27, 2023 17:23
Copy link

changeset-bot bot commented Nov 27, 2023

🦋 Changeset detected

Latest commit: 263ae13

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@apollo/client Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copy link
Contributor

github-actions bot commented Nov 27, 2023

size-limit report 📦

Path Size
dist/apollo-client.min.cjs 37.29 KB (+0.03% 🔺)
import { ApolloClient, InMemoryCache, HttpLink } from "dist/main.cjs" 43.73 KB (+0.03% 🔺)
import { ApolloClient, InMemoryCache, HttpLink } from "dist/main.cjs" (production) 42.21 KB (+0.03% 🔺)
import { ApolloClient, InMemoryCache, HttpLink } from "dist/index.js" 32.79 KB (+0.07% 🔺)
import { ApolloClient, InMemoryCache, HttpLink } from "dist/index.js" (production) 31.45 KB (+0.01% 🔺)
import { ApolloProvider } from "dist/react/index.js" 1.28 KB (0%)
import { ApolloProvider } from "dist/react/index.js" (production) 1.26 KB (0%)
import { useQuery } from "dist/react/index.js" 4.34 KB (0%)
import { useQuery } from "dist/react/index.js" (production) 4.16 KB (0%)
import { useLazyQuery } from "dist/react/index.js" 4.65 KB (0%)
import { useLazyQuery } from "dist/react/index.js" (production) 4.47 KB (0%)
import { useMutation } from "dist/react/index.js" 2.61 KB (0%)
import { useMutation } from "dist/react/index.js" (production) 2.6 KB (0%)
import { useSubscription } from "dist/react/index.js" 2.29 KB (0%)
import { useSubscription } from "dist/react/index.js" (production) 2.25 KB (0%)
import { useSuspenseQuery } from "dist/react/index.js" 4.33 KB (0%)
import { useSuspenseQuery } from "dist/react/index.js" (production) 3.79 KB (0%)
import { useBackgroundQuery } from "dist/react/index.js" 3.83 KB (0%)
import { useBackgroundQuery } from "dist/react/index.js" (production) 3.27 KB (0%)
import { useReadQuery } from "dist/react/index.js" 3.05 KB (0%)
import { useReadQuery } from "dist/react/index.js" (production) 3 KB (0%)
import { useFragment } from "dist/react/index.js" 2.15 KB (0%)
import { useFragment } from "dist/react/index.js" (production) 2.1 KB (0%)

@@ -595,7 +595,7 @@ export class DocumentTransform {
concat(otherTransform: DocumentTransform): DocumentTransform;
// (undocumented)
getStableCacheEntry(document: DocumentNode): {
key: DocumentTransformCacheKey;
key?: undefined;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a kinda-minor breaking change here - if we kept this key in memory here, we would again risk strongly referencing the original DocumentNode.
It might be fine to still keep it in here, and if we decide on that, I'll experiment if this will actually hinder it from cache-collection, but on the other hand we also just don't need this property.

@jerelmiller what's your feeling on this change?

@@ -134,7 +144,14 @@ export class DocumentTransform {
Array.isArray(cacheKeys),
"`getCacheKey` must return an array or undefined"
);
return this.stableCacheKeys.lookupArray(cacheKeys);
const key = this.stableCacheKeys.lookupArray(cacheKeys);
Copy link
Member Author

@phryneas phryneas Nov 27, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Essentially, this PR decouples the Trie and the data - the Trie only stores the cache keys (which are empty objects, not the array used to access the Trie), while the data is stored in the WeakCache.
This enables us to have a max size, which is impossible for a Trie, but possible for a WeakCache.

Base automatically changed from pr/print-weakCache to release-3.9 November 29, 2023 10:46
@phryneas phryneas closed this Nov 30, 2023
@jerelmiller jerelmiller deleted the pr/DocumentTransform-weakCache branch December 1, 2023 00:32
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jan 1, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant