From e87880079d6740c859c30ad1e06582969ee59832 Mon Sep 17 00:00:00 2001 From: Kamil Kisiela Date: Mon, 13 Feb 2023 17:08:57 +0100 Subject: [PATCH] Set higher timeout when calling external composition service (#1362) --- packages/services/schema/src/cache.ts | 1 + packages/services/schema/src/orchestrators.ts | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/services/schema/src/cache.ts b/packages/services/schema/src/cache.ts index 50dbef817..6d1db084a 100644 --- a/packages/services/schema/src/cache.ts +++ b/packages/services/schema/src/cache.ts @@ -73,6 +73,7 @@ export function createCache(options: { } return { + timeoutMs, reuse(groupKey: string, factory: (input: I) => Promise): (input: I) => Promise { async function reuseFactory(input: I, attempt = 0): Promise { const id = `${prefix}:${groupKey}:${createChecksum(input)}`; diff --git a/packages/services/schema/src/orchestrators.ts b/packages/services/schema/src/orchestrators.ts index 33ceda90e..db78727f3 100644 --- a/packages/services/schema/src/orchestrators.ts +++ b/packages/services/schema/src/orchestrators.ts @@ -212,6 +212,7 @@ async function callExternalServiceViaBroker( }, payload: BrokerPayload, logger: FastifyLoggerInstance, + timeoutMs: number, ) { return callExternalService( { @@ -224,12 +225,14 @@ async function callExternalServiceViaBroker( body: JSON.stringify(payload), }, logger, + timeoutMs, ); } async function callExternalService( input: { url: string; headers: Record; body: string }, logger: FastifyLoggerInstance, + timeoutMs: number, ) { try { const response = await got(input.url, { @@ -243,7 +246,7 @@ async function callExternalService( backoffLimit: 500, }, timeout: { - request: 10_000, + request: timeoutMs, }, }); @@ -251,7 +254,7 @@ async function callExternalService( } catch (error) { if (error instanceof RequestError) { if (error.response) { - const message = error.response.body ? error.response.body : error.response.statusMessage; // await res.text().catch(_ => Promise.resolve(res.statusText)); + const message = error.response.body ? error.response.body : error.response.statusMessage; // If the response is a string starting with ERR_ it's a special error returned by the composition service. // We don't want to throw an error in this case, but instead return a failure result. @@ -301,6 +304,7 @@ const createFederation: ( logger: FastifyLoggerInstance, decrypt: (value: string) => string, ) => Orchestrator = (cache, logger, decrypt) => { + const timeoutMs = Math.min(cache.timeoutMs, 25_000); const compose = cache.reuse< { schemas: ValidationInput | SupergraphInput; @@ -349,8 +353,9 @@ const createFederation: ( ...request, }, logger, + timeoutMs, ) - : callExternalService(request, logger)), + : callExternalService(request, logger, timeoutMs)), ); if (!parseResult.success) {