diff --git a/packages/core/src/server.ts b/packages/core/src/server.ts index e277606948..1bfda5b6f0 100644 --- a/packages/core/src/server.ts +++ b/packages/core/src/server.ts @@ -53,7 +53,7 @@ export interface SessionData { workspace: WorkspaceIds socialStringsToUsers: Map - asyncRequests?: (() => Promise)[] + asyncRequests?: ((ctx: MeasureContext) => Promise)[] } /** diff --git a/server/middleware/src/triggers.ts b/server/middleware/src/triggers.ts index b2044c3524..357cf2ea18 100644 --- a/server/middleware/src/triggers.ts +++ b/server/middleware/src/triggers.ts @@ -179,7 +179,7 @@ export class TriggersMiddleware extends BaseMiddleware implements Middleware { } else { ctx.contextData.asyncRequests = [ ...(ctx.contextData.asyncRequests ?? []), - async () => { + async (ctx) => { // In case of async context, we execute both async and sync triggers as sync await this.processAsyncTriggers(ctx, triggerControl, findAll, txes, triggers) } diff --git a/server/postgres/src/storage.ts b/server/postgres/src/storage.ts index 9e0f3c006c..c200bb4d5e 100644 --- a/server/postgres/src/storage.ts +++ b/server/postgres/src/storage.ts @@ -139,12 +139,12 @@ class ConnectionInfo { readonly managed: boolean ) {} - async withReserve (reserveOrPool: boolean, action: (reservedClient: DBClient) => Promise): Promise { + async withReserve (action: (reservedClient: DBClient) => Promise, forced: boolean = false): Promise { let reserved: DBClient | undefined // Check if we have at least one available connection and reserve one more if required. if (this.available.length === 0) { - if (reserveOrPool) { + if (this.managed || forced) { reserved = await this.client.reserve() } } else { @@ -164,24 +164,12 @@ class ConnectionInfo { } catch (err: any) { console.error('failed to release', err) } - } else { - // after use we put into available - if (reserved !== undefined) { + } else if (reserved !== undefined) { + if (this.available.length > 0) { + reserved?.release() + } else { this.available.push(reserved) } - - if (this.available.length > 1) { - // We need to release any >= 1 - const toRelease = this.available.splice(1, this.available.length - 1) - - for (const r of toRelease) { - try { - r.release() - } catch (err: any) { - console.error('failed to relase', err) - } - } - } } } } @@ -212,7 +200,7 @@ class ConnectionMgr { try { while (true) { - const retry: boolean | Error = await connection.withReserve(true, async (client) => { + const retry: boolean | Error = await connection.withReserve(async (client) => { tries++ try { await client.execute('BEGIN;') @@ -231,7 +219,7 @@ class ConnectionMgr { return false } } - }) + }, true) if (retry === true) { break } @@ -261,7 +249,7 @@ class ConnectionMgr { try { while (true) { - const retry: false | { result: any } | Error = await connection.withReserve(false, async (client) => { + const retry: false | { result: any } | Error = await connection.withReserve(async (client) => { tries++ try { return { result: await fn(client) } diff --git a/server/postgres/src/utils.ts b/server/postgres/src/utils.ts index fb05e31464..6284b01e73 100644 --- a/server/postgres/src/utils.ts +++ b/server/postgres/src/utils.ts @@ -318,9 +318,8 @@ export function getDBClient ( database, max: 10, min: 2, - connect_timeout: 10, - idle_timeout: 30, - max_lifetime: 300, + connect_timeout: 30, + idle_timeout: 0, transform: { undefined: null }, diff --git a/server/server/src/client.ts b/server/server/src/client.ts index efdd27b22b..ccdd5416b8 100644 --- a/server/server/src/client.ts +++ b/server/server/src/client.ts @@ -251,8 +251,8 @@ export class ClientSession implements Session { onEnd = useReserveContext ? ctx.pipeline.context.adapterManager?.reserveContext?.(cid) : undefined const handleAyncs = async (): Promise => { try { - for (const r of (ctx.ctx.contextData as SessionData).asyncRequests ?? []) { - await r() + for (const r of asyncs) { + await r(ctx.ctx) } } finally { onEnd?.()