-
Notifications
You must be signed in to change notification settings - Fork 98
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
BrokenPipe: Broken pipe (os error 32) not handled in reconnect logic #436
Comments
I am getting this one too. Is there any update on it? |
Hey, would be helpfully to check what version is being used and if it happens in the newest. |
Sure thing, I'm using 1.17.0, but I now see there's 1.17.2, I'm switching now, but I won't be able to recreate the problem for a few hours. My deno version is 1.40.3.
|
Same here, using 0.19.2 |
Latest versions of deno and postgres as of writing this comment. Issue is still there. It happens with transactions that take too long. |
I found the actual reason behind it. Whenever you create a transaction and then leave that transaction idle longer than idle_in_transaction_session_timeout, Posgresql server will close the session. And that causes the above error. |
I think that's not the only case it can happen; for example, we've been hitting this on Google Cloud SQL where the default value for I believe the fundamental issue here is closer to #355 (comment) ; certain types of errors are just not correctly recovered from in cases like We're written a client wrapper around database access, where every call to things like:
— has a class DbClient {
...
private pool: Pool | null = null;
public getPool = async (): Promise<PoolClient> => {
if (!this.pool) {
this.pool = new Pool(this.connectionString, this.connectionPoolSize);
}
return await this.pool.connect()
.catch(this.handleQueryError);
};
public closePool = async (): Promise<void> => {
if (!this.pool) {
throw new Error("Connection pool has not been created");
}
await this.pool.end();
this.pool = null;
};
private handleQueryError = async (err: Error): Promise<never> => {
const isConnectionSlotError = err instanceof PostgresError &&
err.message.includes("remaining connection slots are reserved");
const isPotentialConnectionError = err instanceof Deno.errors.BrokenPipe ||
err instanceof Deno.errors.ConnectionRefused ||
err instanceof Deno.errors.ConnectionReset ||
err instanceof Deno.errors.ConnectionAborted ||
err instanceof ConnectionError ||
isConnectionSlotError;
if (isPotentialConnectionError) {
await this.closePool();
}
throw err;
};
... etc etc ...
} |
I'm currently getting a crash sometimes when connecting to a remote database.
Seems like there's a check for connection errors that will reconnect, but not broken pipe errors.
The text was updated successfully, but these errors were encountered: