Skip to content

Add direct-to-cold CTST scenarios - #2558

Draft
francoisferrand wants to merge 5 commits into
development/2.16from
improvement/ZENKO-5292-direct-to-cold-ctst
Draft

francoisferrand wants to merge 5 commits into
development/2.16from
improvement/ZENKO-5292-direct-to-cold-ctst

Conversation

@francoisferrand

Copy link
Copy Markdown
Contributor

End-to-end coverage for direct-to-cold (CLDSRV-917 / BB-786 / CLDSRV-956 / BB-804), now that the feature flag is enabled in 2.16.

New directToCold.feature exercises the full cloudserver → oplog → backbeat → Sorbet loop against the mock DMF:

  • PUT, MPU, CopyObject and self-copy with x-amz-storage-class: e2e-cold: the object reports the cold storage class and the transition-in-progress flag right away, stays readable while its data is still hot, then gets archived (flag cleared, data in DMF, GET → InvalidObjectState).
  • Bucket with an enabled transition rule: the bucket processor does not double-trigger, exactly one archive request is published per object.
  • Restore requested during the archive window: accepted and reported as ongoing, repeated request updates the pending days, actual restore initiated once the archive completes, then expires normally.
  • Failed transition (mock scal-fail-archive-job): lands in the DLQ with the flag preserved, sorbetctl retry bumps the attempt counter and re-publishes via the oplog.

Backbeat only tails the oplog of buckets with a transition rule (listenAllBuckets is off), so the scenarios set a disabled rule to the cold location and wait for the bucket to show up in the Kafka Connect pipeline before writing.

The first commit is a prerequisite cleanup: the DLQ consumer and the sorbetctl retry step were hardwired to the azure archive location's topics through the world parameters. Topics are now derived from the instance id, so the consumer covers every cold location.

Not covered: the paused-location case, which depends on SOR-271.

Validated with tsc, eslint, cucumber dry-run and unused-steps; not yet run against a live cluster.

Issue: ZENKO-5292

The dead letter consumer only read the azure archive location's topic, and
the sorbetctl retry step was wired to that same location through the world
parameters, which made both unusable for the other cold locations. Topics
are named after the instance id and the location, so the tests compute them
and the consumer covers every cold location's dead letter topic.

The sorbetctl step is reworded accordingly, as it retries every failed job
and not only restores.

Issue: ZENKO-5292
Cover the oplog-driven transition end to end: an object written with a cold
storage class (PUT, MPU, CopyObject, self-copy) is declared cold right away,
stays readable while its data is hot, and is archived by backbeat from the
oplog without a lifecycle scan. Also check that a bucket with an enabled
transition rule does not trigger the archive twice, that a restore requested
during the archive window is honoured once the archive completes, and that a
failed transition can be retried via sorbetctl with the attempt counter
bumped and the flag preserved.

Backbeat only tails the oplog of buckets with a transition rule, so the
scenarios set a disabled rule to the cold location and wait for the bucket
to show up in the connector pipeline before writing.

Issue: ZENKO-5292
@bert-e

bert-e commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Hello francoisferrand,

My role is to assist you with the merge of this
pull request. Please type @bert-e help to get information
on this process, or consult the user documentation.

Available options
name description privileged authored
/after_pull_request Wait for the given pull request id to be merged before continuing with the current one.
/bypass_author_approval Bypass the pull request author's approval ⭐
/bypass_build_status Bypass the build and test status ⭐
/bypass_commit_size Bypass the check on the size of the changeset TBA ⭐
/bypass_incompatible_branch Bypass the check on the source branch prefix ⭐
/bypass_jira_check Bypass the Jira issue check ⭐
/bypass_peer_approval Bypass the pull request peers' approval ⭐
/bypass_leader_approval Bypass the pull request leaders' approval ⭐
/bypass_source_branch_lineage Bypass the cross-branch contamination check ⭐
/approve Instruct Bert-E that the author has approved the pull request. ✍️
/create_pull_requests Allow the creation of integration pull requests.
/create_integration_branches Allow the creation of integration branches.
/no_octopus Prevent Wall-E from doing any octopus merge and use multiple consecutive merge instead
/unanimity Change review acceptance criteria from one reviewer at least to all reviewers
/wait Instruct Bert-E not to run until further notice.
Available commands
name description privileged
/help Print Bert-E's manual in the pull request.
/status Print Bert-E's current status in the pull request.
/clear Remove all comments from Bert-E from the history TBA
/retry Re-start a fresh build TBA
/build Re-start a fresh build TBA
/force_reset Delete integration branches & pull requests, and restart merge process from the beginning.
/reset Try to remove integration branches unless there are commits on them which do not appear on the source branch.

Status report is not available.

@bert-e

bert-e commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Incorrect fix version

The Fix Version/s in issue ZENKO-5292 contains:

  • None

Considering where you are trying to merge, I ignored possible hotfix versions and I expected to find:

  • 2.16.0

Please check the Fix Version/s of ZENKO-5292, or the target
branch of this pull request.

Comment thread tests/functional/ctst/features/directToCold.feature
The "archived once" direct-to-cold scenario sets an enabled transition
rule and writes right away. If the Kafka Connect pipeline does not tail
the bucket yet, the write is missed by the oplog path and the scenario
either passes without exercising it or flakes.

Both transition rule steps now wait for the bucket to show up in the
connector pipeline, which also makes the existing restore scenarios
more deterministic.

Issue: ZENKO-5292
Picks up the suspended cold requests handling from scality/sorbet#243
(SOR-271 + SOR-272): requests to a paused location are kept aside and
replayed once it is resumed, instead of being dropped or requeued in a
loop. Needed to cover the paused-location case of direct-to-cold.

Pinned to the PR head commit 86ea0a3a; to be replaced by the proper tag
once it is released.

Issue: ZENKO-5292
Comment thread solution/deps.yaml
dashboard: sorbet/sorbet-dashboards
image: sorbet
tag: v1.3.0
tag: 86ea0a3a252c8e61afdfdea3f64cf872466a277e

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorbet is pinned to a commit SHA build instead of a released tag. Release sorbet with the direct-to-cold support (BB-804 / SOR-*) and pin that tag before merging, so the 2.16 release doesn't ship a dev build.

With SOR-271/272, a direct-to-cold archive request reaching a paused
location is kept aside and sent again once the location is resumed,
instead of being dropped or bounced back through a transition retry. The
scenario checks the object stays awaiting its transition while paused,
is archived after the resume with a single replay of its request, and
that a write made after the resume is not held back by the backlog.

The lifecycle pause step now records the paused locations so they are
resumed when the scenario ends: cold storage scenarios share the
locations, and a failure before the resume would leave the next ones
stuck.

Issue: ZENKO-5292
@Dmf
@ColdStorage
@DirectToCold
Scenario Outline: Direct-to-cold write while the cold location is paused

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

The PR description says the paused-location case is not covered because it depends on SOR-271, but this scenario is here and tagged @PreMerge. If the pinned Sorbet build doesn't include SOR-271, it will fail in CI. Either confirm the pinned Sorbet build includes SOR-271 (and update the description), or remove/untag this scenario until it lands.

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.

2 participants