Commit ded2edc
Close store-and-forward recovery and drainer gaps
Four fixes across the recovery, orphan-scan and drainer paths, all on
inputs a real cluster can produce.
Bound the oversized-batch throw. flushPendingRowsSplit's all-or-nothing
pre-flight throws when a single table's frame exceeds the server cap, and
keeps the batch buffered so a rejected flush does not silently drop the
caller's rows -- correct, and better than the old behaviour that discarded
every table's rows while reporting failure. But a batch that can never fit
the reachable cap then re-rejects on every flush(), growing unbounded if
the caller keeps appending. The batch cannot drain until a larger-cap node
returns or the sender is closed, so the message now says so, rather than
reading as a transient a caller would retry into an ever-larger batch.
Stop OrphanScanner counting the legacy-reader guards as data.
CursorSendEngine plants .qwp-v2-guard-a/b.sfa in every disk-mode slot,
before recovery or any segment, and its failure path does not unlink them.
A construction that then throws (ENOSPC on the initial segment) leaves a
slot holding only guards, which the scanner reported as an orphan with
unacked data: a drainer adopted it, failed its own build under the same
disk pressure, and dropped a permanent .failed sentinel plus an ERROR on a
slot that never held a byte. Exclude the guards by name (SegmentRing's own
predicate, now shared) -- a real segment beside them still counts.
Saturate the drainer's capability-gap budget. reconnect_max_duration_millis
is validated only as > 0, so a large value (Long.MAX_VALUE is the natural
"never give up") wrapped the raw millis*1_000_000 multiply negative, and
the OR-gated elapsed check then quarantined the slot on the FIRST
capability-gap sweep, skipping the whole 16-sweep settle budget -- asking
for more tolerance bought none. Convert with TimeUnit.toNanos, which
clamps at Long.MAX_VALUE. The keepalive-interval and poison-escalation
windows in CursorWebSocketSendLoop's constructor had the identical raw
multiply -- the poison one is the exact twin of the cap-gap dwell the PR
already hardened -- and a negative there escalates a transient to a
producer-fatal terminal on strike count alone; convert both the same way.
Make the legacy-reader barrier durable and stop re-truncating it. Its
content never changes, yet it was rewritten via openCleanRW (truncate) on
every engine open and never synced, so every open re-opened a window in
which a host crash leaves a zero-filled guard beside already-durable v2
segments -- and a rolled-back v1 reader then skips the guard (bad magic)
and the segments (bad version) alike, reads the slot empty, and truncates
the unacked log. Verify an existing guard and rewrite only a missing or
damaged one, and msync the guard on creation (33 bytes, once per slot
lifetime) so it is durable before the data it protects. The guard frame is
not byte-reproducible, so the test discriminates kept from rewritten by
byte-identity across a reopen and asserts only semantic validity after a
repair.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent b279eec commit ded2edc
8 files changed
Lines changed: 191 additions & 12 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: 14 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3702 | 3702 | | |
3703 | 3703 | | |
3704 | 3704 | | |
| 3705 | + | |
| 3706 | + | |
| 3707 | + | |
| 3708 | + | |
| 3709 | + | |
| 3710 | + | |
| 3711 | + | |
| 3712 | + | |
| 3713 | + | |
| 3714 | + | |
3705 | 3715 | | |
3706 | 3716 | | |
3707 | 3717 | | |
3708 | | - | |
| 3718 | + | |
| 3719 | + | |
| 3720 | + | |
| 3721 | + | |
3709 | 3722 | | |
3710 | 3723 | | |
3711 | 3724 | | |
| |||
Lines changed: 12 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
36 | 36 | | |
37 | 37 | | |
38 | 38 | | |
| 39 | + | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
| |||
287 | 288 | | |
288 | 289 | | |
289 | 290 | | |
290 | | - | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
291 | 302 | | |
292 | 303 | | |
293 | 304 | | |
| |||
Lines changed: 10 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
839 | 839 | | |
840 | 840 | | |
841 | 841 | | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
842 | 850 | | |
843 | | - | |
| 851 | + | |
844 | 852 | | |
845 | 853 | | |
846 | 854 | | |
847 | | - | |
| 855 | + | |
848 | 856 | | |
849 | 857 | | |
850 | 858 | | |
| |||
Lines changed: 9 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
194 | 194 | | |
195 | 195 | | |
196 | 196 | | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
197 | 206 | | |
198 | 207 | | |
199 | 208 | | |
| |||
Lines changed: 11 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
327 | 327 | | |
328 | 328 | | |
329 | 329 | | |
330 | | - | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
331 | 341 | | |
332 | 342 | | |
333 | 343 | | |
| |||
Lines changed: 50 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
349 | 349 | | |
350 | 350 | | |
351 | 351 | | |
352 | | - | |
353 | | - | |
354 | | - | |
355 | | - | |
356 | | - | |
357 | | - | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
358 | 393 | | |
359 | 394 | | |
360 | 395 | | |
| |||
945 | 980 | | |
946 | 981 | | |
947 | 982 | | |
948 | | - | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
949 | 992 | | |
950 | 993 | | |
951 | 994 | | |
| |||
Lines changed: 57 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
47 | 47 | | |
48 | 48 | | |
49 | 49 | | |
| 50 | + | |
50 | 51 | | |
51 | 52 | | |
52 | 53 | | |
| |||
298 | 299 | | |
299 | 300 | | |
300 | 301 | | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
301 | 358 | | |
302 | 359 | | |
303 | 360 | | |
| |||
Lines changed: 28 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 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 | + | |
92 | 120 | | |
93 | 121 | | |
94 | 122 | | |
| |||
0 commit comments