From e95fd176094ac8b1d95b3bc68538057bf28aadf1 Mon Sep 17 00:00:00 2001 From: Bob den Os <108393871+BobdenOs@users.noreply.github.com> Date: Wed, 20 Mar 2024 15:50:01 +0100 Subject: [PATCH] fix(hana): reduce service manager calls for failing tenants (#533) --- hana/lib/HANAService.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index 98a86e417..03c426a98 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -38,11 +38,12 @@ class HANAService extends SQLService { const driver = drivers[this.options.driver || this.options.credentials?.driver]?.driver || drivers.default.driver const isMultitenant = 'multiTenant' in this.options ? this.options.multiTenant : cds.env.requires.multitenancy const service = this + const acquireTimeoutMillis = this.options.pool?.acquireTimeoutMillis || cds.env.profiles.includes('production') ? 1000 : 10000 return { options: { min: 0, max: 10, - acquireTimeoutMillis: cds.env.profiles.includes('production') ? 1000 : 10000, + acquireTimeoutMillis, idleTimeoutMillis: 60000, evictionRunIntervalMillis: 100000, numTestsPerEvictionRun: Math.ceil((this.options.pool?.max || 10) - (this.options.pool?.min || 0) / 3), @@ -60,7 +61,14 @@ class HANAService extends SQLService { HANAVERSION = dbc.server.major return dbc } catch (err) { - if (!isMultitenant || err.code !== 10) throw err + if (isMultitenant) { + // REVISIT: throw the error and break retry loop + // Stop trying when the tenant does not exist or is rate limited + if (err.status == 404 || err.status == 429) + return new Promise(function (_, reject) { + setTimeout(() => reject(err), acquireTimeoutMillis) + }) + } else if (err.code !== 10) throw err await require('@sap/cds-mtxs/lib').xt.serviceManager.get(tenant, { disableCache: true }) return this.create(tenant) }