Skip to content

Thirteen suites do their own setup, so each harness guarantee must be re-added by hand (found twice) #1220

Description

@jdatcmd

Thirteen suites build with their own make -C ... install instead of
pgc_build_and_install, so neither the build stamp (#536) nor the
object-provenance check (#1219) protects them. Found while building #1219's
end-to-end proof: my first attempt used smoke.sh and the guard never fired,
because smoke.sh never calls the guarded builder.

Demonstrated, not inferred

Same fixture as #1219's proof — PG18 objects in the tree, stamp written to say
17, run under PG17:

  native_reclaim_frag.sh   (routes through pgc_build_and_install)
    -- the objects in the tree were not built against .../pg17/include/postgresql/server,
       whatever the build stamp says; cleaning first
    accounting: 4 passed + 0 failed = 4   PASSED

  smoke.sh                 (its own make, line 55-58)
    -- building
    -- installing
    pg_ctl: could not start server
    FATAL: could not load library ".../pgcolumnar.so": undefined symbol: pqsignal_be

One major's objects installed into another's prefix, silently, with no clean
and no refusal.

The thirteen

  audit  concurrency  extension_upgrade  objstore_stash_recovery  pg_upgrade
  phase2  phase3  phase4  phase5  phase6  smoke  unique_conc  update_conc

267 of 277 suites route through pgc_setup, so this is the tail, not the
norm. run_all_versions.sh and run_coverage.sh also build directly, but the
matrix path is separately safe: it cleans each per-major copy right after its
cp -a, which the #536 comment in test/selftest/190-... already records and
which was measured when that issue was filed.

Scope

Pre-existing, and orthogonal to #1219 — that change makes the guarded path
strictly better and leaves these exactly as they were. Filing rather than
folding in, so the fix is reviewable on its own.

What the fix needs, and the part that is not obvious

Thirteen small edits are the easy half. The guard against it happening again is
the hard half: an arm asserting every suite either routes through the builder
or is named in an exception list
rots the moment the list is the thing being
maintained — the same defect as the build stamp this came from, where a check
depended on hand-written bookkeeping and a hand-run command defeated it.

Deriving the population instead: a suite that calls make ... install and does
not call pgc_build_and_install is exactly the predicate used to produce the
list above, and it needs no list. Whether any of the thirteen build directly for
a reason is the open question — pg_upgrade and extension_upgrade plausibly
need two majors installed at once, which is precisely the case a single guarded
builder cannot express.

So the answer may be "fix eleven, and give the other two a way to say so" rather
than "fix thirteen".

🤖 Generated with Claude Code

https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions