Skip to content

Commit 8e43ac1

Browse files
authored
fix: consolidate solana-relay Knex connection pools (#14309)
## Problem The solana-relay service had 8 route/middleware files each calling `initializeDiscoveryDb()` at module scope, creating 8 independent Knex connection pools. Each pool defaults to max 10 connections, so up to 80 connections could be open simultaneously, exhausting Postgres under load. This caused: `Knex: Timeout acquiring a connection. The pool is probably full.` ## Fix Extracted a single shared Knex singleton at `src/db.ts` and updated all 8 callers to import from it.
1 parent 12efd9f commit 8e43ac1

9 files changed

Lines changed: 20 additions & 31 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { initializeDiscoveryDb } from '@pedalboard/basekit'
2+
3+
import { config } from './config'
4+
5+
/**
6+
* Single shared Knex connection pool for the solana-relay service.
7+
*
8+
* Previously each route module called initializeDiscoveryDb() independently,
9+
* creating up to 9 separate pools (each with a default max of 10 connections)
10+
* and exhausting the Postgres connection limit under load.
11+
*/
12+
export const db = initializeDiscoveryDb(config.discoveryDbConnectionString)

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/middleware/signerRecovery.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,10 @@
1-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
21
import { Table, Users } from '@pedalboard/storage'
32
import { recoverPersonalSignature } from 'eth-sig-util'
43
import { NextFunction, Request, Response } from 'express'
54

6-
import { config } from '../config'
5+
import { db as discoveryDb } from '../db'
76
import { getCachedDiscoveryNodes } from '../redis'
87

9-
const discoveryDb = initializeDiscoveryDb(config.discoveryDbConnectionString)
10-
118
export const userSignerRecoveryMiddleware = async (
129
req: Request,
1310
res: Response,

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/launchpad/claim_fees.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { CpAmm, getUnClaimReward } from '@meteora-ag/cp-amm-sdk'
22
import { DynamicBondingCurveClient } from '@meteora-ag/dynamic-bonding-curve-sdk'
3-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
43
import {
54
TOKEN_PROGRAM_ID,
65
createTransferInstruction,
@@ -9,14 +8,12 @@ import {
98
import { Connection, PublicKey } from '@solana/web3.js'
109
import { Request, Response } from 'express'
1110

12-
import { config } from '../../config'
11+
import { db } from '../../db'
1312
import { logger } from '../../logger'
1413
import { getConnection } from '../../utils/connections'
1514

1615
import { AUDIO_MINT } from './constants'
1716

18-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
19-
2017
interface ClaimFeesRequestBody {
2118
tokenMint: string
2219
ownerWalletAddress: string

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/launchpad/claim_vested_coins.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
21
import {
32
createTransferCheckedInstruction,
43
getAssociatedTokenAddressSync
@@ -8,12 +7,10 @@ import BN from 'bn.js'
87
import { Request, Response } from 'express'
98

109
import { LockClient } from '@meteora-ag/met-lock-sdk'
11-
import { config } from '../../config'
10+
import { db } from '../../db'
1211
import { logger } from '../../logger'
1312
import { getConnection } from '../../utils/connections'
1413

15-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
16-
1714
interface ClaimVestedCoinsRequestBody {
1815
tokenMint: string
1916
ownerWalletAddress: string

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/launchpad/getKeypair.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
21
import type { SolKeypairs } from '@pedalboard/storage'
32
import { Keypair } from '@solana/web3.js'
43
import { Logger } from 'pino'
54

6-
import { config } from '../../config'
7-
8-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
5+
import { db } from '../../db'
96

107
export const getKeypair = async (logger: Logger): Promise<Keypair> => {
118
const [deleted] = await db<SolKeypairs>('sol_keypairs')

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/meteora/swap_coin.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
DynamicBondingCurveClient,
44
SwapMode
55
} from '@meteora-ag/dynamic-bonding-curve-sdk'
6-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
76
import {
87
SolMeteoraDammV2Pools,
98
SolMeteoraDbcPools,
@@ -14,15 +13,13 @@ import { Connection, PublicKey, Transaction } from '@solana/web3.js'
1413
import BN from 'bn.js'
1514
import { Request, Response } from 'express'
1615

17-
import { config } from '../../config'
16+
import { db } from '../../db'
1817
import { logger } from '../../logger'
1918
import { getConnection } from '../../utils/connections'
2019
import { AUDIO_MINT } from '../launchpad/constants'
2120

2221
import { SWAP_SLIPPAGE_BPS } from './constants'
2322

24-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
25-
2623
const SPL_TOKEN_PROGRAM_ID = new PublicKey(
2724
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'
2825
)

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/meteora/swap_coin_quote.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
DynamicBondingCurveClient,
44
SwapMode
55
} from '@meteora-ag/dynamic-bonding-curve-sdk'
6-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
76
import {
87
SolMeteoraDammV2Pools,
98
SolMeteoraDbcPools,
@@ -14,15 +13,13 @@ import { Connection, PublicKey } from '@solana/web3.js'
1413
import BN from 'bn.js'
1514
import { NextFunction, Request, Response } from 'express'
1615

17-
import { config } from '../../config'
16+
import { db } from '../../db'
1817
import { logger } from '../../logger'
1918
import { getConnection } from '../../utils/connections'
2019
import { AUDIO_MINT } from '../launchpad/constants'
2120

2221
import { SWAP_SLIPPAGE_BPS } from './constants'
2322

24-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
25-
2623
const getDBCPoolQuote = async (
2724
dbcPool: SolMeteoraDbcPools,
2825
connection: Connection,

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/relay/associateExternalWallet.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
21
import { AssociatedWallets, Table, WalletChain } from '@pedalboard/storage'
32
import { VersionedTransaction } from '@solana/web3.js'
43

5-
import { config } from '../../config'
4+
import { db } from '../../db'
65
import { logger } from '../../logger'
76

8-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
9-
107
export const associateExternalWallet = async (
118
transaction: VersionedTransaction,
129
userId: number

packages/discovery-provider/plugins/pedalboard/apps/solana-relay/src/routes/relay/getAllowedMints.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
import { initializeDiscoveryDb } from '@pedalboard/basekit'
21
import type { ArtistCoins } from '@pedalboard/storage'
32

43
import { config } from '../../config'
5-
6-
const db = initializeDiscoveryDb(config.discoveryDbConnectionString)
4+
import { db } from '../../db'
75

86
export const getAllowedMints = async (): Promise<string[]> => {
97
const rows = await db<ArtistCoins>('artist_coins').select('mint')

0 commit comments

Comments
 (0)