Skip to content

[Feature]: bundled Percona versions move with an NVSentinel release, unguarded and unannounced, and can skip a minor or roll the datastore #1797

Description

@lfriedman-netllama

Prerequisites

  • I searched existing issues
  • I can reproduce this issue

Summary

An NVSentinel release can move the bundled Percona versions, and nothing coordinates, validates or announces it. The result is that adopting a release can silently perform a Percona upgrade path that Percona forbids, and can silently roll the operator's replica set.

This is the structural version of #1737. That issue reported the bundled subcharts as internally mismatched (operator 1.23.0 against crVersion 1.21.1) and #1741 fixed it by aligning them, which was the right call. But for a deployment already running the old values, that alignment became an unannounced two-minor jump (1.21 -> 1.23), and Percona's own upgrade docs forbid skipping a minor. A correct consistency fix upstream turned into an unsupported upgrade downstream.

The mechanics

Four version knobs, all independent, with no coordinating input:

Value Location
operator image tag psmdb-operator.image.tag
crVersion psmdb-db.crVersion
mongod image tag psmdb-db.image.tag
init image tag psmdb-db.initImage.tag

Verified in the v1.22.0 chart: there is no psmdbVersion-style single input, and no template guard anywhere in charts/mongodb-store/ that validates these against each other.

Four consequences, each confirmed on a live 288-node GB200 cluster:

  1. A release bump moves three of the four at once, because they are subchart defaults.
  2. Two of them roll the replica set. Any change to a field in the PerconaServerMongoDB CR makes the operator run SmartUpdate over the whole replica set, and crVersion and initImage both live there. So a release adoption can include a datastore roll that appears nowhere in the release notes. We saw this concretely: a single added replication.oplogSizeMB restarted all three mongod pods.
  3. Operator/mongod compatibility is a real matrix and nothing checks it. From Percona's version service, operator 1.22.0 certifies mongod up to 8.0.19-7; 8.0.26-11 appears only from 1.23.0. A chart that paired operator 1.22 with mongod 8.0.26-11 would render happily and run an uncertified combination.
  4. The bundled psmdb version is not discoverable from the NVSentinel version. NVSentinel v1.22.0 bundles psmdb-db 1.23.0. The only way to know is to read the subchart's Chart.yaml inside the packaged tarball.

Separately, and quietly: leaving initImage unset lets the operator derive it, which can resolve to an unmirrored percona/percona-server-mongodb-operator:<crVersion> pulled from Docker Hub. On a mirror-only or air-gapped cluster that fails at pod start with no configuration having changed.

What it costs

To move one Percona minor safely on our cluster we ran a four-rung ladder: operator 1.21->1.22, then crVersion+initImage 1.21.1->1.22.0, then operator ->1.23, then crVersion+initImage ->1.23.0. Four PRs, two deliberate datastore rolls, and roughly a day, most of it spent establishing facts this issue is asking to be made explicit: which minor was reachable, which mongod each operator certifies, and which fields roll the datastore.

The two failure modes this creates:

  • For operators unaware of the coupling: adopting a release skips a Percona minor and rolls their datastore without warning. Neither is visible until something breaks, and the datastore holds every health event.
  • For operators who are aware: four pins to carry, a manual ladder per minor, and the pin set drifting further from the chart with every release deferred.

Requests, cheapest first

  1. Call out bundled-psmdb version changes in the release notes, explicitly stating that crVersion or initImage changing will roll the replica set. This alone removes most of the surprise, and chore: upgrade percona database #1741's release note is a good precedent, since it did carry an upgrade warning, which is how we caught this in time.
  2. Fail the render when the jump is unsupported. When the deployed crVersion is more than one minor behind the chart's operator version, refuse rather than proceed. There is good precedent for this pattern in the chart already: nvsentinel.pcAuth.enabled fails the render rather than guessing on a non-boolean.
  3. Expose one coordinated version input so operators pin a single value instead of four, and so the chart cannot ship an internally inconsistent set again. That would have prevented [Bug]: bundled psmdb subcharts are mismatched: operator 1.23.0 with crVersion 1.21.1, and the jump skips a Percona minor #1737 by construction.

Happy to take (1) or (2) as a PR if that helps. (2) in particular is a small named-template guard, and we have the deployed evidence to write a realistic test for it.

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions