From 8eaefb8022b52deb3b0e0caedb06be31f88249b2 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 17 Apr 2025 10:33:05 +0200 Subject: [PATCH 1/4] Hack to prevent busy wait for 404/429 error --- db-service/lib/common/DatabaseService.js | 5 +++++ hana/lib/HANAService.js | 9 +-------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/db-service/lib/common/DatabaseService.js b/db-service/lib/common/DatabaseService.js index 099d1ea23..e88e504ef 100644 --- a/db-service/lib/common/DatabaseService.js +++ b/db-service/lib/common/DatabaseService.js @@ -61,6 +61,11 @@ class DatabaseService extends cds.Service { // Setting this.pool as used in this.acquire() and this.release() this.pool = this.pools[tenant] ??= new ConnectionPool(this.pools._factory, tenant) + .on('factoryCreateError', e => { + if (cds.requires.multitenancy) if (e.status == 404 || e.status == 429) { + this.pool._waitingClientsQueue?.dequeue?.()?.reject(e) + } + }) // Acquire a pooled connection this.dbc = await this.acquire() diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index 1645c49cb..542ac7ad2 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -68,14 +68,7 @@ class HANAService extends SQLService { HANAVERSION = dbc.server.major return dbc } catch (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 + if (err.code !== 10) throw err await require('@sap/cds-mtxs/lib').xt.serviceManager.get(tenant, { disableCache: true }) return this.create(tenant) } From 976335e07a20063248cdd6e92f98263e0fe050d8 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 17 Apr 2025 10:33:30 +0200 Subject: [PATCH 2/4] Simpler --- db-service/lib/common/DatabaseService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db-service/lib/common/DatabaseService.js b/db-service/lib/common/DatabaseService.js index e88e504ef..1df462b96 100644 --- a/db-service/lib/common/DatabaseService.js +++ b/db-service/lib/common/DatabaseService.js @@ -62,7 +62,7 @@ class DatabaseService extends cds.Service { // Setting this.pool as used in this.acquire() and this.release() this.pool = this.pools[tenant] ??= new ConnectionPool(this.pools._factory, tenant) .on('factoryCreateError', e => { - if (cds.requires.multitenancy) if (e.status == 404 || e.status == 429) { + if (isMultitenant) if (e.status == 404 || e.status == 429) { this.pool._waitingClientsQueue?.dequeue?.()?.reject(e) } }) From 9772d639d9014f11ad5e7293ccc88a639519bc56 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 17 Apr 2025 10:35:26 +0200 Subject: [PATCH 3/4] Simpler --- db-service/lib/common/DatabaseService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db-service/lib/common/DatabaseService.js b/db-service/lib/common/DatabaseService.js index 1df462b96..66abbad44 100644 --- a/db-service/lib/common/DatabaseService.js +++ b/db-service/lib/common/DatabaseService.js @@ -62,7 +62,7 @@ class DatabaseService extends cds.Service { // Setting this.pool as used in this.acquire() and this.release() this.pool = this.pools[tenant] ??= new ConnectionPool(this.pools._factory, tenant) .on('factoryCreateError', e => { - if (isMultitenant) if (e.status == 404 || e.status == 429) { + if (isMultitenant && e.status === 404) { this.pool._waitingClientsQueue?.dequeue?.()?.reject(e) } }) From fbdc93d16602c13417dcd7e08f2fd8a52ead296e Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 17 Apr 2025 10:39:39 +0200 Subject: [PATCH 4/4] Fix --- hana/lib/HANAService.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hana/lib/HANAService.js b/hana/lib/HANAService.js index 542ac7ad2..9633ebce5 100644 --- a/hana/lib/HANAService.js +++ b/hana/lib/HANAService.js @@ -68,7 +68,7 @@ class HANAService extends SQLService { HANAVERSION = dbc.server.major return dbc } catch (err) { - if (err.code !== 10) throw err + if (!isMultitenant && err.code !== 10) throw err await require('@sap/cds-mtxs/lib').xt.serviceManager.get(tenant, { disableCache: true }) return this.create(tenant) }