Skip to content

Commit d7e040e

Browse files
authored
execution: reduce parent executor retention in incremental callbacks (#4665)
1 parent d059437 commit d7e040e

File tree

3 files changed

+46
-29
lines changed

3 files changed

+46
-29
lines changed

src/execution/Executor.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -375,18 +375,24 @@ export class Executor<
375375
this.aborted = true;
376376
}
377377

378-
finishSharedExecution(): void {
379-
this.resolverAbortController?.abort();
378+
getFinishSharedExecution(): () => void {
379+
const resolverAbortController = this.resolverAbortController;
380380
const asyncWorkFinishedHook =
381381
this.validatedExecutionArgs.hooks?.asyncWorkFinished;
382382
if (asyncWorkFinishedHook === undefined) {
383-
return;
383+
return () => resolverAbortController?.abort();
384384
}
385-
runAsyncWorkFinishedHook(
386-
this.validatedExecutionArgs,
387-
this.sharedExecutionContext,
388-
asyncWorkFinishedHook,
389-
);
385+
386+
const validatedExecutionArgs = this.validatedExecutionArgs;
387+
const sharedExecutionContext = this.sharedExecutionContext;
388+
return () => {
389+
resolverAbortController?.abort();
390+
runAsyncWorkFinishedHook(
391+
validatedExecutionArgs,
392+
sharedExecutionContext,
393+
asyncWorkFinishedHook,
394+
);
395+
};
390396
}
391397

392398
/**
@@ -396,7 +402,7 @@ export class Executor<
396402
buildResponse(
397403
data: ObjMap<unknown> | null,
398404
): ExecutionResult | TAlternativeInitialResponse {
399-
this.finishSharedExecution();
405+
this.getFinishSharedExecution()();
400406
this.finish();
401407
const errors = this.collectedErrors.errors;
402408
const result = errors.length ? { errors, data } : { data };

src/execution/incremental/IncrementalExecutor.ts

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -310,14 +310,18 @@ export class IncrementalExecutor<
310310
this.streams = [];
311311
}
312312

313-
createSubExecutor(
313+
getCreateSubExecutor(): (
314314
deferUsageSet?: DeferUsageSet,
315-
): IncrementalExecutor<TExperimental> {
316-
return new IncrementalExecutor(
317-
this.validatedExecutionArgs,
318-
this.sharedExecutionContext,
319-
deferUsageSet,
320-
);
315+
) => IncrementalExecutor<TExperimental> {
316+
const validatedExecutionArgs = this.validatedExecutionArgs;
317+
const sharedExecutionContext = this.sharedExecutionContext;
318+
319+
return (deferUsageSet?: DeferUsageSet) =>
320+
new IncrementalExecutor<TExperimental>(
321+
validatedExecutionArgs,
322+
sharedExecutionContext,
323+
deferUsageSet,
324+
);
321325
}
322326

323327
override abort(reason?: unknown): void {
@@ -354,7 +358,7 @@ export class IncrementalExecutor<
354358
errors,
355359
work,
356360
this.validatedExecutionArgs.externalAbortSignal,
357-
() => this.finishSharedExecution(),
361+
this.getFinishSharedExecution(),
358362
) as TExperimental;
359363
}
360364

@@ -490,10 +494,11 @@ export class IncrementalExecutor<
490494
newGroupedFieldSets: Map<DeferUsageSet, GroupedFieldSet>,
491495
deliveryGroupMap: ReadonlyMap<DeferUsage, DeliveryGroup>,
492496
): void {
497+
const createSubExecutor = this.getCreateSubExecutor();
493498
for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) {
494499
const deliveryGroups = getDeliveryGroups(deferUsageSet, deliveryGroupMap);
495500

496-
const executor = this.createSubExecutor(deferUsageSet);
501+
const executor = createSubExecutor(deferUsageSet);
497502

498503
const executionGroup: ExecutionGroup = {
499504
groups: deliveryGroups,
@@ -721,7 +726,9 @@ export class IncrementalExecutor<
721726
itemType: GraphQLOutputType,
722727
isAsync: boolean | undefined,
723728
): Queue<StreamItemResult> {
729+
const createSubExecutor = this.getCreateSubExecutor();
724730
const { enableEarlyExecution } = this.validatedExecutionArgs;
731+
const sharedExecutionContext = this.sharedExecutionContext;
725732
const queue = new Queue<StreamItemResult>(
726733
async ({ push, stop, onStop, started }) => {
727734
const abortStreamItems = new Set<(reason?: unknown) => void>();
@@ -735,13 +742,13 @@ export class IncrementalExecutor<
735742
abortStreamItem(reason);
736743
}
737744
if (isAsync) {
738-
this.sharedExecutionContext.asyncWorkTracker.add(
745+
sharedExecutionContext.asyncWorkTracker.add(
739746
returnIteratorCatchingErrors(
740747
iterator as AsyncIterator<unknown>,
741748
),
742749
);
743750
} else {
744-
this.sharedExecutionContext.asyncWorkTracker.addValues(
751+
sharedExecutionContext.asyncWorkTracker.addValues(
745752
collectIteratorPromises(iterator as Iterator<unknown>),
746753
);
747754
}
@@ -785,7 +792,7 @@ export class IncrementalExecutor<
785792

786793
const itemPath = addPath(streamPath, index, undefined);
787794

788-
const executor = this.createSubExecutor();
795+
const executor = createSubExecutor();
789796

790797
let streamItemResult = executor.completeStreamItem(
791798
itemPath,

src/execution/legacyIncremental/BranchingIncrementalExecutor.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,18 @@ export interface FormattedLegacyIncrementalStreamResult<
174174
}
175175
/** @internal */
176176
export class BranchingIncrementalExecutor extends IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
177-
override createSubExecutor(
177+
override getCreateSubExecutor(): (
178178
deferUsageSet?: DeferUsageSet,
179-
): IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
180-
return new BranchingIncrementalExecutor(
181-
this.validatedExecutionArgs,
182-
this.sharedExecutionContext,
183-
deferUsageSet,
184-
);
179+
) => BranchingIncrementalExecutor {
180+
const validatedExecutionArgs = this.validatedExecutionArgs;
181+
const sharedExecutionContext = this.sharedExecutionContext;
182+
183+
return (deferUsageSet?: DeferUsageSet) =>
184+
new BranchingIncrementalExecutor(
185+
validatedExecutionArgs,
186+
sharedExecutionContext,
187+
deferUsageSet,
188+
);
185189
}
186190

187191
override buildResponse(
@@ -202,7 +206,7 @@ export class BranchingIncrementalExecutor extends IncrementalExecutor<LegacyExpe
202206
errors,
203207
work,
204208
this.validatedExecutionArgs.externalAbortSignal,
205-
() => this.finishSharedExecution(),
209+
this.getFinishSharedExecution(),
206210
);
207211
}
208212

0 commit comments

Comments
 (0)