Skip to content

Extend PRA coverage to deletions, overwrites and non-versioned buckets - #2532

Open
delthas wants to merge 6 commits into
development/2.16from
wip/ZENKO-5355/pra-delete-and-overwrite-tests
Open

delthas wants to merge 6 commits into
development/2.16from
wip/ZENKO-5355/pra-delete-and-overwrite-tests

Conversation

@delthas

@delthas delthas commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

The PRA scenario deleted nothing, and its only bucket was versioned — so an object was never overwritten in place, and never deleted without a version to remove. This adds those paths and points the solution at the builds that make them pass.

Scenarios

scenario before this PR
PRA (nominal case) — Versioned ✓ ✓, plus a version deletion
PRA (nominal case) — Non versioned — restored to the Examples table
PRA (nominal case) — Suspended — new row
PRA (null version in a versioned bucket) — new scenario
PRA (in-place overwrite) — new scenario

The Non versioned row was in the table until 137e69dd91 swapped it for Versioned, in the same commit that added the cross-site restore steps. Nothing records why — not the commit message, not the pull request, not the ticket — and the restore helper it extracted keeps the version id optional, so it runs against a bucket that has none. Since the swap, nothing has restored or failed over an object whose bucket holds no version to carry its state. Both rows run again.

Deletion rides the Examples matrix rather than getting scenarios of its own: the steps are identical, and what differs is the bucket they run against. A versioned bucket removes a version; an unversioned one has no version to remove, so the delete takes away the object's only document; a suspended one creates a null delete marker, and the marker itself is not replicated — it carries the bucket's location constraint, which can never be cold. What removes the object there is the other write the delete makes: cloudserver removes the null version the marker replaces, and that removal carries the cold object's own metadata. Three different metadata events, one set of steps.

Two cases cannot be parameterised, so they run as their own scenarios rather than being repeated identically in every row. The in-place overwrite needs a non-versioned bucket, which no other row provides. The null version in a versioned bucket is about ordering: an object written before versioning is enabled stays a bare master with no version id, and stays one after the bucket becomes Enabled — the state cloudserver describes as "a single null version [that] looks like a master key". Both scenarios install D/R first and write afterwards, so the write travels the change stream rather than the bootstrap dump.

Deleting an unversioned object already passes on development/2.16, but for the wrong reason — the delete flag lands on the master, the document a version-less HeadObject reads, so the object reads as absent while its document stays behind forever. That row is a regression guard, not a demonstration.

What the bumps point at

component fix state
zenko-operator scality/zenko-operator#631 — the source pipeline that makes deletions visible; pinned as v1.8.18-h14da7477…, a retag of its head open, based on scality/zenko-operator#641
backbeat 9.6.0-preview.4 — scality/backbeat#2833, the mongo-processor's D/R mode, and scality/backbeat#2842, omitting the metrics block the D/R sink has no consumer for released
zenko-drctl v1.1.0-preview.1 — carries DRCTL-83, the objects topic on both D/R CRs, and the merged DRCTL-79 that sets the backbeat image on the sink released

Only the operator is unreleased. The bump commit is replaced by released versions before this merges, so expect it to be amended until then.

A known race, not fixed here

Bucket definitions reach the sink through the Kafka Connect entity sync; object entries reach it through the mongo-processor. Nothing orders the two. An object entry that arrives before its bucket gets NoSuchBucket, and the offset is committed regardless — so that object's metadata is dropped for good, and the scenario fails on an assertion no amount of waiting can satisfy.

We have not tried to fix it here. The entity path this races is expected to be retired.

Issue: ZENKO-5355

@delthas

delthas commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author

@DarkIsDude Moved #2529 here (to get the right ticket ref in the branch)

Comment thread solution/deps.yaml Outdated
# yq eval 'sortKeys(.)' -i deps.yaml
backbeat:
sourceRegistry: ghcr.io/scality
sourceRegistry: ghcr.io/scality/playground/delthas

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

backbeat pulls from ghcr.io/scality/playground/delthas — a personal playground registry. The review criteria require Scality-internal images to resolve from ghcr.io/scality with a concrete released tag. The PR description says this will be replaced before merge; flagging so it isn't overlooked.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🌚

Comment thread solution/deps.yaml Outdated
dashboard: zenko-operator/zenko-operator-dashboards
image: zenko-operator
tag: v1.8.16
tag: cf7e60c45ce51a598ef5c39ea3a58057c86627ac

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

zenko-operator is pinned to a bare commit SHA (cf7e60c...), not a released tag. The PR description notes that zenko-operator#631 is still open. This needs a released tag before merge.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🌚

Comment thread .github/scripts/end2end/configs/zenko.yaml
Comment thread solution/deps.yaml
image: vault2
tag: 8.11.9
envsubst: VAULT_TAG
zenko-operator:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can't bump ZKOP to 1.9 at this point, analytics is still in flux...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping this thread open until we decide what to do

