Repository navigation
test: logical_decoding_source gains its pytest twin, and a dead second slot no longer passes (#1341) - #1640
Conversation
3d6c3aa to
de99fb4
Compare
de99fb4 to
b7c4317
Compare
jdatcmd
left a comment
There was a problem hiding this comment.
Blocking: the ledger registers the suite's skip message as a check, and CI fails the ledger gate on it. Every PR stacked above this one inherits the failure (#1641, #1645–#1655: suites PG17 and PG18 red).
The diff adds this row to test/check_ledger.tsv:
logical_decoding_source logical_decoding_source test_decoding.so is not installed; build contrib/test_decoding 15;16;17;18;19 never -
That text is the name of pgc_skip at test/logical_decoding_source.sh:39, not a check. CI has test_decoding, so the suite runs, never emits that name, and the orphan scan reports it (suites PG17 job, this head):
orphan: logical_decoding_source logical_decoding_source test_decoding.so is not installed; build contrib/test_decoding (claims 15;16;17;18;19, no history)
orphan scan: parts in the run=1, rows in those parts=13, orphans=1 (0 carrying history)
Main's ledger holds no skip names: grep -ciE "not available|not installed" on it prints 0.
To fix: drop the row, and reduce the census counts in check_ledger_budget.txt by one never-red row.
I have not reviewed the rest of this PR yet. I will once this is fixed.
b7c4317 to
9109eb2
Compare
jdatcmd
left a comment
There was a problem hiding this comment.
Approved at 9109eb2. My blocking point is fixed: the ledger no longer holds the skip message (grep -c "not installed; build contrib" on this head's ledger prints 0).
Reproduced on PG17, with the second slot created after the inserts (a dead slot) in a temporary copy of each harness:
| run | result |
|---|---|
| main's shell, dead slot | 11 passed + 0 failed: the hole |
| this head's shell, dead slot | 2 failed: "CONTROL: the second slot decodes the heap table's 5000 inserts: got [0] want [5000]" and "100x the rows …: got [no (14 then 0; the second slot must carry some)]" |
| this head's twin, dead slot | the same 2 names, the same readings |
| clean, PG15 and PG19 | shell 12/12, twin 13 passed |
Non-blocking: when the plugin is present, the twin records a PASS named "test_decoding.so is not installed; build contrib/test_decoding". A reader of a twin log sees a passing check whose name says the opposite of what holds. Recording it only when the plugin is missing (as the shell's pgc_skip does) would match the shell exactly. It does not affect the ledger, which is why I'm not blocking on it.
This stack still conflicts with main (my comment on #1638). I'll re-approve a restate whose non-registry files are unchanged.
7739bcd to
3becd3a
Compare
… guard's (#1341) iceberg_dv.sh gains test/pytest/test_iceberg_dv.py, one check per test under the shell's names, and two holes in the shell are closed, each measured red-first on PG17: - "a manifest/footer offset mismatch is refused (XX001)" read the SQLSTATE alone, and several guards raise XX001. With the offset match removed (the !found refusal skipped), a later XX001 refused the same file and main's shell passed 26/26. Every refusal now reads its own guard's message: refusal() answers the SQLSTATE only when the message carries the guard's phrase, and "<SQLSTATE> (another refusal: ...)" otherwise. - The three "backend still up" checks read SELECT 1, which answers again after crash recovery. With the referenced_data_file check removed a NULL path reaches strcmp and the backend dies on that arm; main passed "backend still up after the DV refusals". They now also read the server log's count of killed backends (crashes/survived, as avro_manifest), and each refusal waits for the server to answer first (await_up), so a crash reddens its own arm and its section's survival check, the same names in both harnesses, and not a timing-dependent tail of collateral. The eight survivor comparisons move to check_text, so an empty oracle no longer matches an empty scan. Measured on PG17, shell then twin as shipped: seventeen mutations, each with the same reds in both (strictgt 7, anyfile/nodup/nov2/noflags/noref/nobigoff 2, the rest 1); 26/26 in each on 15-19. 25 rows dated, 1 never (the survival check after the DV applications, which no mutation crashed). Census 3884 -> 3885 never, 2286 -> 2311 dated, 6196 rows; suites_not_covered 102 -> 101; cluster_tests 2753 -> 2779; TESTS.md §268. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d slot no longer passes (#1341) The pytest twin of test/logical_decoding_source.sh (#754), one check per test, every check by the shell's name, on a private cluster at wal_level=logical. The shell's second slot (pgc_754b) had no heap control. Created after the 5000-row insert, it decoded nothing, and both "and it too emits no decodable change of its own" and "100x the rows does not give 100x the internal records" (0 < anything) passed: main 11/11. A heap table now writes through that slot in the same window and must decode its 5000 inserts ("CONTROL: the second slot decodes the heap table's 5000 inserts"), and the ratio check refuses a slot that carried no internal records. Under that harness mutation both are red in both twins (SAME 2). The pgc_skip message for a missing test_decoding.so was built from pg_config --pkglibdir, so the grader could not read it; it is now a literal, and the twin records the same name (with the plugin moved away on PG17: shell 1 FAIL, twin the same 1 FAIL and 12 declined). No source mutation reddens a check: the claim is that pgcolumnar writes nothing logical decoding can read. A default chunk group of 100 rows still keeps the internal records following groups (114 for 50 groups, under the 10x bound), so it dates nothing. 12/12 shell and 13/13 twin on each of 15-19. Census 3885 -> 3897 never, 2311 dated, 6208 rows (the skip name has no ledger row: it is not a check); suites_not_covered 101 -> 100; cluster_tests 2779 -> 2792; TESTS.md §269. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3becd3a to
119908e
Compare
Most of the CI reds on 2026-10-22 were exit 124 from one step: `sudo timeout 600 apt-get install`, fetching LLVM and PostgreSQL packages from the runner's mirror. The nightly gate (#1729), main's run on 4adb2e7, and the cluster jobs of #1640 and #1739 all died there, before any test ran. One stalled attempt spent the whole 600 seconds. .github/scripts/apt-retry.sh runs the same apt-get arguments up to three times, each bounded (200 s for an install, 100 s for an update), so the worst case is the same 600 and 300 seconds as before and no job's limit moves. A connection that sends nothing for 30 seconds fails at once, and partial downloads are kept for the retry. Every bounded apt-get in ci.yml (3 jobs) and nightly.yml (6 jobs) uses it, and the PG19 beta build's two unbounded calls now are bounded. Every job checks out the repository before its install step. Guards 804 passed; shellcheck -S error on the script passes. The behaviour on a stalled mirror is only provable in CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jdatcmd
logical_decoding_sourcegains its pytest twin (#754), one check per test, every check by the shell's name. The twin runs on a private cluster atwal_level=logical, because the shared cluster runs at the default and the level needs a restart.This PR will be restated into a stack with my other open ports (the iceberg four and
logical_subscriber), so its counts move once at the end.What was wrong, measured red-first on main's shell (PG17):
pgc_754bhad no heap control. Created after the 5000-row insert, it decoded 0 records, and "and it too emits no decodable change of its own" and "100x the rows does not give 100x the internal records" (0 < anything) both passedpgc_skipmessage for a missingtest_decoding.sowas built from$(pg_config --pkglibdir), so the grader could not read itWhat no source mutant reddens:
tinychunks(defaultchunk_group_row_limit10000 → 100) andtinystripes(stripe_row_limit150000 → 1000) both stay green. Internal records follow groups: 114 for 50 groups, 52 for 5 stripes, under the 10x bound. So the claim holds under them, and they date nothing. The suite's claim is that pgcolumnar writes nothing logical decoding can read. I found no one-line product change that makes a columnar write decodable, so all 13 rows arrivenever.Runs: 12/12 shell and 13/13 twin on each of 15–19. The twin's extra test is the
pgc_skipmirror, which the shell records only when the plugin is missing.Counts: census 3793 → 3806 never, 2073 dated, 5879 rows;
suites_not_covered113 → 112;cluster_tests2454 → 2467; TESTS.md §256. Gates: guards 467 passed, collection 2467, ledger gate rc=0, self-test PASSED.🤖 Generated with Claude Code