Commit 778e10b
Fail loud on _close_impl re-snapshot cap exhaustion
The cycle-27 CC2 fix added a bounded re-snapshot loop to _close_impl
with a cap of 3, with the comment "Cap at 3 to fail loudly on a
pathological feedback loop rather than spin." The for-loop had no
``else:`` clause — when the cap exhausted (a racing _invalidate kept
creating fresh pending_drain tasks each iteration), the loop silently
broke with self._pending_drain still pointing at a live task,
defeating the comment's "fail loudly" promise: the residual task
was orphaned and surfaced as "Task was destroyed but it is pending"
at GC.
Add the ``else:`` clause: cancel the residual task (best-effort) so
no orphan diagnostic fires, null out self._pending_drain to keep the
post-condition consistent with the break path, and log a WARNING so
operators see the pathological feedback loop in production logs.
Hoist the cap into a named ``_RESNAPSHOT_CAP`` constant so future
tuning changes are obvious.
Pin the WARNING firing, the residual cancellation, and the absence
of "Task was destroyed" diagnostics under an adversarial __await__
that re-plants a fresh non-done pending each iteration. Without the
fail-loud branch the warning never fires.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>1 parent 820716e commit 778e10b
2 files changed
Lines changed: 115 additions & 1 deletion
File tree
- src/dqliteclient
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1227 | 1227 | | |
1228 | 1228 | | |
1229 | 1229 | | |
1230 | | - | |
| 1230 | + | |
| 1231 | + | |
1231 | 1232 | | |
1232 | 1233 | | |
1233 | 1234 | | |
| |||
1244 | 1245 | | |
1245 | 1246 | | |
1246 | 1247 | | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + | |
| 1263 | + | |
| 1264 | + | |
| 1265 | + | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
1247 | 1269 | | |
1248 | 1270 | | |
1249 | 1271 | | |
| |||
Lines changed: 92 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
96 | 188 | | |
97 | 189 | | |
98 | 190 | | |
| |||
0 commit comments