[2.0] Catch PDOException when MySQL server has gone away during SET SESSION wait_timeout reset#200
Merged
taylorotwell merged 1 commit intolaravel:2.0from Mar 9, 2026
Conversation
…SSION wait_timeout
dd2527a to
199e839
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
When using explicit read/write connections (e.g.
User::on('mysql::read'))on Aurora or any MySQL server that aggressively drops idle connections,
the
SET SESSION wait_timeoutcall inmanageDatabaseSessions()failswith:
The user request itself completes successfully and receives the correct response.
However, the unhandled exception thrown in
invokeRequestHandledCallbackspropagatesup to
handleWorkerErrorwhich destabilizes the long-running Octane worker process,potentially causing subsequent requests on the same worker to fail.
This happens because:
manageDatabaseSessionsruns POST-response viaonRequestHandledgetRawPdo()->exec()bypasses Laravel's reconnect logic entirelySET SESSIONcallInconsistency
The
disconnect()call above already has a try/catch with the comment"Likely already disconnected..." — but
SET SESSIONhas no such protectiondespite the same failure mode.
Fix
Wrap
SET SESSIONexecution in a try/catch, consistent with the existingdisconnect()handling above it.Tests
Added 4 tests covering:
Production Stack Trace
Captured from Sentry on production (AWS Aurora, writer + reader,
triggered by explicit
mysql::readconnection usage):The exception is thrown inside
invokeRequestHandledCallbackswhich executesafter
$responded = trueinWorker::handle— meaning the HTTP response has alreadybeen flushed to the client. However, the unhandled exception propagates up to
handleWorkerErrorwhich can destabilize the long-running Octane worker process,potentially causing subsequent requests on the same worker to fail.