Repository navigation
Commit c5da613
fix(database): drop poisoned pooled connection on any lost-connection error (DAT-1904)
A pooled DB connection is checked out per operation from a worker-shared,
per-host pool. The reconnect wrapper in PDOStatement::__call() only self-healed
a lost connection for execute() outside a transaction. Every other
lost-connection error (fetch, fetchAll, closeCursor, or execute inside a
transaction) was rethrown while the underlying connection was left untouched and
reclaimed to the pool as-is.
A connection lost mid-result is wire-desynced: a partial or stale result frame
can remain buffered on the socket. Returning that connection to the pool poisons
it. The next coroutine to pop it runs its own query and reads the leftover frame
instead, returning a different row (cross-document, and cross-tenant on shared
shards) and corrupting writes (the "no active transaction" class).
The fetch phase must reconnect because it cannot be retried in place: re-running
fetch on a fresh statement would read no rows, so the only safe recovery is to
discard the desynced socket and let the caller replay. This change extends the
recovery so that on any detected lost-connection error outside the
execute-outside-transaction fast path, PDOStatement::__call() calls
PDO::reconnect() to drop the socket before rethrowing. The existing transparent
retry is unchanged. Non-connection errors still rethrow untouched, so a healthy
connection is never thrashed on ordinary query errors. Callers and
Adapter::withTransaction still see the rethrow and roll back or replay on the now
fresh connection.
Adds a regression test proving reconnect() is invoked before the exception
propagates for a fetch-phase lost connection and for execute inside a
transaction, and is not invoked for a non-connection error.
Refs: #895, #896,
appwrite-labs/cloud#4827 (downstream containment),
utopia-php/pools#33 (pool-layer defense in depth)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>1 parent d5ebecc commit c5da613
2 files changed
Lines changed: 65 additions & 20 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
13 | | - | |
14 | | - | |
15 | | - | |
16 | | - | |
17 | | - | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
18 | 26 | | |
19 | 27 | | |
20 | 28 | | |
| |||
108 | 116 | | |
109 | 117 | | |
110 | 118 | | |
111 | | - | |
112 | | - | |
113 | | - | |
114 | | - | |
115 | | - | |
| 119 | + | |
116 | 120 | | |
117 | 121 | | |
118 | 122 | | |
119 | | - | |
120 | | - | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
121 | 126 | | |
122 | | - | |
| 127 | + | |
123 | 128 | | |
124 | | - | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
125 | 141 | | |
126 | 142 | | |
127 | 143 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
69 | 69 | | |
70 | 70 | | |
71 | 71 | | |
72 | | - | |
| 72 | + | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
76 | 78 | | |
77 | 79 | | |
78 | 80 | | |
| |||
133 | 135 | | |
134 | 136 | | |
135 | 137 | | |
136 | | - | |
| 138 | + | |
137 | 139 | | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
138 | 144 | | |
139 | | - | |
| 145 | + | |
| 146 | + | |
140 | 147 | | |
141 | 148 | | |
142 | 149 | | |
143 | 150 | | |
144 | | - | |
| 151 | + | |
145 | 152 | | |
146 | 153 | | |
147 | 154 | | |
148 | 155 | | |
149 | 156 | | |
150 | 157 | | |
151 | 158 | | |
152 | | - | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
153 | 182 | | |
154 | 183 | | |
155 | 184 | | |
| |||
0 commit comments