Repository navigation
test: date the #359 and #433 cost arms, and hold maintenance_crash's index to a scan (#1341) - #1511
Conversation
…index to a scan (#1341) Three gaps left open in #1493, #1502 and #1503. native_fetch_cache's #359 ratio and native_fetch_bigcap's two #433 ratios were never in the ledger: the mutations tried against them did not reproduce their defects. These do, each the pre-fix behaviour restored: #359: no column released over the cap; the whole entry dropped once the entry is over it. Five columns 1956 ms against four at 68 (29x, bound 12x); a second reading 2107 against 138. #433: each entry reads its row group whole, and a group over the cap is dropped after every fetch. Narrow projection 10788 -> 58074 buffers for one row against ten; medium 10828 -> 58699. Both arms go red, and the twins redden the same names. No suite change. maintenance_crash compared the table after a crash with before it, both through the index, so an index already wrong before the crash agreed with itself: with pgcolumnar_index_fetch_tuple finding no row, the suite as on main passes 25/25. Each recovery now also checks that the index reads the rows a scan reads, eight arms in the shell and in the twin. Under the same mutant all eight go red, by the same names in both. Ledger: 4388 -> 4396 rows, never 3058 -> 3055, dated 1330 -> 1341. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jdatcmd
left a comment
There was a problem hiding this comment.
Approve, at b2368c9.
My own mutant, the one that left maintenance_crash green on #1502: the deferred decode (pgcolumnar_slot_getsomeattrs) returns column 1 as NULL on every 7th row number, so the index's reading is wrong both before and after the crash. PG17:
- shell: all 8 new arms red, "after a crash with <uncommitted|committed>, the index reads the rows the scan reads" (
5400/…hash mismatches), 25 + 8 = 33; - pytest: red on the first,
compact_rewrite uncommitted, with the rest masked by first-red.
So the before/after design now has an independent reference: a fault present on both sides no longer cancels out. That closes the gap I raised.
On #359 and #433: restoring each fix's own pre-fix behaviour as the mutant is the right method. A mutant that isn't the defect proves nothing about the arm written for it. Your correction of the "the cliff hits even one projected column" note is noted.
The ledger: reads 4388 → 4396 / 3058 → 3055 / 1330 → 1341, consistent with 8 new dated rows and 3 newly dated.
|
@OffgridwithJD, merging #1511 now: approved at b2368c9, 15/15 green, CLEAN. |
@jdatcmd This closes three gaps I left open in #1493, #1503 and #1502.
#359 and #433: the arms were fine, my mutants weren't
native_fetch_cache's #359 ratio andnative_fetch_bigcap's two #433 ratios went into the ledger as never, because the mutations I tried didn't move them. Those mutations weren't the defects. Restoring each pre-fix behaviour as its own mutant (from a917034 and 08c4e38) reddens the arms as they stand. The suites don't change.The twins redden the same names. In #1493 I wrote that "the cliff hits even one projected column". That was my
dropallmutant, not #359's code.maintenance_crash: the index is now held to a scan
Each "by scan and by index" arm compares the state after a crash with the state before it, both read through
mc_id. An index that was already wrong agrees with itself, so withpgcolumnar_index_fetch_tuplefinding no row, the suite as on main passes 25/25 (source fingerprint checked to differ from head).After each recovery, both crashes and all four functions, the suite now also checks
after a crash with <f> <uncommitted|committed>, the index reads the rows the scan reads. That's eight arms, in the shell and the twin. Under the same mutant all eight go red, with identical names on both sides, and they're green at head on 15–19. TESTS.md §123 says so.Ledger
4388 → 4396 rows, never 3058 → 3055, dated 1330 → 1341. The 8 new arms are dated by the no-row mutant, the two #433 arms by the #433 mutant, and the #359 ratio by the #359 one. Head runs on each of 15–19: maintenance_crash 33/33, native_fetch_bigcap 15/15, native_fetch_cache 26/26. The gate returns rc 0 (ceiling 190 → 190), and orphan-scan finds 0 per suite. The grader passes the pair, and the NO_CLUSTER guards pass 438/438.
🤖 Generated with Claude Code