@DarkIsDude
DarkIsDude removed their request for review September 15, 2026 08:51
Comment thread .github/scripts/end2end/configs/zenko.yaml
Comment thread tests/functional/ctst/features/pra.feature Outdated
Comment thread tests/functional/ctst/features/pra.feature
Comment thread tests/functional/ctst/features/pra.feature
@delthas
delthas force-pushed the wip/ZENKO-5355/pra-delete-and-overwrite-tests branch 2 times, most recently from 1ce9109 to a87e734 Compare September 16, 2026 16:44
@delthas
delthas changed the base branch from development/2.16 to improvement/ZENKO-5359/backbeat-configuration-overrides September 16, 2026 16:44
@delthas
delthas force-pushed the wip/ZENKO-5355/pra-delete-and-overwrite-tests branch from a87e734 to e535ca5 Compare September 16, 2026 16:53

@benzekrimaha benzekrimaha left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM , don't forget to put the bb tag version before merging

@delthas
delthas force-pushed the improvement/ZENKO-5359/backbeat-configuration-overrides branch from 99c71b4 to 2ab135e Compare September 21, 2026 13:34
@delthas
delthas force-pushed the wip/ZENKO-5355/pra-delete-and-overwrite-tests branch from e535ca5 to 5e3698c Compare October 5, 2026 22:06
The examples table carried `Non versioned` alone until 137e69d swapped
it for `Versioned`, in the same commit that added the cross-site restore
steps. Nothing records why: the commit message says only "Complete PRA
logic", the pull request body names the tests it was missing, its review
discussed the zenkoversion, the locations and the scripts, and the ticket
has no description at all. Nor does the code suggest a reason -- the
restore helper that commit extracted keeps the version id optional, so it
runs against a bucket that has none.

Since the swap, nothing has restored or failed over an object whose bucket
holds no version to carry its state, which is where a restore writes
`x-amz-restore` onto a master with nothing beneath it.

Both rows rather than the swap back: the version delete this scenario
covers needs a bucket with versions to delete.

Issue: ZENKO-5355
Three paths the PRA scenario never touched: it deletes nothing, and its
only bucket is versioned, so an object is never overwritten in place and
never deleted without a version to remove. None of the deletions D/R has
never replicated, nor the metadata a non-versioned overwrite has to
carry, is visible to CI today.

Removing a version and overwriting in place are steps of the nominal
scenario, which already holds the state they need. Removing an
unversioned object gets a scenario of its own: a failing step abandons
the rest of its scenario, and this is the one whose outcome on a
released deployment is not yet known. @pra is assigned at most one
pickle at a time, so scenarios cannot fight over the two clusters.

Delete markers stay uncovered, as ZENKO-4886 records: a marker carries
no placement, so the location the source selects on cannot match it.

A suspended bucket gets a scenario of its own too. A put there writes a
null version, which the delete addresses as a version even though the
master may be the only document holding it, so what removes the object is
the teardown of the placeholder left on that master -- a write the source
makes in no other case.

Issue: ZENKO-5355
Not for merge. Exercises ZKOP-562, BB-811 and DRCTL-83 end to end: the
@pra CTST run replicates cold objects through the mongo-processor rather
than the Kafka Connect mongo sink.

- backbeat 9.6.0-preview.4, released, which carries BB-811: the D/R
  processor mode, and the 'none' log source the sink's configuration
  sets; BB-853, which lets the sink omit the metrics block, came with
  9.6.0-preview.1
- zenko-operator 15643d73 (ZKOP-562: the sink deployment and the source
  pipeline that shapes the entries it reads), pinned as the bare commit
  its image is tagged with, since no 1.9 release carries it yet
- drctl v1.1.0-preview.1 (carries DRCTL-83, the objects topic on both D/R
  CRs, and the merged DRCTL-79 that sets the backbeat image on the sink;
  its vendor tree carries an operator new enough that the analytics section
  marshals as absent rather than as a null the apiserver rejects)

Only the operator is unreleased now: this becomes a plain operator bump
once ZKOP-562 ships.
@delthas
delthas force-pushed the wip/ZENKO-5355/pra-delete-and-overwrite-tests branch from 5e3698c to 39e942c Compare October 6, 2026 09:59
@delthas
delthas changed the base branch from improvement/ZENKO-5359/backbeat-configuration-overrides to improvement/ZENKO-5370 October 6, 2026 09:59
@francoisferrand
francoisferrand force-pushed the improvement/ZENKO-5370 branch 2 times, most recently from 0033600 to 5bcfd6d Compare October 8, 2026 06:17
Base automatically changed from improvement/ZENKO-5370 to development/2.16 October 8, 2026 18:07

@francoisferrand francoisferrand left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not ready (does not build, conflicts with HEAD) and can't be merged (wrong branch name)

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants