Summary
Under a Perry-compiled binary on Linux x86_64, connect() to a local MySQL hangs until connectTimeoutMs and fails with connection timeout after 10000ms. strace shows the TCP socket reaches connect() = EINPROGRESS but the 'connect' event never fires, so the handshake never starts.
The same code works in every other combination:
- Node.js on the same box → connects.
- Perry-native on macOS (arm64) → connects (our full service e2e passes natively on macOS).
- A minimal raw
net.createConnection compiled by the same Perry on the same Linux box → connects (even with 'data'/'error' listeners attached and wrapped in top-level await).
So raw net works under Perry-native-Linux, but the driver's connect() path does not — the driver's sock.on('connect', …) callback (connection.ts ~L418, after openSocket at L360) is never invoked.
Repro
net-test.ts (raw stdlib) → CONNECTED natively on Linux:
import * as net from 'net';
const s = net.createConnection(3306, '127.0.0.1');
s.on('connect', () => { console.log('CONNECTED'); s.end(); process.exit(0); });
s.on('data', () => {}); // even with a data listener
s.on('error', (e) => { console.log('ERR', String(e)); process.exit(1); });
setTimeout(() => { console.log('TIMEOUT'); process.exit(2); }, 5000);
drv-test.ts (this driver) → TIMEOUT natively on Linux (CONNECTED under Node):
import { connect } from '@perryts/mysql';
const c = await connect('mysql://optiq:***@127.0.0.1:3306/optiq');
console.log('CONNECTED', JSON.stringify((await c.query('SELECT 1 AS ok')).rows[0]));
await c.close();
Both compiled with perry compile <file>.ts -o <bin> and run on the same host.
strace (the driver binary)
socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 9
connect(9, {sa_family=AF_INET, sin_port=htons(3306), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
... no further activity on fd 9 ...
write(2, "Error: connection timeout after 10000ms", 39)
The non-blocking connect() completion (epoll EPOLLOUT) is apparently never observed for the driver's socket, though it is for a bare net.createConnection.
Environment
- perry 0.5.1125 and 0.5.1129 — both reproduce.
@perryts/mysql github HEAD; MySQL 8.4.9 (user is mysql_native_password, require_secure_transport=OFF, bound 127.0.0.1); Ubuntu 26.04 x86_64; clang 21.
- The
mysql CLI and a raw TCP connect to 127.0.0.1:3306 both succeed instantly; MySQL's general log shows no connection attempt from the driver binary (it never completes the handshake).
Impact
Blocks any Perry-native Linux service using the driver. Our optiq-engine (fastify + this driver) compiles and runs end-to-end as a native binary on macOS and under Node on Linux, but the native Linux binary can't reach MySQL because of this. Likely a Perry Linux net interaction rather than a driver-logic bug (raw net works), but filing here since it's observed through the driver — please reclassify to perry if that's the right home.
Summary
Under a Perry-compiled binary on Linux x86_64,
connect()to a local MySQL hangs untilconnectTimeoutMsand fails withconnection timeout after 10000ms.straceshows the TCP socket reachesconnect() = EINPROGRESSbut the'connect'event never fires, so the handshake never starts.The same code works in every other combination:
net.createConnectioncompiled by the same Perry on the same Linux box → connects (even with'data'/'error'listeners attached and wrapped in top-levelawait).So raw
networks under Perry-native-Linux, but the driver'sconnect()path does not — the driver'ssock.on('connect', …)callback (connection.ts ~L418, afteropenSocketat L360) is never invoked.Repro
net-test.ts(raw stdlib) → CONNECTED natively on Linux:drv-test.ts(this driver) → TIMEOUT natively on Linux (CONNECTED under Node):Both compiled with
perry compile <file>.ts -o <bin>and run on the same host.strace (the driver binary)
The non-blocking
connect()completion (epollEPOLLOUT) is apparently never observed for the driver's socket, though it is for a barenet.createConnection.Environment
@perryts/mysqlgithub HEAD; MySQL 8.4.9 (user ismysql_native_password,require_secure_transport=OFF, bound127.0.0.1); Ubuntu 26.04 x86_64; clang 21.mysqlCLI and a raw TCP connect to127.0.0.1:3306both succeed instantly; MySQL's general log shows no connection attempt from the driver binary (it never completes the handshake).Impact
Blocks any Perry-native Linux service using the driver. Our
optiq-engine(fastify + this driver) compiles and runs end-to-end as a native binary on macOS and under Node on Linux, but the native Linux binary can't reach MySQL because of this. Likely a Perry Linuxnetinteraction rather than a driver-logic bug (rawnetworks), but filing here since it's observed through the driver — please reclassify toperryif that's the right home.