Commit c1ad81a
committed
Fail closed on unreadable SF segments and enumeration errors in recovery
SegmentRing.openExisting() previously skipped every per-file
MmapSegmentException and treated directory-enumeration failure
(findFirst < 0) as an empty store. The interior FSN-contiguity check
cannot expose a skipped segment at the lowest, highest, or sole
position -- the survivors stay mutually contiguous -- so recovery
silently retired the skipped segment's unacked frames (lowest/sole:
the engine seeds ackedFsn past them), minted duplicate FSNs
(highest: nextSeq resumes inside the skipped range), or -- for a
sole unreadable segment -- returned null, routing CursorSendEngine
onto the fresh-start path whose truncating openCleanRW
(O_CREAT|O_TRUNC / CREATE_ALWAYS) destroyed the only surviving
sf-initial.sfa.
Recovery now fails closed:
- an unreadable .sfa aborts recovery with MmapSegmentException
naming the file and remediation options (restore, or move the
file out to explicitly accept the loss);
- enumeration failure throws instead of returning null;
- quarantine-rename and empty-leftover-unlink failures throw
instead of warn-and-continue;
- CursorSendEngine's fresh-start path refuses to create
sf-initial.sfa over an existing file (defense in depth), checked
before the stale-watermark unlink to preserve forensic state.
openExisting() returning null now strictly means "no recoverable
data existed". BackgroundDrainer already quarantines a slot
(markFailed + FAILED) when engine construction throws, so corrupt
orphan slots are preserved for postmortem rather than drained over.
New SegmentRingEdgeRecoveryTest pins the contract with sole /
lowest / highest unreadable-segment tests, an engine-level
no-truncation test, and a POSIX enumeration-failure test; all five
reproduced the data loss before the fix.1 parent a375a78 commit c1ad81a
5 files changed
Lines changed: 524 additions & 54 deletions
File tree
- core/src
- main/java/io/questdb/client/cutlass/qwp/client/sf/cursor
- test/java/io/questdb/client/test/cutlass/qwp/client/sf/cursor
Lines changed: 24 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
316 | 316 | | |
317 | 317 | | |
318 | 318 | | |
319 | | - | |
320 | | - | |
321 | | - | |
322 | | - | |
323 | | - | |
324 | | - | |
325 | | - | |
326 | | - | |
327 | | - | |
| 319 | + | |
328 | 320 | | |
329 | 321 | | |
330 | 322 | | |
331 | 323 | | |
332 | 324 | | |
333 | 325 | | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
334 | 349 | | |
335 | 350 | | |
336 | 351 | | |
| |||
Lines changed: 77 additions & 30 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
146 | 146 | | |
147 | 147 | | |
148 | 148 | | |
149 | | - | |
150 | | - | |
151 | | - | |
152 | | - | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
153 | 154 | | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
158 | | - | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
159 | 167 | | |
160 | 168 | | |
161 | 169 | | |
| |||
164 | 172 | | |
165 | 173 | | |
166 | 174 | | |
167 | | - | |
168 | | - | |
169 | | - | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
170 | 185 | | |
171 | 186 | | |
172 | 187 | | |
| |||
185 | 200 | | |
186 | 201 | | |
187 | 202 | | |
188 | | - | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
189 | 227 | | |
190 | 228 | | |
191 | 229 | | |
| |||
213 | 251 | | |
214 | 252 | | |
215 | 253 | | |
216 | | - | |
217 | | - | |
218 | | - | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
219 | 266 | | |
220 | 267 | | |
221 | | - | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
222 | 282 | | |
223 | 283 | | |
224 | 284 | | |
225 | 285 | | |
226 | 286 | | |
227 | | - | |
228 | | - | |
229 | | - | |
230 | | - | |
231 | | - | |
232 | | - | |
233 | | - | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
238 | | - | |
239 | | - | |
240 | 287 | | |
241 | 288 | | |
242 | 289 | | |
| |||
Lines changed: 14 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
208 | 208 | | |
209 | 209 | | |
210 | 210 | | |
211 | | - | |
212 | | - | |
213 | | - | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
214 | 217 | | |
215 | 218 | | |
216 | | - | |
| 219 | + | |
217 | 220 | | |
218 | 221 | | |
219 | 222 | | |
| |||
223 | 226 | | |
224 | 227 | | |
225 | 228 | | |
226 | | - | |
227 | | - | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
228 | 232 | | |
229 | 233 | | |
230 | 234 | | |
| |||
331 | 335 | | |
332 | 336 | | |
333 | 337 | | |
334 | | - | |
335 | | - | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
336 | 341 | | |
337 | 342 | | |
338 | | - | |
| 343 | + | |
339 | 344 | | |
340 | 345 | | |
341 | 346 | | |
| |||
0 commit comments