From cf1650e4018cacc415ca33a327becd4e62c58197 Mon Sep 17 00:00:00 2001 From: Jordan Eldredge Date: Mon, 3 Apr 2023 14:56:32 -0700 Subject: [PATCH] Log on LiveResolver batch start/end Differential Revision: D44465769 fbshipit-source-id: 141b6cc35e255ba3395022d6f3a7626e8756c377 --- .../relay-runtime/store/RelayStoreTypes.js | 12 +++++- .../__tests__/resolvers/LiveResolvers-test.js | 37 +++++++++++++++++++ .../LiveResolverStore.js | 11 +++++- 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/packages/relay-runtime/store/RelayStoreTypes.js b/packages/relay-runtime/store/RelayStoreTypes.js index f1a296913df40..5f7f4e6468ccf 100644 --- a/packages/relay-runtime/store/RelayStoreTypes.js +++ b/packages/relay-runtime/store/RelayStoreTypes.js @@ -717,6 +717,14 @@ export type EntrypointRootConsumeLogEvent = { +rootModuleID: string, }; +export type LiveResolverBatchStartLogEvent = { + +name: 'liveresolver.batch.start', +}; + +export type LiveResolverBatchEndLogEvent = { + +name: 'liveresolver.batch.end', +}; + export type LogEvent = | SuspenseFragmentLogEvent | SuspenseQueryLogEvent @@ -743,7 +751,9 @@ export type LogEvent = | StoreNotifyStartLogEvent | StoreNotifyCompleteLogEvent | StoreNotifySubscriptionLogEvent - | EntrypointRootConsumeLogEvent; + | EntrypointRootConsumeLogEvent + | LiveResolverBatchStartLogEvent + | LiveResolverBatchEndLogEvent; export type LogFunction = LogEvent => void; export type LogRequestInfoFunction = mixed => void; diff --git a/packages/relay-runtime/store/__tests__/resolvers/LiveResolvers-test.js b/packages/relay-runtime/store/__tests__/resolvers/LiveResolvers-test.js index e82be58f58d0c..89ee0c671c15e 100644 --- a/packages/relay-runtime/store/__tests__/resolvers/LiveResolvers-test.js +++ b/packages/relay-runtime/store/__tests__/resolvers/LiveResolvers-test.js @@ -150,14 +150,25 @@ test('Updates can be batched', () => { `, {}, ); + const log = jest.fn(); const store = new LiveResolverStore(source, { gcReleaseBufferSize: 0, + log, }); const environment = new RelayModernEnvironment({ network: RelayNetwork.create(jest.fn()), store, + log, }); + function getBatchLogEventNames(): string[] { + return log.mock.calls + .map(log => log[0].name) + .filter(name => { + return name.startsWith('liveresolver.batch'); + }); + } + const snapshot = environment.lookup(operation.fragment); const handler = jest.fn<[Snapshot], void>(); @@ -173,11 +184,18 @@ test('Updates can be batched', () => { let lastCallCount = handler.mock.calls.length; + expect(getBatchLogEventNames()).toEqual([]); + // Update _with_ batching. store.batchLiveStateUpdates(() => { GLOBAL_STORE.dispatch({type: 'INCREMENT'}); }); + expect(getBatchLogEventNames()).toEqual([ + 'liveresolver.batch.start', + 'liveresolver.batch.end', + ]); + // We get notified once per batch! :) expect(handler.mock.calls.length - lastCallCount).toBe(1); @@ -193,6 +211,13 @@ test('Updates can be batched', () => { }); }).toThrowError('An Example Error'); + expect(getBatchLogEventNames()).toEqual([ + 'liveresolver.batch.start', + 'liveresolver.batch.end', + 'liveresolver.batch.start', + 'liveresolver.batch.end', + ]); + // We still notify our subscribers expect(handler.mock.calls.length - lastCallCount).toBe(1); @@ -202,4 +227,16 @@ test('Updates can be batched', () => { store.batchLiveStateUpdates(() => {}); }); }).toThrow('Unexpected nested call to batchLiveStateUpdates.'); + + expect(getBatchLogEventNames()).toEqual([ + 'liveresolver.batch.start', + 'liveresolver.batch.end', + 'liveresolver.batch.start', + 'liveresolver.batch.end', + // Here we can see the nesting + 'liveresolver.batch.start', + 'liveresolver.batch.start', + 'liveresolver.batch.end', + 'liveresolver.batch.end', + ]); }); diff --git a/packages/relay-runtime/store/experimental-live-resolvers/LiveResolverStore.js b/packages/relay-runtime/store/experimental-live-resolvers/LiveResolverStore.js index 37ae14b044ac2..b5be4c31a71dc 100644 --- a/packages/relay-runtime/store/experimental-live-resolvers/LiveResolverStore.js +++ b/packages/relay-runtime/store/experimental-live-resolvers/LiveResolverStore.js @@ -212,7 +212,16 @@ class LiveResolverStore implements Store { * fluxStore.dispatch = wrapped; */ batchLiveStateUpdates(callback: () => void) { - this._resolverCache.batchLiveStateUpdates(callback); + if (this.__log != null) { + this.__log({name: 'liveresolver.batch.start'}); + } + try { + this._resolverCache.batchLiveStateUpdates(callback); + } finally { + if (this.__log != null) { + this.__log({name: 'liveresolver.batch.end'}); + } + } } check(