Skip to content

Commit 95de913

Browse files
author
SqlRush
committed
fix(cluster): spec-5.55 Hardening v1.1 — measure side-effect + gate(3) test + GUC doc
Three post-ship review findings (all P2; no correctness / 8.A change), re-grounded onto the landed 5.55 on main (resolver test is t/317; injection registry was 139 after spec-5.13 H1.0.3). #1 MEASURE-mode TT-counter pollution. A MEASURE-mode memo probe ran the side-effecting acceptance gate and then fell through to the authoritative scan, which ran it again -- double-bumping wrap_generation_disambiguated on a wrap-suspect hit. Split the gate into a pure predicate (cluster_cr_resolved_scn_is_acceptable, no side effect) used by the MEASURE shadow probe, and a side-effecting wrapper (cluster_cr_accept_resolved_scn) kept byte-identical for the TRUST memo hit and the fresh scan, so gate (3) verdict-equivalence is preserved. #2 gate(3) fail-closed branch had no positive test -- and is structurally unreachable by the natural workload (a resolved deleter is always recent -> scn >= horizon -> never suspect; acceptance_failclosed stays 0 even with retention off). Add injection point cluster-cr-resolver-memo-suspect; t/317 L5 arms it inside the pgbench script (arming is per-backend) so warm- memo hits are forced closed -> acceptance_failclosed climbs AND the balance invariant still holds (no false-visible). The verdict LOGIC stays unit- tested via the pure cluster_tt_recovery_wrap_suspect gate. #3 GUC doc. cluster.resolver_cache_entries said resolver_cache_measure "must also be on to allocate", but the code allocates on (enabled || measure); corrected. Injection registry 139 -> 140; baselines updated across t/015/017/018/020/021/022/023/024/030. Local gate: cluster_unit 131/131, cluster_regress 11/11, cluster_tap (t/317 incl L5 verified 3x + the touched baselines), PG 219/219, clang-format v18 clean. Disarmed injection -> production byte-identical; catversion unchanged. Spec: spec-5.55-shared-resolver-cache.md (Hardening v1.1)
1 parent 864593e commit 95de913

14 files changed

Lines changed: 173 additions & 55 deletions

src/backend/cluster/cluster_cr.c

Lines changed: 71 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,33 +1324,51 @@ cluster_cr_count_xmax_scan_unavail_or_no_proof(void)
13241324
}
13251325

13261326
/*
1327-
* cluster_cr_accept_resolved_scn -- spec-4.8 D3 acceptance gate for a Source 3
1328-
* by-xid RESOLVED match, extracted (spec-5.55 D6) so the fresh-scan path AND a
1329-
* shared-resolver-cache memo hit run the PHYSICALLY SAME gate (gate (3),
1330-
* verdict-equivalent by construction -- they cannot drift).
1327+
* cluster_cr_resolved_scn_is_acceptable -- spec-4.8 D3 acceptance PREDICATE for a
1328+
* Source 3 by-xid RESOLVED match: the pure verdict, with NO observability side
1329+
* effect. Extracted (spec-5.55 D6) so the fresh-scan path AND a shared-resolver-
1330+
* cache memo hit reach the SAME verdict (gate (3), verdict-equivalent by
1331+
* construction -- they cannot drift).
13311332
*
13321333
* The durable scan runs WRAP_ANY (a recycled scratch ITL slot carries no
13331334
* binding wrap), so a single COMMITTED match cannot tell a genuine commit from a
13341335
* 2^32-wrapped raw-xid collision. When retention is unreliable AND the match is
1335-
* below the CURRENT horizon it is wrap-suspect -> fail closed (规则 8.A: a wrong
1336-
* deleter scn would false-hide a live row); the existing
1337-
* wrap_generation_disambiguated observability is bumped. The reliability proof
1338-
* is the EXACT sticky condition (horizon enabled AND no retention-off recycle
1339-
* this incarnation), not an abstraction -- losing the sticky leg would re-trust
1340-
* a retention-off-window recycle. Returns true to ACCEPT (RESOLVED).
1336+
* below the CURRENT horizon it is wrap-suspect -> NOT acceptable (规则 8.A: a
1337+
* wrong deleter scn would false-hide a live row). The reliability proof is the
1338+
* EXACT sticky condition (horizon enabled AND no retention-off recycle this
1339+
* incarnation), not an abstraction -- losing the sticky leg would re-trust a
1340+
* retention-off-window recycle. Returns true to ACCEPT (RESOLVED).
13411341
*/
13421342
static bool
1343-
cluster_cr_accept_resolved_scn(SCN scn)
1343+
cluster_cr_resolved_scn_is_acceptable(SCN scn)
13441344
{
13451345
bool retention_reliable = cluster_undo_retention_horizon_enabled
13461346
&& cluster_tt_slot_retention_off_recycle_count() == 0;
13471347

1348-
if (cluster_tt_recovery_wrap_suspect(CLUSTER_TT_WRAP_ANY, scn, cluster_undo_retention_horizon(),
1349-
retention_reliable)) {
1350-
cluster_tt_recovery_count_wrap_generation_disambiguated();
1351-
return false; /* suspect -> fail closed */
1352-
}
1353-
return true;
1348+
return !cluster_tt_recovery_wrap_suspect(CLUSTER_TT_WRAP_ANY, scn,
1349+
cluster_undo_retention_horizon(), retention_reliable);
1350+
}
1351+
1352+
/*
1353+
* cluster_cr_accept_resolved_scn -- the AUTHORITATIVE acceptance gate: the pure
1354+
* predicate above PLUS the existing wrap_generation_disambiguated observability
1355+
* bump on a fail-closed verdict. Used by the fresh-scan path and the TRUST-mode
1356+
* memo hit -- both AUTHORITATIVE resolutions, so each bumps the base counter
1357+
* exactly once.
1358+
*
1359+
* The MEASURE-mode memo probe (spec-5.55 Hardening v1.1, finding #1) must NOT use
1360+
* this wrapper: it is a non-authoritative shadow measurement that still falls
1361+
* through to the authoritative scan, so bumping here would DOUBLE-count the base
1362+
* wrap_generation_disambiguated counter on a wrap-suspect hit -- it calls the
1363+
* pure predicate instead. Returns true to ACCEPT (RESOLVED).
1364+
*/
1365+
static bool
1366+
cluster_cr_accept_resolved_scn(SCN scn)
1367+
{
1368+
if (cluster_cr_resolved_scn_is_acceptable(scn))
1369+
return true;
1370+
cluster_tt_recovery_count_wrap_generation_disambiguated();
1371+
return false; /* suspect -> fail closed */
13541372
}
13551373

13561374
/*
@@ -1445,18 +1463,50 @@ cluster_cr_resolve_xmax_commit_scn(const char *cr_page, uint8 itl_idx, Transacti
14451463
SCN hint_scn = InvalidScn;
14461464

14471465
if (cluster_resolver_cache_probe((uint16)cluster_node_id, cr_xmax, &hint_scn)) {
1448-
bool accepted = cluster_cr_accept_resolved_scn(hint_scn);
1449-
1450-
cluster_resolver_cache_count_acceptance(accepted);
14511466
if (cluster_resolver_cache_trust()) {
1467+
/*
1468+
* TRUST: the memo hit IS the authoritative resolution (no fresh
1469+
* scan follows), so it runs the side-effecting acceptance gate --
1470+
* byte-identical to the fresh-scan path (gate (3)); its
1471+
* wrap_generation_disambiguated bump replaces the fresh-scan bump.
1472+
*/
1473+
bool accepted = cluster_cr_accept_resolved_scn(hint_scn);
1474+
1475+
/*
1476+
* spec-5.55 Hardening v1.1 (finding #2): the memo-path fail-closed
1477+
* branch is a defensive 2^32-wrap guard the natural MVCC workload
1478+
* cannot reach (a resolved deleter is always recent -> scn >=
1479+
* horizon -> never suspect). This injection forces it closed so a
1480+
* TAP test proves the branch routes (count_acceptance(false) ->
1481+
* INVALID_OR_AMBIGUOUS) and the 8.A invariant still holds. It does
1482+
* NOT bump the base wrap_generation_disambiguated counter (no real
1483+
* wrap occurred). Disarmed in production -> byte-identical.
1484+
*/
1485+
if (accepted
1486+
&& cluster_cr_injection_armed("cluster-cr-resolver-memo-suspect", NULL))
1487+
accepted = false;
1488+
1489+
cluster_resolver_cache_count_acceptance(accepted);
14521490
if (!accepted) {
14531491
*out_scn = InvalidScn; /* same fail-closed as the fresh-scan branch */
14541492
return CLUSTER_CR_XMAX_INVALID_OR_AMBIGUOUS;
14551493
}
14561494
*out_scn = hint_scn; /* gate (1): durable re-read, verdict-equivalent */
14571495
return CLUSTER_CR_XMAX_RESOLVED_SCN;
14581496
}
1459-
/* MEASURE: never trust the hint -- fall through to the authoritative scan. */
1497+
1498+
/*
1499+
* MEASURE (spec-5.55 Hardening v1.1, finding #1): record the would-hit
1500+
* acceptance outcome with the PURE predicate, NOT the side-effecting
1501+
* gate. This shadow probe falls through to the authoritative scan
1502+
* below, which bumps wrap_generation_disambiguated itself; using the
1503+
* wrapper here would double-count that base TT counter on a wrap-suspect
1504+
* hit. The verdict is identical (the wrapper is predicate + side
1505+
* effect), so the resolver-cache acceptance counters stay accurate.
1506+
*/
1507+
cluster_resolver_cache_count_acceptance(
1508+
cluster_cr_resolved_scn_is_acceptable(hint_scn));
1509+
/* never trust the hint -- fall through to the authoritative scan. */
14601510
}
14611511
}
14621512

src/backend/cluster/cluster_guc.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,8 +2628,9 @@ cluster_init_guc(void)
26282628
gettext_noop("Spec-5.55 D3/D7. Default 0 (true zero memory; the region is registered but "
26292629
"reserves 0 bytes). PGC_POSTMASTER: requires a restart. The recommended "
26302630
"non-zero default + sizing are bound to the §0.6 measure-leg value gate "
2631-
"evidence (spec-5.58); resolver_cache_measure must also be on to allocate. "
2632-
"Each hint slot costs a few dozen bytes of shared memory."),
2631+
"evidence (spec-5.58); either resolver_cache_enabled or "
2632+
"resolver_cache_measure must be on for this to allocate. Each hint slot "
2633+
"costs a few dozen bytes of shared memory."),
26332634
&cluster_shared_resolver_cache_entries, 0, 0, 1048576, PGC_POSTMASTER, 0, NULL, NULL, NULL);
26342635

26352636
DefineCustomIntVariable(

src/backend/cluster/cluster_inject.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,18 @@ static ClusterInjectPoint cluster_injection_points[] = {
454454
*/
455455
{ .name = "cluster-cr-skip-epoch-bump" },
456456

457+
/*
458+
* spec-5.55 Hardening v1.1 (finding #2) — shared-resolver-cache memo-path
459+
* acceptance fail-closed (1 entry). When armed, a TRUST-mode memo hit's
460+
* Source-3 acceptance verdict is forced to fail closed (gate (3)), driving
461+
* the exact production branch (count_acceptance(false) -> INVALID_OR_AMBIGUOUS).
462+
* The natural MVCC workload cannot reach it: a resolved deleter is always
463+
* recent (scn >= horizon -> never wrap-suspect), and an old entry below an
464+
* advanced horizon is never re-probed. The fault-inject test then proves the
465+
* branch routes correctly AND the 8.A balance invariant still holds.
466+
*/
467+
{ .name = "cluster-cr-resolver-memo-suspect" },
468+
457469
/*
458470
* spec-4.1 D7 — per-thread WAL routing (2 NEW points).
459471
*

src/test/cluster_tap/t/015_inject.pl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@
5757
# ----------
5858
is( $node->safe_psql('postgres',
5959
'SELECT count(*) FROM pg_stat_cluster_injections'),
60-
'139',
61-
'pg_stat_cluster_injections returns 139 rows (spec-5.13 +6 cluster-clean-leave-*; spec-5.13 Hardening v1.0.3 +1 cluster-clean-leave-survivor-suppress-preflight-ack; spec-5.53 +1 cluster-cr-skip-epoch-bump; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship; spec-5.8 +1 cluster-lmd-force-partial-round)');
60+
'140',
61+
'pg_stat_cluster_injections returns 140 rows (spec-5.13 +6 cluster-clean-leave-*; spec-5.13 Hardening v1.0.3 +1 cluster-clean-leave-survivor-suppress-preflight-ack; spec-5.53 +1 cluster-cr-skip-epoch-bump; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship; spec-5.8 +1 cluster-lmd-force-partial-round; spec-5.55 Hardening v1.1 +1 cluster-cr-resolver-memo-suspect)');
6262

6363

6464
# ----------
@@ -86,8 +86,8 @@
8686
'postgres',
8787
'SELECT string_agg(name, \',\' ORDER BY name) FROM pg_stat_cluster_injections'
8888
),
89-
'cluster-clean-leave-barrier-complete,cluster-clean-leave-escalate-to-failstop,cluster-clean-leave-gcs-flushed,cluster-clean-leave-ges-drained,cluster-clean-leave-quiesce-pre,cluster-clean-leave-request,cluster-clean-leave-survivor-suppress-preflight-ack,cluster-clean-xfer-stale-holder,cluster-collision-detect,cluster-conf-load-success,cluster-conf-parse-fail,cluster-conf-shmem-init,cluster-cr-skip-epoch-bump,cluster-cssd-main-loop-pre-tick,cluster-cssd-mark-peer-dead,cluster-cssd-post-spawn,cluster-cssd-pre-spawn,cluster-cssd-ready-publish,cluster-cssd-shutdown-post,cluster-cssd-shutdown-pre,cluster-debug-dump-entry,cluster-diag-main-loop-iter,cluster-diag-post-spawn,cluster-diag-pre-spawn,cluster-diag-ready-publish,cluster-diag-shutdown-post,cluster-diag-shutdown-pre,cluster-fence-post-thaw-broadcast,cluster-fence-pre-freeze-broadcast,cluster-fence-pre-self-fence-shutdown,cluster-gcs-block-drop-reply-before-send,cluster-gcs-block-evict-holder-before-ship,cluster-gcs-block-force-epoch-stale-reply,cluster-gcs-block-forward-master-side,cluster-gcs-block-invalidate-drop-broadcast,cluster-gcs-block-invalidate-stall-ack,cluster-gcs-block-stale-ship,cluster-gcs-block-starvation-force-denied,cluster-gcs-block-x-forward-master-side,cluster-grd-redeclare-skip,cluster-guc-init-pre-define,cluster-ic-mock-send-pre-enqueue,cluster-ic-tier-selected,cluster-init-post-shmem,cluster-init-pre-shmem,cluster-init-top,cluster-ko-peer-skip-ack,cluster-lck-main-loop-iter,cluster-lck-post-spawn,cluster-lck-pre-spawn,cluster-lck-ready-publish,cluster-lck-shutdown-post,cluster-lck-shutdown-pre,cluster-lmd-force-partial-round,cluster-lmon-main-loop-iter,cluster-lmon-post-spawn,cluster-lmon-pre-spawn,cluster-lmon-ready-publish,cluster-lmon-shutdown-post,cluster-lmon-shutdown-pre,cluster-pcm-acquire-entry,cluster-pcm-convert-pre,cluster-pcm-downgrade-pre,cluster-pcm-release-pre,cluster-pgstat-mirror-sync,cluster-quorum-loss-broadcast,cluster-qvotec-poll-post,cluster-qvotec-poll-pre,cluster-reconfig-broadcast-procsig-pre,cluster-reconfig-decide-coordinator,cluster-reconfig-epoch-bump-pre,cluster-reconfig-tick-entry,cluster-run-shutdown-top,cluster-run-startup-top,cluster-scn-abort-post-advance,cluster-scn-abort-pre-advance,cluster-scn-advance-post,cluster-scn-advance-pre,cluster-scn-boc-sweep-post,cluster-scn-boc-sweep-pre,cluster-scn-commit-post-advance,cluster-scn-commit-pre-advance,cluster-scn-observe-bump-pre,cluster-scn-observe-entry,cluster-scn-replay-observe-pre,cluster-scn-wal-write-pre,cluster-scn-wraparound-warning,cluster-shared-fs-backend-register,cluster-shared-fs-init-top,cluster-shared-fs-local-open,cluster-shmem-region-init-post,cluster-shmem-region-init-pre,cluster-shmem-register-region,cluster-shmem-request,cluster-shmem-views-srf-entry,cluster-shutdown-top,cluster-sinval-ack-drop-send,cluster-sinval-ack-skip-validate,cluster-sinval-broadcast-drop-send,cluster-sinval-receive-skip-validate,cluster-smgr-create-top,cluster-smgr-open-top,cluster-smgr-which-decision,cluster-startup-phase-0-enter,cluster-startup-phase-0-exit,cluster-startup-phase-0-fail,cluster-startup-phase-1-enter,cluster-startup-phase-1-exit,cluster-startup-phase-1-fail,cluster-startup-phase-2-enter,cluster-startup-phase-2-exit,cluster-startup-phase-2-fail,cluster-startup-phase-3-enter,cluster-startup-phase-3-exit,cluster-startup-phase-3-fail,cluster-startup-phase-4-enter,cluster-startup-phase-4-exit,cluster-startup-phase-4-fail,cluster-stats-main-loop-iter,cluster-stats-post-spawn,cluster-stats-pre-spawn,cluster-stats-ready-publish,cluster-stats-shutdown-post,cluster-stats-shutdown-pre,cluster-thread-recovery-drive,cluster-views-srf-entry,cluster-voting-disk-write-fail,cluster-wal-page-init-thread-id,cluster-wal-state-ensure-pre,cluster-wal-state-write-fail,cluster-wal-thread-claim-create-fail,cluster-wal-thread-validate-pre,cr_construct_delay_us,cr_corruption,cr_cross_instance,cr_force_read_scn,cr_snapshot_too_old,undo-force-wal-before-data-violation,undo-skip-checkpoint-flush-one',
90-
'139 injection point names match the full registry (spec-5.13 +6 cluster-clean-leave-*; spec-5.13 Hardening v1.0.3 +1 cluster-clean-leave-survivor-suppress-preflight-ack; spec-5.53 +1 cluster-cr-skip-epoch-bump; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship; spec-5.8 +1 cluster-lmd-force-partial-round)');
89+
'cluster-clean-leave-barrier-complete,cluster-clean-leave-escalate-to-failstop,cluster-clean-leave-gcs-flushed,cluster-clean-leave-ges-drained,cluster-clean-leave-quiesce-pre,cluster-clean-leave-request,cluster-clean-leave-survivor-suppress-preflight-ack,cluster-clean-xfer-stale-holder,cluster-collision-detect,cluster-conf-load-success,cluster-conf-parse-fail,cluster-conf-shmem-init,cluster-cr-resolver-memo-suspect,cluster-cr-skip-epoch-bump,cluster-cssd-main-loop-pre-tick,cluster-cssd-mark-peer-dead,cluster-cssd-post-spawn,cluster-cssd-pre-spawn,cluster-cssd-ready-publish,cluster-cssd-shutdown-post,cluster-cssd-shutdown-pre,cluster-debug-dump-entry,cluster-diag-main-loop-iter,cluster-diag-post-spawn,cluster-diag-pre-spawn,cluster-diag-ready-publish,cluster-diag-shutdown-post,cluster-diag-shutdown-pre,cluster-fence-post-thaw-broadcast,cluster-fence-pre-freeze-broadcast,cluster-fence-pre-self-fence-shutdown,cluster-gcs-block-drop-reply-before-send,cluster-gcs-block-evict-holder-before-ship,cluster-gcs-block-force-epoch-stale-reply,cluster-gcs-block-forward-master-side,cluster-gcs-block-invalidate-drop-broadcast,cluster-gcs-block-invalidate-stall-ack,cluster-gcs-block-stale-ship,cluster-gcs-block-starvation-force-denied,cluster-gcs-block-x-forward-master-side,cluster-grd-redeclare-skip,cluster-guc-init-pre-define,cluster-ic-mock-send-pre-enqueue,cluster-ic-tier-selected,cluster-init-post-shmem,cluster-init-pre-shmem,cluster-init-top,cluster-ko-peer-skip-ack,cluster-lck-main-loop-iter,cluster-lck-post-spawn,cluster-lck-pre-spawn,cluster-lck-ready-publish,cluster-lck-shutdown-post,cluster-lck-shutdown-pre,cluster-lmd-force-partial-round,cluster-lmon-main-loop-iter,cluster-lmon-post-spawn,cluster-lmon-pre-spawn,cluster-lmon-ready-publish,cluster-lmon-shutdown-post,cluster-lmon-shutdown-pre,cluster-pcm-acquire-entry,cluster-pcm-convert-pre,cluster-pcm-downgrade-pre,cluster-pcm-release-pre,cluster-pgstat-mirror-sync,cluster-quorum-loss-broadcast,cluster-qvotec-poll-post,cluster-qvotec-poll-pre,cluster-reconfig-broadcast-procsig-pre,cluster-reconfig-decide-coordinator,cluster-reconfig-epoch-bump-pre,cluster-reconfig-tick-entry,cluster-run-shutdown-top,cluster-run-startup-top,cluster-scn-abort-post-advance,cluster-scn-abort-pre-advance,cluster-scn-advance-post,cluster-scn-advance-pre,cluster-scn-boc-sweep-post,cluster-scn-boc-sweep-pre,cluster-scn-commit-post-advance,cluster-scn-commit-pre-advance,cluster-scn-observe-bump-pre,cluster-scn-observe-entry,cluster-scn-replay-observe-pre,cluster-scn-wal-write-pre,cluster-scn-wraparound-warning,cluster-shared-fs-backend-register,cluster-shared-fs-init-top,cluster-shared-fs-local-open,cluster-shmem-region-init-post,cluster-shmem-region-init-pre,cluster-shmem-register-region,cluster-shmem-request,cluster-shmem-views-srf-entry,cluster-shutdown-top,cluster-sinval-ack-drop-send,cluster-sinval-ack-skip-validate,cluster-sinval-broadcast-drop-send,cluster-sinval-receive-skip-validate,cluster-smgr-create-top,cluster-smgr-open-top,cluster-smgr-which-decision,cluster-startup-phase-0-enter,cluster-startup-phase-0-exit,cluster-startup-phase-0-fail,cluster-startup-phase-1-enter,cluster-startup-phase-1-exit,cluster-startup-phase-1-fail,cluster-startup-phase-2-enter,cluster-startup-phase-2-exit,cluster-startup-phase-2-fail,cluster-startup-phase-3-enter,cluster-startup-phase-3-exit,cluster-startup-phase-3-fail,cluster-startup-phase-4-enter,cluster-startup-phase-4-exit,cluster-startup-phase-4-fail,cluster-stats-main-loop-iter,cluster-stats-post-spawn,cluster-stats-pre-spawn,cluster-stats-ready-publish,cluster-stats-shutdown-post,cluster-stats-shutdown-pre,cluster-thread-recovery-drive,cluster-views-srf-entry,cluster-voting-disk-write-fail,cluster-wal-page-init-thread-id,cluster-wal-state-ensure-pre,cluster-wal-state-write-fail,cluster-wal-thread-claim-create-fail,cluster-wal-thread-validate-pre,cr_construct_delay_us,cr_corruption,cr_cross_instance,cr_force_read_scn,cr_snapshot_too_old,undo-force-wal-before-data-violation,undo-skip-checkpoint-flush-one',
90+
'140 injection point names match the full registry (spec-5.13 +6 cluster-clean-leave-*; spec-5.13 Hardening v1.0.3 +1 cluster-clean-leave-survivor-suppress-preflight-ack; spec-5.53 +1 cluster-cr-skip-epoch-bump; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship; spec-5.8 +1 cluster-lmd-force-partial-round; spec-5.55 Hardening v1.1 +1 cluster-cr-resolver-memo-suspect)');
9191

9292

9393
# ----------

src/test/cluster_tap/t/017_debug.pl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@
123123
'postgres',
124124
q{SELECT count(*) FROM pg_cluster_state
125125
WHERE category='inject' AND key LIKE '%.fault_type'}),
126-
'139',
127-
'all 139 injection points have a .fault_type entry under inject category (spec-5.13 +6 cluster-clean-leave-*; spec-2.41 +1 gcs-block-stale-ship; spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2; spec-5.13 H1.0.3 +1 clean-leave-survivor-suppress-preflight-ack)');
126+
'140',
127+
'all 140 injection points have a .fault_type entry under inject category (spec-5.13 +6 cluster-clean-leave-*; spec-2.41 +1 gcs-block-stale-ship; spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2; spec-5.13 H1.0.3 +1 clean-leave-survivor-suppress-preflight-ack; spec-5.55 Hardening v1.1 +1 cluster-cr-resolver-memo-suspect)');
128128

129129
is( $node->safe_psql(
130130
'postgres',
131131
q{SELECT count(*) FROM pg_cluster_state
132132
WHERE category='inject' AND key LIKE '%.hits'}),
133-
'139',
134-
'all 139 injection points have a .hits entry under inject category (spec-5.13 +6 cluster-clean-leave-*; spec-2.41 +1 gcs-block-stale-ship; spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2; spec-5.13 H1.0.3 +1 clean-leave-survivor-suppress-preflight-ack)');
133+
'140',
134+
'all 140 injection points have a .hits entry under inject category (spec-5.13 +6 cluster-clean-leave-*; spec-2.41 +1 gcs-block-stale-ship; spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2; spec-5.13 H1.0.3 +1 clean-leave-survivor-suppress-preflight-ack; spec-5.55 Hardening v1.1 +1 cluster-cr-resolver-memo-suspect)');
135135

136136

137137
# ----------

src/test/cluster_tap/t/018_shared_fs.pl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,8 @@
130130
is($node->safe_psql(
131131
'postgres',
132132
'SELECT count(*) FROM pg_stat_cluster_injections'),
133-
'139',
134-
'L9 total injection registry size is 139 (spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2 undo boundary guards; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship)');
133+
'140',
134+
'L9 total injection registry size is 140 (spec-5.2a +1 clean-xfer stale-holder; spec-4.8ab +2 undo boundary guards; spec-5.7 +1 cluster-ko-peer-skip-ack; spec-2.41 +1 cluster-gcs-block-stale-ship; spec-5.55 Hardening v1.1 +1 cluster-cr-resolver-memo-suspect)');
135135

136136

137137
# ----------

0 commit comments

Comments
 (0)